[Android][開發相關][定位] Android 一打開 App 就要取得現在定位的方法。


Android 的定位方法,之前也讓我很迷惑。

如果我們要在打開 App 的一瞬間,就取得使用者的位置。

一般在網路上查到的,要不就是 getLastKnownLocation ,要不就是利用 LocationListener
可是這兩個方法都有其缺點。
利用 getLastKnownLocation 有可能取到的是很久之前的定位。所以有可能一打開 App 的時候,使用者已經離開他上一次有取得定位的位置很遠了,這樣一來完全取不到正確的現在位置。

利用 LocationListener 的話,會利用裡面的 onLocationChange 方法,這個方法的缺點是 Location 一定要 Change 才會作動。所以使用者如果是在室內,利用 Wifi 定位或者是附近的 3G / 4G 基地台定位,那有可能因為 Wifi AP 是在固定的位置,所以都不會改動位置,導致 onLocationChange 不會被觸發。

目前,最好的方法,是利用

import com.google.android.gms.common.api.GoogleApiClient;


寫法大致上是這樣,這個 Activity 要先實作
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener
這兩個介面。

然後你要在  Activity 當中宣告這兩個成員變數
GoogleApiClient mGoogleApiClient;
Location mLastLocation;

接下來在 onCreate 當中把 mGoogleApiClient 這個成員變數建立起來

if (mGoogleApiClient == null) {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
}

接下來在 onStart() 的時候連結服務

mGoogleApiClient.connect();

最後,當連結到的時候,用以下的程式碼取用。

@Overridepublic void onConnected(@Nullable Bundle bundle) {
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (ContextCompat.checkSelfPermission(this,
                android.Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            return;
        }
    }

    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
            mGoogleApiClient);
    if (mLastLocation != null)
    {
// 取到手機地點後的程式碼
    }

}

這樣就可以取到手機現在的位置了。

另外,別忘記了,在 onStop() 的時候要把服務斷掉。

@Overrideprotected void onStop() {
    super.onPause();
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (ContextCompat.checkSelfPermission(this,
                android.Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            return;
        }
    }
    mGoogleApiClient.disconnect();

}

這就是取得手機定位的方法。
中間有一些有關  Android 6 定位權限的程式碼,我就不在這篇文章撰述了。


0 Response to "[Android][開發相關][定位] Android 一打開 App 就要取得現在定位的方法。"