获取最后已知位置

使用 Google Play 服务位置 API,您的应用可以请求用户设备的最后已知位置。在大多数情况下,您感兴趣的是用户的当前位置,这通常等同于设备的最后已知位置。

具体来说,可以使用 融合位置提供程序 来检索设备的最后已知位置。融合位置提供程序是 Google Play 服务中的位置 API 之一。它管理底层位置技术,并提供简单的 API,以便您可以高水平地指定需求,例如高精度或低功耗。它还优化了设备的电池使用情况。

注意:当您的应用在后台运行时,访问位置 应该对应用的核心功能至关重要,并应向用户妥善披露。

本课程将向您展示如何使用融合位置提供程序中的 getLastLocation() 方法对设备位置发出单个请求。

设置 Google Play 服务

要访问融合位置提供程序,您的应用开发项目必须包含 Google Play 服务。通过 SDK 管理器 下载并安装 Google Play 服务组件,并将库添加到您的项目中。有关详情,请参阅有关 设置 Google Play 服务 的指南。

指定应用权限

其功能使用位置服务的应用必须 请求位置权限,具体取决于这些功能的用例。

创建位置服务客户端

在您的活动的 onCreate() 方法中,创建融合位置提供程序客户端的实例,如下面的代码片段所示。

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);
}

获取最后已知位置

创建位置服务客户端后,您可以获取用户设备的最后已知位置。连接到这些客户端后,您可以使用融合位置提供程序的 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,您可以使用它来获取一个带有地理位置的经纬度坐标的 Location 对象。在以下情况下,位置对象可能为 null

  • 在设备设置中关闭了位置。即使之前已检索到最后位置,结果也可能是 null,因为禁用位置还会清除缓存。
  • 设备从未记录其位置,这可能是新设备或已恢复出厂设置的设备的情况。
  • 设备上的 Google Play 服务已重新启动,并且没有主动的融合位置提供程序客户端在服务重新启动后请求位置。为避免这种情况,您可以创建一个新客户端并自行请求位置更新。有关更多信息,请参阅 接收位置更新

选择最佳位置估算

FusedLocationProviderClient 提供多种方法来检索设备位置信息。根据您的应用用例选择以下方法之一。

  • getLastLocation() 可以更快地获取位置估算值,并最大限度地减少可归因于您的应用的电池消耗。但是,如果最近没有其他客户端积极使用位置,则位置信息可能已过期。
  • getCurrentLocation() 可以更一致地获取更新、更准确的位置。但是,此方法可能会导致设备上发生主动位置计算。

    这是尽可能获取最新位置的推荐方法,比使用requestLocationUpdates()自行启动和管理位置更新等替代方法更安全。如果您的应用调用requestLocationUpdates(),如果位置不可用,或者在获取最新位置后未正确停止请求,则您的应用有时可能会消耗大量电量。

其他资源

有关在 Android 中获取当前位置的更多信息,请查看以下资料

示例

  • 示例应用 演示了获取当前位置时的最佳实践。