获取最后已知位置

使用 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 中获取当前位置,请查看以下资料:

示例

  • 用于演示在获取当前位置信息时的最佳实践的示例应用