获取最近一次的已知位置

使用 Google Play 服务地理位置 API,您的应用可以请求用户设备的最近一次的已知位置。在大多数情况下,您感兴趣的是用户的当前位置,通常也就是设备的最近一次的已知位置。

具体来说,使用一体化位置信息提供程序来检索设备的最近一次的已知位置。一体化位置信息是 Google Play 服务中的其中一个地理位置 API。它负责管理底层位置技术,并提供一个简单的 API,以便您指定高级别要求,例如准确度高或能耗低。它还可以优化设备的电池电量消耗。

注意:在搭载 Android 8.0(API 级别 26)及更高版本的设备上,如果应用正在后台运行并请求当前位置信息,则设备每小时仅计算几次位置信息。要了解如何让应用适应这些计算限制,请参阅后台位置信息限制

本课向您介绍如何在一体化位置信息提供程序中使用 getLastLocation() 方法来发出单个用于获取设备位置信息的请求。

设置 Google Play 服务

要访问一体化位置信息提供程序,您的应用开发项目必须包含 Google Play 服务。通过 SDK 管理器下载 Google Play 服务组件并进行安装,然后将内容库添加至您的项目。有关详情,请参阅关于设置 Google Play 服务的指南。

指定应用权限

使用位置信息服务的应用必须请求位置信息权限。Android 提供以下位置权限:

要访问设备的位置信息,需要请求 ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION。您选择的权限决定了 API 返回的位置信息的准确性。如果您指定了 ACCESS_COARSE_LOCATION,则 API 会返回大致相当于一个城市街区的准确位置信息。

如果您的目标平台是 Android 10(API 级别 29)或更高版本,并且需要在应用运行于后台时访问设备位置,则还必须声明 ACCESS_BACKGROUND_LOCATION 权限。要了解详情,请参阅关于如何接收定期位置信息更新的指南。

本课只要求获取粗略位置信息。在应用清单中使用 uses-permission 元素请求该权限,如以下代码段所示:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.google.android.gms.location.sample.basiclocationsample" >

      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    </manifest>
    

创建位置信息服务客户端

在 Activity 的 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 服务已经重启,且在服务重启后,没有已请求位置信息的活跃一体化位置信息提供程序客户端。为避免这种情况,您可以创建新客户端并自行请求位置信息更新。有关详情,请参阅接收位置信息更新