java更新 位置_请求位置信息更新 | Android 开发者 | Android Developers
適當地使用位置信息能夠為應用的用戶帶來好處。例如,如果應用要在用戶步行或駕車時幫助他們尋路,或者如果應用要跟蹤資產的位置,那么就需要定期獲取設備的位置信息。除了地理位置(緯度和經度)之外,您可能還需要向用戶提供其他信息,如設備的方位(水平行進方向)、高度或速度。一體化位置信息提供程序中檢索這些信息。作為響應,API 會根據 WLAN 和 GPS(全球定位系統)等當前可用的位置信息提供程序,以可用的最佳位置信息定期更新應用。位置信息的準確度由提供程序、您已請求的位置權限以及您在位置信息請求中設置的選項決定。
本課將介紹如何在一體化位置信息提供程序中使用 requestLocationUpdates() 方法請求對設備的位置信息進行定期更新。
獲取最近一次的已知位置
設備最近一次的已知位置提供了一個方便的起點,可確保應用在開始定期位置信息更新之前具有已知位置。獲取最近一次的已知位置一課將向您介紹如何通過調用 getLastLocation() 獲取最近一次的已知位置。下面幾部分中的代碼段假定您的應用已檢索到最近一次的已知位置,并將其作為 mCurrentLocation 中。
發出位置信息請求
在請求位置信息更新之前,應用必須連接到位置信息服務并發出位置信息請求。更改位置信息設置一課將向您介紹如何執行此操作。發出位置信息請求后,即可通過調用 requestLocationUpdates() 開始定期更新。
根據請求的形式,一體化位置信息提供程序要么調用 LocationCallback.onLocationResult() 回調方法并向其傳遞 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,該標志用于跟蹤用戶已開啟還是已關閉位置信息更新。如果用戶已關閉位置信息更新,您可以告知他們應用要求訪問位置信息。如需詳細了解如何在 Activity 實例間保留該布爾標記的值,請參閱保存 Activity 的狀態。
定義位置信息更新回調
一體化位置信息提供程序會調用 LocationCallback.onLocationResult() 回調方法。傳入參數包含 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
// ...
}
}
};
}
停止位置信息更新
您應考慮當 Activity 不再獲得焦點時(如當用戶切換到另一個應用或切換到同一應用中的另一個 Activity 時)是否要停止位置信息更新。這樣便于減少耗電量,前提是應用即使在后臺運行時也不需要收集信息。本部分介紹如何在 Activity 的
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 跟蹤當前是否開啟了位置信息更新。在 Activity 的
Kotlin
override fun onResume() {
super.onResume()
if (requestingLocationUpdates) startLocationUpdates()
}Java
@Override
protected void onResume() {
super.onResume();
if (requestingLocationUpdates) {
startLocationUpdates();
}
}
保存 Activity 的狀態
設備配置的更改(如屏幕方向或語言的更改)可能會導致當前 Activity 被銷毀。因此,應用必須存儲重新創建該 Activity 所需的所有信息。為了實現此目的,一種方法是使用存儲在
以下代碼示例展示了如何使用 Activity 的 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() 方法,以從上一個 Activity 實例恢復保存的值(如果有)。從 Activity 的
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 類參考文檔。
注意:為了實現更持久的存儲,您可以將用戶的偏好設置存儲在應用的 保存鍵值集。
其他資源
要了解詳情,請參考以下資源:
示例
總結
以上是生活随笔為你收集整理的java更新 位置_请求位置信息更新 | Android 开发者 | Android Developers的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java越权发送邮件_已登录用户 越权
- 下一篇: java防止表单二次提交_防止表单重复提