简述
随着谷歌对 隐私保护的越来越重视,随着版本的迭代 Android 系统版本对权限管理也是逐步提升,核心理念是围绕 用户隐私安全与 最小权限原则进行升级。早期的 "一揽子授权" 已成为历史,现代 Android 系统强调更细粒度、更透明、更具时效性的权限控制。
那 Android 各版本的权限管理都是怎样的?不同系统版本下作为开发者应该在哪些场景下需要申请哪些权限?最佳实践又是什么?下面就对以上问题进行详细解答,系数下 Android 权限管理的演变历程。
1. Android 权限管理演变史
- Android 5.0 (Lollipop) 及更早:安装时授权 (Install-time Permissions)
* 机制: 用户在安装 App 时必须一次性同意所有权限,否则无法安装。
* 问题: 用户要么接受要么放弃,安装 App 后永久拥有权限,隐私风险极高。 - Android 6.0 (Marshmallow):运行时权限 (Runtime Permissions) ------ 里程碑式变革
* 机制: 将权限分为普通权限 (Normal) 和 危险权限 (Dangerous) 。危险权限(如相机、位置、通讯录)必须在 App 运行时动态申请,用户可随时在设置中撤销。
* 开发者影响: 必须编写代码检查 (checkSelfPermission) 和请求 (requestPermissions) 权限。 - Android 10 (Q):位置权限分级与分区存储
* 位置: 引入了"仅在使用期间允许" (While In Use) 选项,限制了后台位置访问。
* 存储: 引入分区存储 (Scoped Storage),限制 App 随意访问外部存储的所有文件,需通过 MediaStore 或 SAF 访问。 - Android 11 (R):单次授权与自动重置
* 单次授权: 针对位置、麦克风、相机,新增"仅限这一次" (Only this time) 选项。App 关闭后权限立即失效。
* 权限重置: 若 App 长期未被使用,系统会自动撤销其已获得的敏感权限。
* 后台位置: 申请后台位置权限变得更加严格,必须先申请前台权限,且不能同时申请。 - Android 12 (S):隐私仪表板与大致位置
* 指示器: 当麦克风或相机被使用时,状态栏会显示绿色图标提示。
* 模糊定位: 用户可以选择授予"大致位置" (Approximate) 而非"精确位置" (Precise)。 - Android 13 (Tiramisu):细化媒体权限与通知权限
* 媒体拆分:READ_EXTERNAL_STORAGE被拆分为图片、视频、音频三个独立权限,不再能一键读取所有文件。
* 通知: 发送通知正式成为一种运行时权限 (POST_NOTIFICATIONS),需用户主动授权。 - Android 14/15:更严格的后台与全屏限制
* 照片选择器: 强化 Photo Picker,允许用户只授权 App 访问特定的几张照片,而非整个相册。
* 全屏通知: 对全屏 Intent 通知的发送权限进行更严格管控,默认为仅通话/闹钟类应用开放。
2. 开发者场景指南:何时申请?申请什么?
作为开发者,需要根据 APP 具体的业务场景来决定申请策略, 以下是场景介绍:
场景 A:社交/通讯类 App (如微信、WhatsApp)
- 拍照/发语音:
* 版本差异: Android 6.0+ 需动态申请CAMERA和RECORD_AUDIO。
* 时机: 用户点击"拍照"或"录音"按钮的那一刻申请,不要在启动 App 时立刻申请。 - 发送图片:
* Android 13+: 申请READ_MEDIA_IMAGES。
* Android 12及以下: 申请READ_EXTERNAL_STORAGE。
* 最佳实践: 优先使用系统原生的 Photo Picker (照片选择器),这样无需申请任何存储权限即可获取用户选定的照片。
场景 B:地图/打车/外卖类 App
- 定位:
* Android 12+: 必须同时请求ACCESS_FINE_LOCATION(精确) 和ACCESS_COARSE_LOCATION(大致),让用户选择。若应用只需知道城市级别,只申请COARSE即可。
* 后台定位: 仅在核心功能必须(如轨迹记录)时申请。必须引导用户去设置页面手动开启"始终允许"。
场景 C:内容/工具类 App
- 通知推送:
* Android 13+: 必须申请POST_NOTIFICATIONS。
* 策略: 在用户体验到 App 价值后(如关注了某个作者、设置了提醒)再弹出请求,通过解释"开启通知能获得什么"来提高通过率。
3. 最佳实践方案 (Best Practices)
谷歌官方建议,遵循以下 "3R" 原则:
- Request strictly (严格按需申请)
* 最小化原则: 只申请实现当前功能所必须的最小权限集合。能用 Intent 调用系统相机/相册解决的,就不要申请相机/存储权限。
* 示例: 如果只是想让用户选一张头像,使用ActivityResultContracts.PickVisualMedia(Photo Picker),完全不需要存储权限。 - Request transparently (透明地申请)
* 上下文感知: 永远在用户触发相关功能时才申请权限,严禁在 App 启动时一次性弹出所有权限请求 。
* 解释说明 (Rationale): 如果用户之前拒绝过某权限,再次申请时,必须先弹出一个 UI 解释"为什么我们需要这个权限"(例如:"我们需要相机权限以便您扫描二维码支付"),再弹出系统权限对话框。使用shouldShowRequestPermissionRationale()API 来判断是否需要显示解释。 - Respect the user (尊重用户选择)
* 降级处理: 如果用户拒绝了权限,App 不应崩溃或直接退出,而应提供降级服务。
* 不要阻断: 除非是 App 核心功能(如地图无法定位),否则不要强制用户去设置中手动开启权限。
希望以上内容能帮助你更好地理解 Android 权限体系,合规的权限管理能显著提升应用的用户体验和留存率。