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 就要取得現在定位的方法。"
張貼留言