使用 Google Play 服务位置信息 API,您的应用可以请求用户设备的最后已知位置。在大多数情况下,您对用户的当前位置感兴趣,这通常等同于设备的最后已知位置。
具体而言,使用融合位置信息提供程序来检索设备的最后已知位置。融合位置信息提供程序是 Google Play 服务中的位置信息 API 之一。它管理底层位置信息技术,并提供一个简单的 API,以便您可以在较高层级指定要求,例如高准确度或低功耗。它还会优化设备的电池电量使用。
注意:当您的应用在后台运行时,对位置信息的访问应对应用的核心功能至关重要,并且必须伴随对用户的适当披露。
本课程将介绍如何使用融合位置信息提供程序中的 getLastLocation()
方法对设备位置信息发出单次请求。
设置 Google Play 服务
要访问融合位置信息提供程序,您的应用开发项目必须包含 Google Play 服务。通过 SDK 管理器下载并安装 Google Play 服务组件,然后将该库添加到您的项目。如需了解详情,请参阅设置 Google Play 服务指南。
指定应用权限
其功能使用位置信息服务的应用必须请求位置信息权限,具体取决于这些功能的用例。
创建位置信息服务客户端
在您 activity 的 onCreate()
方法中,创建一个 Fused Location Provider Client 实例,如下面的代码片段所示。
Kotlin
private lateinit var fusedLocationClient: FusedLocationProviderClient override fun onCreate(savedInstanceState: Bundle?) { // ... fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) }
Java
private FusedLocationProviderClient fusedLocationClient; // .. @Override protected void onCreate(Bundle savedInstanceState) { // ... fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); }
获取最后已知位置
创建 Location Services 客户端后,即可获取用户设备的最后已知位置。当您的应用连接到这些服务后,即可使用融合位置信息提供程序的 getLastLocation()
方法来检索设备位置信息。此调用返回的位置信息的精确度取决于您在应用清单中设置的权限,如请求位置信息权限指南中所述。
如需请求最后已知位置,请调用 getLastLocation()
方法。以下代码片段演示了请求和响应的简单处理方式:
Kotlin
fusedLocationClient.lastLocation .addOnSuccessListener { location : Location? -> // Got last known location. In some rare situations this can be null. }
Java
fusedLocationClient.getLastLocation() .addOnSuccessListener(this, new OnSuccessListener<Location>() { @Override public void onSuccess(Location location) { // Got last known location. In some rare situations this can be null. if (location != null) { // Logic to handle location object } } });
getLastLocation()
方法会返回一个 Task
,您可以使用该 Task 获取带有地理位置的经纬度坐标的 Location
对象。在以下情况下,位置信息对象可能为 null
:
- 设备设置中关闭了位置信息。即使之前检索过最后已知位置,结果也可能为
null
,因为停用位置信息也会清除缓存。 - 设备从未记录其位置,对于新设备或已恢复出厂设置的设备来说可能出现这种情况。
- 设备上的 Google Play 服务已重启,并且在服务重启后没有活动的 Fused Location Provider 客户端请求位置信息。为了避免这种情况,您可以创建一个新的客户端并自行请求位置信息更新。如需了解详情,请参阅请求位置信息更新。
选择最佳位置估算值
FusedLocationProviderClient
提供了几种检索设备位置信息的方法。您可以根据应用的使用场景选择以下方法之一:
getLastLocation()
可更快地获取位置估算值,并最大限度地降低应用造成的电池用量。但是,如果最近没有其他客户端 actively 使用位置信息,则位置信息可能会过时。getCurrentLocation()
可以更稳定地获取更新、更准确的位置信息。但是,此方法可能会导致设备上发生主动的位置计算在可能的情况下,这是获取新位置信息的推荐方法,并且比使用
requestLocationUpdates()
自行启动和管理位置信息更新等替代方法更安全。如果您的应用调用requestLocationUpdates()
,并且位置信息不可用,或者在获取新位置信息后请求未正确停止,您的应用有时可能会消耗大量电量。
更多资源
如需详细了解如何在 Android 中获取当前位置,请查看以下资料:
示例
- 用于演示在获取当前位置信息时的最佳实践的示例应用。