获取最后已知位置

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

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

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

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

设置 Google Play 服务

要访问融合位置提供程序,您的应用的开发项目必须包含 Google Play 服务。通过 SDK Manager 下载并安装 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 中获取当前位置的更多信息,请查看以下资料。

示例