请求位置权限

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

有多个与位置信息相关的权限。请求哪些权限以及如何请求取决于应用用例的位置信息要求。

本页面介绍了不同类型的位置信息要求,并说明了如何在每种情况下请求位置权限。

要请求位置权限,请遵循所有运行时权限的最佳实践。

位置信息访问类型

每个权限都具有以下特征的组合

前台位置信息

如果您的应用包含某项功能,仅分享或接收一次位置信息,或在特定时间内分享或接收位置信息,则该功能需要前台位置信息访问权限。示例如下:

  • 在导航应用中,某项功能允许用户获取逐向导航。
  • 在消息应用中,某项功能允许用户与另一位用户分享当前位置信息。

如果您应用的某项功能在以下任一情况下访问设备的当前位置信息,系统会认为您的应用正在使用前台位置信息:

  • 属于您应用的 Activity 可见。
  • 您的应用正在运行前台服务。前台服务运行时,系统会通过显示持久性通知来提高用户感知度。当应用转到后台时(例如,用户按下设备的主屏幕按钮或关闭设备的显示屏时),您的应用仍会保留访问权限。

    此外,您应声明 foreground service typelocation,如以下代码段所示。在 Android 10(API 级别 29)及更高版本中,您必须声明此 foreground service type。

    <!-- 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 ... >
  <!-- Always include this permission -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <!-- Include only if your app benefits from precise location access. -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

后台位置信息

如果应用内的某项功能持续与其他用户分享位置信息或使用 地理围栏 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>

精确度

Android 支持以下位置信息精确度级别

大概
提供设备位置信息估算值。如果此位置信息估算值来自 LocationManagerServiceFusedLocationProvider,则该估算值精确到约 3 平方公里(约 1.2 平方英里)以内。当您声明 ACCESS_COARSE_LOCATION 权限但未声明 ACCESS_FINE_LOCATION 权限时,您的应用可以接收此精确度级别的位置信息。
精确
提供尽可能精确的设备位置信息估算值。如果该位置信息估算值来自 LocationManagerServiceFusedLocationProvider,则该估算值通常精确到约 50 米(160 英尺)以内,有时甚至可以精确到几米(10 英尺)以内或更高。当您声明 ACCESS_FINE_LOCATION 权限时,您的应用可以接收此精确度级别的位置信息。

如果用户授予大概位置权限,则无论您的应用声明了哪些位置权限,您的应用都只能访问大概位置信息。

当用户仅授予大概位置信息访问权限时,您的应用应仍能正常工作。如果您应用的某项功能绝对需要使用 ACCESS_FINE_LOCATION 权限来访问精确位置信息,您可以请求用户允许您的应用访问精确位置信息

后台位置信息授权提醒

在 Android 10(API 级别 29)及更高版本中,当您应用的某项功能在用户授予后台位置信息访问权限后,首次在后台访问设备位置信息时,系统会安排向用户发送一条通知。此通知会提醒用户,他们已允许您的应用始终访问设备位置信息。图 8 显示了一个通知示例。

检查应用 SDK 依赖项中的位置信息要求

检查您的应用是否使用了依赖于位置权限(尤其是 ACCESS_FINE_LOCATION 权限)的任何 SDK。如需了解详情,请阅读 Medium 上的博文 了解您的 SDK 依赖项行为

其他资源

如需详细了解 Android 中的位置权限,请参阅以下资料:

Codelabs

视频

示例