为了保护用户隐私,使用位置信息服务的应用必须请求位置权限。
请求位置权限时,请遵循与请求任何其他运行时权限相同的最佳做法。请求位置权限时的一个重要区别在于,系统中包含与位置相关的多项权限。具体请求哪项权限以及请求相关权限的方式取决于应用用例的位置信息要求。
本页介绍了不同类型的位置信息要求,并就如何在每种情况下请求位置权限提供了指导。
位置信息访问权限的类型
Android 的位置权限可处理以下类别的位置信息访问权限:
本部分介绍了应用使用每种类别的位置信息的情况。
前台位置信息
如果应用包含的功能仅分享或接收一次位置信息,或者只在一段指定时间内分享或接收位置信息,则该功能需要前台位置信息访问权限。以下是此类情况的一些示例:
- 在导航应用中,某项功能可让用户查询精细导航路线。
- 在即时通讯应用中,某项功能可让用户与其他用户分享自己目前所在的位置。
如果应用的功能在以下一种情况下访问设备的当前位置信息,系统就会认为应用需要使用前台位置信息:
- 属于应用的 Activity 可见。
应用正在运行前台服务。当前台服务在运行时,系统通过显示常驻通知提醒用户注意。当应用被置于后台时(例如当用户按设备上的主屏幕按钮或关闭设备的显示屏时),应用会保留访问权限。
此外,建议您声明
location
的前台服务类型,如以下代码段所示。在 Android 10(API 级别 29)及更高版本中,您必须声明此前台服务类型。<!-- Recommended for Android 9 (API level 28) and lower. --> <!-- Required for Android 10 (API level 29) and higher. --> <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) and higher. --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> </manifest>
在运行时请求位置信息访问权限
当应用中的功能需要位置信息访问权限时,请等到用户与该功能互动时再发出权限请求。本工作流遵循在上下文中请求运行时权限的最佳做法,如介绍如何请求应用权限的指南中所述。
图 1 举例说明了如何执行此过程。该应用包含一项“分享位置信息”功能,需要前台位置信息访问权限。不过,在用户选择分享位置信息按钮之前,应用不会请求位置权限。
即使应用中有多项功能需要位置信息访问权限,可能其中也只有部分功能需要后台位置信息访问权限。因此,建议应用对位置权限执行递增请求,先请求前台位置信息访问权限,再请求后台位置信息访问权限。执行递增请求可以为用户提供更大的控制权和透明度,因为他们可以更好地了解应用中的哪些功能需要后台位置信息访问权限。
图 2 显示了旨在处理递增请求的应用示例。“显示当前位置”和“推荐附近的地点”这两项功能都需要前台位置信息访问权限。不过,只有“推荐附近的地点”功能需要后台位置信息访问权限。
执行递增请求的过程如下所示:
-
首先,应用应该引导用户留意到需要前台位置信息访问权限的功能,例如图 1 中的“分享位置信息”功能或图 2 中的“显示当前位置”功能。
在应用有权访问前台位置信息之前,建议您停止让用户访问需要后台位置信息访问权限的功能。
-
稍后,等到用户摸索需要后台位置信息访问权限的功能时,您可以届时再请求在后台访问位置信息的权限。
请求在后台访问位置信息
在搭载 Android 10(API 级别 29)的设备上,您的应用中的某项功能请求在后台访问位置信息时,系统权限对话框包含一个名为始终允许的选项。如果用户选择此选项,您的应用中的相应功能就会获得在后台访问位置信息的权限。
但是,在 Android 11(API 级别 30)及更高版本中,系统对话框不含始终允许选项。相反,用户必须在设置页面上启用后台位置信息,如图 3 所示。
请求在后台访问位置信息的权限时,您可以遵循最佳做法,帮助用户导航到此设置页面。授予权限的过程取决于应用的目标 SDK 版本。
以 Android 11 或更高版本为目标平台的应用
如果您的应用尚未获得 ACCESS_BACKGROUND_LOCATION
权限并且 shouldShowRequestPermissionRationale()
返回 true
,请向用户显示包含以下内容的指导界面:
- 明确说明应用功能需要在后台访问位置信息的原因。
- 用于授予后台位置信息访问权限的设置选项(例如,图 3 中的始终允许)的用户可见标签。您可以调用
getBackgroundPermissionOptionLabel()
获取此标签。此方法的返回值会根据用户设备的语言偏好设置进行本地化。 - 供用户拒绝授予权限的选项。如果用户拒绝应用在后台访问位置信息,他们应该能够继续使用应用。
以 Android 10 或更低版本为目标平台的应用
当应用中的某项功能请求后台位置信息访问权限时,用户会看到一个系统对话框。此对话框包含一个选项,可用于导航到设置页面上的应用位置权限选项。
只要您的应用已遵循有关请求位置权限的最佳做法,您无需做出任何更改即可支持此行为。
后台位置信息授权提醒
在 Android 10 及更高版本中,当应用中的功能在用户授予后台位置信息访问权限后首次在后台访问设备位置信息时,系统会安排向用户发送一条通知。此通知旨在提醒用户他们已允许应用始终有权访问设备位置信息。示例通知如图 4 所示。
其他资源
如需详细了解 Android 中的位置权限,请查看以下资料: