请求位置权限

为了保护用户隐私,使用位置信息服务的应用必须请求位置权限。

请求位置权限时,请遵循与请求任何其他运行时权限相同的最佳做法。请求位置权限时的一个重要区别在于,系统中包含与位置相关的多项权限。具体请求哪项权限以及请求相关权限的方式取决于应用用例的位置信息要求。

本页介绍了不同类型的位置信息要求,并就如何在每种情况下请求位置权限提供了指导。

位置信息访问权限的类型

Android 的位置权限可处理以下类别的位置信息访问权限:

本部分介绍了应用使用每种类别的位置信息的情况。

前台位置信息

如果应用包含的功能仅分享或接收一次位置信息,或者只在一段指定时间内分享或接收位置信息,则该功能需要前台位置信息访问权限。以下是此类情况的一些示例:

  • 在导航应用中,某项功能可让用户查询精细导航路线。
  • 在即时通讯应用中,某项功能可让用户与其他用户分享自己目前所在的位置。

如果应用的功能在以下一种情况下访问设备的当前位置信息,系统就会认为应用需要使用前台位置信息:

  • 属于应用的 Activity 可见。
  • 应用正在运行前台服务。当前台服务在运行时,系统通过显示常驻通知提醒用户注意。当应用被置于后台时(例如当用户按设备上的主屏幕按钮或关闭设备的显示屏时),应用会保留访问权限。

    此外,建议您声明 location前台服务类型,如以下代码段所示。在 Android 10(API 级别 29)中,您必须声明此前台服务类型。

    <!-- Recommended for Android 9 (API level 28) and lower. -->
    <!-- Required for Android 10 (API level 29). -->
    <service
        android:name="MyNavigationService"
        android:foregroundServiceType="location" ... >
        <!-- Any inner elements would go here. -->
    </service>
    

当应用请求 ACCESS_COARSE_LOCATION 权限或 ACCESS_FINE_LOCATION 权限时(如以下代码段所示),就是在声明需要获取前台位置信息:

<manifest ... >
  <!-- To request foreground location access, declare one of these permissions. -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

精确度级别取决于您请求的具体权限:

ACCESS_COARSE_LOCATION
提供城市街区级别的位置信息精确度。
ACCESS_FINE_LOCATION
提供的位置信息比请求 ACCESS_COARSE_LOCATION 时所提供的位置信息更准确。这是某些连接任务(例如通过蓝牙低功耗 (BLE) 连接到附近的设备)所必需的权限。

后台位置信息

如果应用中的某项功能会不断与其他用户分享位置信息或使用 Geofencing API,则该应用需要后台位置信息访问权限。以下是此类情况的几个示例:

  • 在家庭位置信息分享应用中,某项功能可让用户与家庭成员持续分享位置信息。
  • 在 IoT 应用中,某项功能可让用户配置自己的家居设备,使其在用户离家时关机并在用户回家时重新开机。

除了前台位置信息部分所述的情况之外,如果应用在任何其他情况下访问设备的当前位置信息,系统就会认为应用需要使用后台位置信息。

在 Android 10(API 级别 29)中,您必须在应用的清单中声明 ACCESS_BACKGROUND_LOCATION 权限,以便请求在运行时于后台访问位置信息。在较低版本的 Android 系统中,当应用获得前台位置信息访问权限时,也会自动获得后台位置信息访问权限。

<manifest ... >
  <!-- Required only when requesting background location access on
       Android 10 (API level 29). -->
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>

在运行时请求位置信息访问权限

当应用中的功能需要位置信息访问权限时,请等到用户与该功能互动时再发出权限请求。本工作流遵循在上下文中请求运行时权限的最佳做法,如介绍如何请求应用权限的指南中所述。

图 1 举例说明了如何执行此过程。该应用包含一项“分享位置信息”功能,需要前台位置信息访问权限。不过,在用户选择分享位置信息按钮之前,应用不会请求位置权限。

在用户选择“分享位置信息”按钮后,系统显示位置权限对话框
图 1. 需要前台位置信息访问权限的位置信息分享功能。如果用户选择仅在使用该应用时允许,系统就会启用该功能。

即使应用中有多项功能需要位置信息访问权限,可能其中也只有部分功能需要后台位置信息访问权限。因此,建议应用对位置权限执行递增请求,先请求前台位置信息访问权限,再请求后台位置信息访问权限。执行递增请求可以为用户提供更大的控制权和透明度,因为他们可以更好地了解应用中的哪些功能需要后台位置信息访问权限。

图 2 显示了旨在处理递增请求的应用示例。“显示当前位置”和“推荐附近的地点”这两项功能都需要前台位置信息访问权限。不过,只有“推荐附近的地点”功能需要后台位置信息访问权限。

启用前台位置信息访问权限的按钮与启用后台位置信息访问权限的按钮相距半个屏幕之远
图 2. 这两项功能都需要位置信息访问权限,但只有“推荐附近的地点”功能需要后台位置信息访问权限。

执行递增请求的过程如下所示:

  1. 首先,应用应该引导用户留意到需要前台位置信息访问权限的功能,例如图 1 中的“分享位置信息”功能或图 2 中的“显示当前位置”功能。

    在应用有权访问前台位置信息之前,建议您停止让用户访问需要后台位置信息访问权限的功能。

  2. 对话框包含用于授予后台位置信息访问权限或保留前台位置信息访问权限的选项
    图 3. 假定应用已被授予前台位置信息访问权限,当应用请求后台位置信息访问权限时,系统会显示此对话框。

    稍后,等到用户摸索需要后台位置信息访问权限的功能时,您可以届时再请求后台位置信息访问权限。系统会显示一个类似于图 3 所示画面的对话框。

    当应用中的功能在用户授予后台位置访问权限后首次在后台访问设备位置信息时,系统会安排向用户发送通知。此通知旨在提醒用户他们已允许应用始终有权访问设备位置信息。示例通知如图 4 所示。

    用户可以通过点按系统通知来更改应用的位置信息设置
    图 4. 提醒用户他们已授予应用后台位置信息访问权限的通知。