应用权限通过保护对以下各项的访问来帮助支持用户隐私:
- 受限数据,例如系统状态和用户联系信息
- 受限操作,例如连接到配对设备和录制音频
本页概述了 Android 权限的工作原理,包括使用权限的高级工作流程、不同类型权限的说明以及在应用中使用权限的一些最佳实践。其他页面介绍了如何最大限度地减少应用对权限的请求、声明权限、请求运行时权限以及限制其他应用与应用组件的互动。
要查看 Android 应用权限的完整列表,请访问权限 API 参考页面。
要查看演示权限工作流程的一些示例应用,请访问 GitHub 上的Android 权限示例代码库。
使用权限的工作流程
如果您的应用提供可能需要访问受限数据或执行受限操作的功能,请确定是否可以在无需声明权限的情况下获取信息或执行操作。您可以在应用中实现许多用例,例如拍照、暂停媒体播放和显示相关广告,而无需声明任何权限。
如果您决定您的应用必须访问受限数据或执行受限操作才能实现某个用例,请声明适当的权限。某些权限(称为安装时权限)会在应用安装时自动授予。其他权限(称为运行时权限)要求您的应用更进一步,在运行时请求权限。
图 1 说明了使用应用权限的工作流程
权限类型
Android 将权限分为不同类型,包括安装时权限、运行时权限和特殊权限。每种权限类型表示当系统授予您的应用该权限时,您的应用可以访问的受限数据的范围以及可以执行的受限操作的范围。每种权限的保护级别都基于其类型,并显示在权限 API 参考页面上。
安装时权限
安装时权限允许您的应用有限地访问受限数据,或允许您的应用执行对系统或其他应用影响最小的受限操作。当您在应用中声明安装时权限时,应用商店会在用户查看应用的详情页面时显示安装时权限通知,如图 2 所示。当用户安装您的应用时,系统会自动授予您的应用这些权限。
Android 包含几种安装时权限的子类型,包括普通权限和签名权限。
普通权限
这些权限允许访问超出应用沙盒的数据和操作,但对用户隐私和其他应用的运行风险很小。
系统会将 normal
保护级别分配给普通权限。
签名权限
系统仅当应用由与定义权限的应用或操作系统相同的证书签名时,才会向应用授予签名权限。
实现特权服务(例如自动填充或 VPN 服务)的应用也使用签名权限。这些应用需要服务绑定签名权限,以便只有系统才能绑定到这些服务。
系统会将 signature
保护级别分配给签名权限。
运行时权限
运行时权限(也称为危险权限)允许您的应用额外访问受限数据,或允许您的应用执行对系统和其他应用影响更大的受限操作。因此,您需要先在应用中请求运行时权限,然后才能访问受限数据或执行受限操作。不要假定这些权限已事先授予 - 在每次访问之前检查它们,并在需要时请求它们。
当您的应用请求运行时权限时,系统会显示运行时权限提示,如图 3 所示。
许多运行时权限会访问用户私有数据,这是一种特殊的受限数据,包含潜在的敏感信息。用户私有数据的示例包括位置和联系信息。
麦克风和摄像头提供对特别敏感信息的访问。因此,系统会帮助您解释您的应用为何访问此信息。
系统会将 dangerous
保护级别分配给运行时权限。
特殊权限
特殊权限对应于特定的应用操作。只有平台和 OEM 可以定义特殊权限。此外,平台和 OEM 通常会在需要保护对特别强大操作(例如在其他应用上绘图)的访问时定义特殊权限。
系统设置中的特殊应用访问页面包含一组用户可切换的操作。其中许多操作都作为特殊权限实现。
详细了解如何请求特殊权限。
系统会将 appop
保护级别分配给特殊权限。
权限组
权限可以属于权限组。权限组由一组逻辑相关的权限组成。例如,发送和接收短信的权限可能属于同一组,因为它们都与应用与短信的交互有关。
权限组有助于系统最大限度地减少应用请求密切相关的权限时向用户显示的系统对话框数量。当系统提示用户授予应用权限时,属于同一组的权限会显示在同一界面中。但是,权限组可能会在没有通知的情况下更改,因此不要假定某个特定权限与任何其他权限分组。
最佳实践
应用权限建立在系统安全功能之上,并帮助 Android 支持以下与用户隐私相关的目标:
- 控制:用户可以控制与应用共享的数据。
- 透明性:用户了解应用使用了哪些数据以及应用为何访问这些数据。
- 数据最小化:应用仅访问和使用用户调用的特定任务或操作所需的数据。
本节介绍了一组在应用中有效使用权限的核心最佳实践。如需详细了解如何在 Android 上使用权限,请访问应用权限最佳实践页面。
请求最少数量的权限
当用户在您的应用中请求特定操作时,您的应用应仅请求完成该操作所需的权限。根据您使用权限的方式,可能存在无需依赖敏感信息访问权限即可满足应用用例的替代方法。
将运行时权限与特定操作关联
尽可能晚地在应用用例流程中请求权限。例如,如果您的应用允许用户向他人发送音频消息,请等到用户已导航到消息屏幕并按下了发送音频消息按钮。用户按下该按钮后,您的应用即可请求访问麦克风。
考虑您应用的依赖项
当您包含一个库时,您也会继承其权限要求。请注意每个依赖项所需的权限以及这些权限的用途。
保持透明
当您发出权限请求时,请明确您正在访问什么、为何访问以及如果拒绝权限会影响哪些功能,以便用户做出明智的决定。
明确系统访问
当您访问敏感数据或硬件(例如摄像头或麦克风)时,如果系统尚未提供这些指示,请在您的应用中提供持续指示。此提醒有助于用户准确了解您的应用何时访问受限数据或执行受限操作。
系统组件中的权限
权限不仅仅用于请求系统功能。您的应用系统组件可以限制其他应用与您的应用交互的方式,如限制与其他应用交互页面中所述。