作为 提高应用程序质量 并保护用户隐私的一部分,我们建议您尽量减少应用程序中的权限使用。这有助于用户发现和使用提供安全可靠用户环境的高质量应用程序。
从用户那里请求权限会打断用户流程,用户可能会拒绝您的请求。此外,每次声明新权限时,您都需要 查看您的应用程序如何请求和共享用户数据。某些 特别敏感的权限和 API 要求您在应用程序内披露您的数据访问、收集、使用和共享方式。
有多种替代方法可以最大程度地减少权限使用
- 如果您的应用程序只需要大致位置信息,请声明提供粗略位置信息的权限,而不是精确位置信息。
- 调用 API,让您的应用程序能够执行所需的功能,而无需声明权限。
- 调用特定意图或事件处理程序来执行功能,而不是声明权限。
- 系统提供了用于不同文件操作的 内置契约,并且还支持 自定义契约。
如果您必须声明权限,请始终 尊重用户的决定 并提供一种方法来优雅地降低应用程序的体验。
本页面介绍了您的应用程序无需声明任何权限即可完成的几个用例。
显示附近地点
您的应用程序可能需要了解用户的近似位置。这对显示位置感知信息很有用,例如附近的餐厅。
某些用例只需要对设备位置进行粗略估计。在这些情况下,请根据您的应用程序需要位置感知信息的频率执行以下操作之一
- 如果您的应用程序经常需要位置信息,请声明
ACCESS_COARSE_LOCATION
权限。此权限提供来自位置服务的设备位置估计,如有关 近似位置精度 的文档中所述。 - 如果您的应用程序不经常需要位置信息,或者只在一次需要,请考虑让用户输入地址或邮政编码。
其他用例需要对设备位置进行更精确的估计。只有在这些情况下,才可以使用 ACCESS_FINE_LOCATION
权限。
创建和访问文件
Android 允许您创建和访问文件,而无需声明任何与存储或传感器相关的权限。
打开媒体文件
您的应用程序可能允许用户从其照片和视频中进行选择,例如用于消息附件或个人资料图片。
要支持此功能,请使用 照片选择器。照片选择器无需使用任何运行时权限。当用户与照片选择器交互以选择要与您的应用程序共享的照片或视频时,系统会授予对与所选媒体文件关联的 URI 的临时读取权限。
如果您的应用程序需要在不使用照片选择器的情况下访问媒体文件,则无需声明任何存储权限
打开文档
您的应用可能会显示用户在您的应用或其他应用中创建的文档。常见的例子是文本文件。
在这种情况下,仅为与较旧设备的兼容性声明 READ_EXTERNAL_STORAGE
。将 android:maxSdkVersion
设置为 28
。
根据创建文档的应用,执行以下操作之一
拍摄照片
用户可能会在您的应用中使用预装的系统相机应用拍摄照片。
在这种情况下,不要声明 CAMERA
权限。相反,调用 ACTION_IMAGE_CAPTURE
意图操作。
录制视频
用户可能会在您的应用中使用预装的系统相机应用录制视频。
在这种情况下,不要声明 CAMERA
权限。相反,调用 ACTION_VIDEO_CAPTURE
意图操作。
识别运行您的应用实例的设备
您的应用的特定实例可能需要知道它运行在哪个设备上。这对于具有设备特定偏好或消息传递的应用很有用,例如针对电视设备和可穿戴设备的不同播放列表。
在这种情况下,不要直接访问设备的 IMEI。事实上,从 Android 10 开始,您无法这样做。相反,执行以下操作之一
- 使用 实例 ID 库为您的应用实例获取唯一的设备标识符。
- 创建您自己的标识符,该标识符作用域为您的应用的存储空间。使用基本的系统函数,例如
randomUUID()
。
通过蓝牙与设备配对
您的应用可能会通过蓝牙将数据传输到另一个设备,从而提供增强体验。
要支持此功能,不要声明 ACCESS_FINE_LOCATION
、ACCESS_COARSE_LOCATIION
或 BLUETOOTH_ADMIN
权限。相反,请使用 伴侣设备配对。
自动输入付款卡号
Google Play 服务提供了一个库,可以让您自动输入付款卡号。无需声明 CAMERA
权限,您可以使用 借记卡和信用卡识别 库。
管理电话和短信
Android 和 Google Play 服务提供了一些库,让您无需声明任何与电话或短信相关的权限即可管理电话和短信。
自动输入一次性密码
为了简化双因素身份验证流程,您的应用可能会自动输入发送到用户设备以验证其身份的一次性密码。
要在由 Google Play 服务驱动的设备上支持此功能,不要声明 READ_SMS
权限。相反,请使用 短信检索 API。
在其他设备上,如果您的应用的目标是 Android 8.0(API 级别 26)或更高版本,请使用 createAppSpecificSmsToken()
生成特定于应用的令牌。将此令牌传递给可以发送验证短信的另一个应用或服务。
自动输入用户的电话号码
为了提供更高效的销售或支持,您的应用可能会允许用户自动输入其设备的电话号码。
要在由 Google Play 服务驱动的设备上支持此功能,不要声明 READ_PHONE_STATE
权限。相反,请使用 电话号码提示 库。
过滤电话
为了最大程度地减少对用户的无用中断,您的应用可能会过滤垃圾电话。
要支持此功能,不要声明 READ_PHONE_STATE
权限。相反,请使用 CallScreeningService
API。
拨打电话
您的应用可能会提供通过点击联系人的信息来拨打电话的功能。
要支持此功能,请使用 ACTION_DIAL
意图操作而不是 ACTION_CALL
操作。 ACTION_CALL
需要安装时权限 CALL_PHONE
,这会阻止无法拨打电话的设备(例如某些平板电脑)安装您的应用。
在您的应用被中断时暂停媒体
如果用户接听电话或用户配置的闹钟响起,您的应用应暂停任何媒体播放,直到您的应用重新获得音频焦点。
要支持此功能,不要声明 READ_PHONE_STATE
权限。相反,请实现 onAudioFocusChange()
事件处理程序,该处理程序在系统转移其音频焦点时会自动运行。了解有关如何 实现音频焦点 的更多信息。
扫描条码
Android 包含对由 Google Play 服务支持的 Google 代码扫描仪 API 的支持,它允许您在不声明任何相机权限的情况下解码条码。此 API 有助于保护用户隐私,并降低您需要为您的条码扫描用例创建自定义 UI 的可能性。
API 会扫描条码,并且仅将扫描结果返回到您的应用。图像是在设备上处理的,Google 不会存储任何数据或扫描结果。
如果您的应用需要支持复杂的用例或条码格式,或者如果它需要自定义 UI,请使用 ML Kit 条码扫描 API。
重置未使用的权限
Android 提供了多种方法将未使用的运行时权限重置为其默认的拒绝状态。
阅读 设计指南。
请求运行时权限
评估完您的应用需要声明和请求运行时权限后,请遵循特定工作流程来执行此操作。
阅读 设计指南。
解释您的应用为什么需要权限
使用 requestPermissions()
会显示一个对话框,指示您的应用想要使用哪些权限,但不会解释原因,这可能会让用户感到困惑。
有关如何以及何时显示此对话框的更多详细信息和建议,请阅读 设计指南。
处理权限拒绝
您的应用应帮助用户在选择拒绝权限之前和之后了解拒绝权限的影响。
阅读 设计指南。