Android 上的权限

应用权限通过保护对以下内容的访问来帮助支持用户隐私

  • 受限数据,例如系统状态和用户联系信息
  • 受限操作,例如连接到配对设备和录制音频

本页概述了 Android 权限的工作原理,包括使用权限的高级工作流、不同类型权限的说明,以及在应用中使用权限的一些最佳实践。其他页面解释了如何最大限度地减少应用对权限的请求声明权限请求运行时权限以及限制其他应用与您的应用组件交互的方式。

要查看 Android 应用权限的完整列表,请访问权限 API 参考页面

要查看演示权限工作流的一些示例应用,请访问 GitHub 上的Android 权限示例代码库

使用权限的工作流

如果您的应用提供可能需要访问受限数据或执行受限功能的功能,请确定您是否可以在无需声明权限的情况下获取信息或执行操作。您可以在应用中满足许多用例,例如拍照、暂停媒体播放和显示相关广告,而无需声明任何权限。

如果您确定您的应用必须访问受限数据或执行受限操作才能满足某个用例,请声明相应的权限。某些权限(称为安装时权限)在您的应用安装时会自动授予。其他权限(称为运行时权限)则要求您的应用进一步在运行时请求权限。

图 1 说明了使用应用权限的工作流

图 1. Android 上使用权限的高级工作流。

权限类型

Android 将权限分为不同类型,包括安装时权限、运行时权限和特殊权限。每种权限类型都指示了当系统授予您的应用该权限时,您的应用可以访问的受限数据范围以及可以执行的受限操作范围。每种权限的保护级别基于其类型,并显示在权限 API 参考页面上。

安装时权限

The left image shows a list of an app's install-time permissions. The
    right image shows a pop-up dialog that contains 2 options: allow and deny.
图 2. 应用的安装时权限列表,显示在应用商店中。

安装时权限赋予您的应用对受限数据的有限访问权限,或允许您的应用执行对系统或其他应用影响最小的受限操作。当您在应用中声明安装时权限时,应用商店会在用户查看应用详情页面时向其显示安装时权限通知,如图 2 所示。当用户安装您的应用时,系统会自动授予您的应用这些权限。

Android 包含几种安装时权限的子类型,包括普通权限和签名权限。

普通权限

这些权限允许访问超出您应用沙盒的数据和操作,但对用户隐私和其他应用的运行风险很小。

系统将 normal 保护级别分配给普通权限。

签名权限

系统仅当应用与定义权限的应用或操作系统使用相同证书签名时,才向应用授予签名权限。

实现特权服务(例如自动填充或 VPN 服务)的应用也使用签名权限。这些应用需要服务绑定签名权限,以便只有系统才能绑定到这些服务。

系统将 signature 保护级别分配给签名权限。

运行时权限

A pop-up dialog that contains 2 options: allow and deny.
图 3. 您的应用请求运行时权限时出现的系统权限提示。

运行时权限(也称为危险权限)赋予您的应用对受限数据的额外访问权限,或允许您的应用执行对系统和其他应用影响更大的受限操作。因此,您需要在应用中请求运行时权限,然后才能访问受限数据或执行受限操作。不要假设这些权限已事先授予—每次访问前请检查它们,并在需要时请求它们。

当您的应用请求运行时权限时,系统会显示一个运行时权限提示,如图 3 所示。

许多运行时权限会访问用户私人数据,这是一种特殊类型的受限数据,其中包含可能敏感的信息。用户私人数据的示例包括位置和联系信息。

麦克风和相机提供对特别敏感信息的访问权限。因此,系统会帮助您解释您的应用访问此信息的原因

系统将 dangerous 保护级别分配给运行时权限。

特殊权限

特殊权限对应于特定的应用操作。只有平台和原始设备制造商 (OEM) 可以定义特殊权限。此外,当平台和原始设备制造商希望保护对特别强大操作(例如在其他应用上绘图)的访问时,通常会定义特殊权限。

系统设置中的特殊应用访问页面包含一组用户可切换的操作。其中许多操作都作为特殊权限实现。

详细了解如何请求特殊权限

系统将 appop 保护级别分配给特殊权限。

权限组

权限可以属于权限组。权限组由一组逻辑相关的权限组成。例如,发送和接收短信的权限可能属于同一组,因为它们都与应用和短信的交互有关。

权限组有助于系统在应用请求密切相关的权限时,最大限度地减少向用户显示的系统对话框数量。当向用户显示授予应用权限的提示时,属于同一组的权限会显示在同一界面中。但是,权限可以在不通知的情况下更改组,因此不要假设某个特定权限与任何其他权限分组在一起。

最佳实践

应用权限基于系统安全功能,并帮助 Android 实现以下与用户隐私相关的目标

  • 控制:用户可以控制与应用共享的数据。
  • 透明度:用户了解应用使用哪些数据以及应用为何访问这些数据。
  • 数据最小化:应用仅访问和使用完成用户调用的特定任务或操作所需的数据。

本节介绍了一组在您的应用中有效使用权限的核心最佳实践。有关如何在 Android 上使用权限的更多详细信息,请访问应用权限最佳实践页面。

请求最少数量的权限

当用户在您的应用中请求特定操作时,您的应用应仅请求完成该操作所需的权限。根据您使用权限的方式,可能存在不依赖访问敏感信息来满足应用用例的替代方法

将运行时权限与特定操作关联

尽可能晚地在应用用例流程中请求权限。例如,如果您的应用允许用户向他人发送音频消息,请等到用户导航到消息屏幕并按下发送音频消息按钮后。用户按下按钮后,您的应用即可请求访问麦克风。

考虑您的应用依赖项

当您包含一个库时,您也继承了它的权限要求。请注意每个依赖项所需的权限以及这些权限的用途。

保持透明

当您发出权限请求时,请清楚说明您正在访问什么、为什么访问,以及如果权限被拒绝,哪些功能会受到影响,以便用户可以做出明智的决定。

明确系统访问

当您访问敏感数据或硬件(例如相机或麦克风)时,如果系统尚未提供这些指示器,请在您的应用中提供持续指示。此提醒有助于用户准确了解您的应用何时访问受限数据或执行受限操作。

系统组件中的权限

权限不仅仅用于请求系统功能。您的应用系统组件可以限制其他应用与您的应用交互,这在关于如何限制与其他应用交互的页面中有所描述。