简述
随着谷歌对隐私保护的越来越重视,随着版本的迭代 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 权限体系,合规的权限管理能显著提升应用的用户体验和留存率。