適當地使用位置資訊,可能對
應用程式。舉例來說,如果您的應用程式協助使用者在步行或行走時規劃路線,
或應用程式追蹤資產位置,則應用程式必須取得
定期的裝置位置。還有地理位置
地點 (經緯度) 時,建議您進一步為使用者提供
資訊,例如方位 (行進的水平方向)、高度或
裝置的速率如需更多資訊,請參閱
Location
應用程式可從
融合式
位置提供者。作為回應,API 會定期以
根據目前所在位置找出最準確的地點
Wi-Fi 和 GPS (全球定位系統) 等服務供應商。更準確的
位置則是由供應商決定
你已授予的位置存取權
要求,以及您在位置資訊要求中設定的選項。
本課程將說明如何要求定期更新裝置的
使用
requestLocationUpdates()
敬上
方法。
取得最後已知位置
裝置的最後已知位置是個方便的基地,可於
請先確定應用程式已含已知位置,再開始
定期更新位置資訊。
取得最後已知位置:
如何撥打電話取得最後已知位置?
getLastLocation()
。
以下章節的程式碼片段假設您的應用程式已
已擷取最後已知位置並儲存為
全域變數中的 Location
物件
mCurrentLocation
。
提出位置資訊要求
應用程式必須先連線至位置資訊,才能要求位置更新通知
並提出位置資訊要求
變更位置資訊設定
中示範了具體做法提出位置資訊要求後,即可開始使用
可以呼叫
requestLocationUpdates()
。
根據要求格式,整合式位置預測提供工具
會叫用
LocationCallback.onLocationResult()
敬上
並傳遞 Location
物件清單給這個方法
發行
PendingIntent
,在其延伸資料中包含該位置。此外,資料的準確率與頻率
更新項目會受到您要求的位置存取權
您在位置資訊要求物件中設定的選項。
本課程將說明如何使用
LocationCallback
敬上
回呼方法。致電
requestLocationUpdates()
、
並向其傳送
LocationRequest
。
物件
和 LocationCallback
。
請定義 startLocationUpdates()
方法,如以下程式碼範例所示:
Kotlin
override fun onResume() { super.onResume() if (requestingLocationUpdates) startLocationUpdates() } private fun startLocationUpdates() { fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper()) }
Java
@Override protected void onResume() { super.onResume(); if (requestingLocationUpdates) { startLocationUpdates(); } } private void startLocationUpdates() { fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper()); }
請注意,上述程式碼片段參照的是布林值標記
requestingLocationUpdates
,用於追蹤使用者是否已開啟定位功能
開啟或關閉更新。如果使用者關閉了位置更新功能,您可以通知
指出應用程式的地理位置規定。適用對象
進一步瞭解如何在
請參閱「儲存活動狀態」。
定義位置更新通知的回呼
整合式位置預測提供工具會叫用
LocationCallback.onLocationResult()
敬上
回呼方法。傳入的引數包含 Location
清單
物件,內含位置的經緯度。下列程式碼片段
會說明如何在
LocationCallback
敬上
並定義 方法,然後取得位置更新的時間戳記
並在應用程式使用者上顯示經緯度
介面:
Kotlin
private lateinit var locationCallback: LocationCallback // ... override fun onCreate(savedInstanceState: Bundle?) { // ... locationCallback = object : LocationCallback() { override fun onLocationResult(locationResult: LocationResult?) { locationResult ?: return for (location in locationResult.locations){ // Update UI with location data // ... } } } }
Java
private LocationCallback locationCallback; // ... @Override protected void onCreate(Bundle savedInstanceState) { // ... locationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { if (locationResult == null) { return; } for (Location location : locationResult.getLocations()) { // Update UI with location data // ... } } }; }
停止位置更新通知
考慮是否要在活動發生時停止位置更新通知
使用者就會失去焦點,例如使用者切換至其他應用程式
同一個應用程式中的不同活動。有效降低耗電量
前提是應用程式不需收集
它會在背景執行本節說明如何停止
活動的
onPause()
方法。
如要停止位置更新通知,請撥打
removeLocationUpdates()
、
傳送
LocationCallback
,
如以下程式碼範例所示:
Kotlin
override fun onPause() { super.onPause() stopLocationUpdates() } private fun stopLocationUpdates() { fusedLocationClient.removeLocationUpdates(locationCallback) }
Java
@Override protected void onPause() { super.onPause(); stopLocationUpdates(); } private void stopLocationUpdates() { fusedLocationClient.removeLocationUpdates(locationCallback); }
使用布林值 requestingLocationUpdates
追蹤
是否開啟位置更新功能。在活動的
onResume()
方法,請檢查
是否正在啟用位置更新功能;如果沒有,請啟用:
Kotlin
override fun onResume() { super.onResume() if (requestingLocationUpdates) startLocationUpdates() }
Java
@Override protected void onResume() { super.onResume(); if (requestingLocationUpdates) { startLocationUpdates(); } }
儲存活動狀態
變更裝置設定,例如畫面變更
方向或語言,可能會導致目前活動遭到刪除。您的
因此,應用程式必須儲存重建活動所需的任何資訊。
其中一個做法是透過儲存於
Bundle
物件。
以下程式碼範例說明如何使用活動的
onSaveInstanceState()
敬上
儲存實例狀態的回呼:
Kotlin
override fun onSaveInstanceState(outState: Bundle?) { outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates) super.onSaveInstanceState(outState) }
Java
@Override protected void onSaveInstanceState(Bundle outState) { outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates); // ... super.onSaveInstanceState(outState); }
定義要還原的 updateValuesFromBundle()
方法
也就是上一個活動例項中儲存的值 (如果有的話)
廣告。從活動的
onCreate()
方法,如
請看以下程式碼範例:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { // ... updateValuesFromBundle(savedInstanceState) } private fun updateValuesFromBundle(savedInstanceState: Bundle?) { savedInstanceState ?: return // Update the value of requestingLocationUpdates from the Bundle. if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) { requestingLocationUpdates = savedInstanceState.getBoolean( REQUESTING_LOCATION_UPDATES_KEY) } // ... // Update UI to match restored state updateUI() }
Java
@Override public void onCreate(Bundle savedInstanceState) { // ... updateValuesFromBundle(savedInstanceState); } private void updateValuesFromBundle(Bundle savedInstanceState) { if (savedInstanceState == null) { return; } // Update the value of requestingLocationUpdates from the Bundle. if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) { requestingLocationUpdates = savedInstanceState.getBoolean( REQUESTING_LOCATION_UPDATES_KEY); } // ... // Update UI to match restored state updateUI(); }
如要進一步瞭解如何儲存執行個體狀態,請參閱 Android Activity 類別參考資料。
注意:如要增加永久儲存空間,您可以
將使用者偏好設定儲存在應用程式的
SharedPreferences
。將共用偏好設定設為
活動的 onPause()
方法,以及
擷取 onResume()
中的偏好設定。
如要進一步瞭解如何儲存偏好設定,請參閱
儲存中
鍵/值組合
其他資源
如需瞭解更多資訊,不妨參考以下資源:
範例
- 範例應用程式,示範如何在 Android 中接收位置更新資訊。