android更新位置,请求位置信息更新  |  Android 开发者  |  Android Developers

本文介绍了如何在Android应用中使用requestLocationUpdates()方法来定期获取设备的位置信息。首先,通过getLastLocation()获取设备的最新位置,然后连接到位置信息服务并发出位置信息请求。接着,定义LocationCallback回调以处理位置更新,并在Activity状态改变时适当地启动和停止更新。此外,还强调了保存Activity状态的重要性,以便在配置更改后恢复位置更新设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适当地使用位置信息能够为应用的用户带来好处。例如,如果应用要在用户步行或驾车时帮助他们寻路,或者如果应用要跟踪资产的位置,那么就需要定期获取设备的位置信息。除了地理位置(纬度和经度)之外,您可能还需要向用户提供其他信息,如设备的方位(水平行进方向)、高度或速度。一体化位置信息提供程序中检索这些信息。作为响应,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 类参考文档。

注意:为了实现更持久的存储,您可以将用户的偏好设置存储在应用的 保存键值集。

其他资源

要了解详情,请参考以下资源:

示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值