Android 的权限分为 several types,最重要的是 普通权限 (Normal) 和 危险权限 (Dangerous) 。
Android 权限核心机制
-
安装时权限 (Normal Permissions) :
- 涉及低风险数据或设备功能的权限(如设置时区、访问网络)。
- 在
AndroidManifest.xml中声明后,系统在安装时自动授予,无需用户动态请求。
-
运行时权限 (Dangerous Permissions) :
- 涉及用户隐私或敏感数据的权限(如相机、位置、通讯录)。
- 不仅需要在
AndroidManifest.xml中声明,还必须在应用运行时向用户弹窗请求。 - 用户可以在设置中随时撤销这些权限。
-
特殊权限:
- 如
SYSTEM_ALERT_WINDOW(绘制悬浮窗)、WRITE_SETTINGS(修改系统设置)。 - 授予方式与危险权限不同,通常需要引导用户到特定设置页面开启。
- 如
-
权限组 (Permission Groups) :
- 危险权限被分组管理(如
STORAGE组包含READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE)。 - 重要规则:如果用户授予了组内的某个权限,再次请求同组内的其他权限时,系统会自动授予而不再弹窗提示用户。
- 危险权限被分组管理(如
全面的 Android 隐私权限清单
以下是按功能分类的常见权限,并标注其类型和所需的目标 API 级别。
1. 日历 (Calendar)
-
READ_CALENDAR(dangerous)- 用途:读取用户的日历数据。
- 描述文案示例:“用于将活动信息同步到您的日历中。” 或 “用于读取您的日程安排以便为您智能推荐空闲时间。”
-
WRITE_CALENDAR(dangerous)- 用途:添加、修改或删除用户的日历事件。
- 描述文案示例:“用于为您创建新的事件提醒。” 或 “将会议邀请添加到您的日历。”
2. 相机 (Camera)
-
CAMERA(dangerous)- 用途:使用设备相机拍摄照片和视频。
- 描述文案示例:“用于扫描二维码” 或 “用于拍摄照片和视频以发布内容。” 或 “用于视频通话。”
3. 通讯录 (Contacts)
-
READ_CONTACTS(dangerous)- 用途:读取用户的联系人数据。
- 描述文案示例:“用于帮助您查找可能在使用此应用的朋友。” 或 “用于快速选择联系人以分享内容。”
-
WRITE_CONTACTS(dangerous)- 用途:添加、修改或删除用户的联系人。
- 描述文案示例:“用于将新认识的朋友保存到您的通讯录。”
-
GET_ACCOUNTS(dangerous) (在较早版本的 Android 中使用,现代开发中多使用 Google Play services API)
4. 位置 (Location)
-
ACCESS_COARSE_LOCATION(dangerous)- 用途:通过网络(如 Wi-Fi 和移动网络)获取大致位置信息。
- 描述文案示例:“用于基于您所在的城市提供本地新闻和天气信息。”
-
ACCESS_FINE_LOCATION(dangerous)- 用途:通过 GPS、网络等获取精确的位置信息。
- 描述文案示例:“用于地图导航和记录您的运动轨迹。” 或 “用于发现您附近的商店和服务。”
-
ACCESS_BACKGROUND_LOCATION(dangerous) (Android 10+)- 用途:在应用处于后台时也能访问位置。要求极其严格,需向谷歌提交审核。
- 描述文案示例:“用于在您驾驶时持续提供导航指引。” 或 “在后台记录您的跑步路线。”
5. 麦克风 (Microphone)
-
RECORD_AUDIO(dangerous)- 用途:使用设备麦克风录制音频。
- 描述文案示例:“用于录制语音消息。” 或 “用于进行语音和视频通话。” 或 “用于语音搜索功能。”
6. 电话 (Phone)
-
READ_PHONE_STATE(dangerous)- 用途:读取手机状态,包括设备的 IMEI 号码、来电状态等。
- 描述文案示例:“用于识别来电状态,以便在游戏时自动暂停音效。”
-
CALL_PHONE(dangerous)- 用途:直接拨打电话,无需用户通过拨号界面确认。
- 描述文案示例:“用于一键拨打客服电话。”
-
READ_CALL_LOG(dangerous)- 用途:读取用户的通话记录。
-
WRITE_CALL_LOG(dangerous)- 用途:写入(修改)用户的通话记录。
-
ADD_VOICEMAIL(dangerous)- 用途:向系统中添加语音邮件。
-
USE_SIP(dangerous)- 用途:使用 SIP 视频/语音通话服务。
7. 传感器 (Sensors)
-
BODY_SENSORS(dangerous)- 用途:访问来自心率监测器、体温计等身体传感器的数据。
- 描述文案示例:“用于连接您的心率监测器,分析您的运动数据。”
8. 短信 (SMS)
-
SEND_SMS(dangerous)- 用途:发送短信。
- 描述文案示例:“用于自动发送验证码短信以完成身份验证。”
-
RECEIVE_SMS(dangerous)- 用途:接收短信。
-
READ_SMS(dangerous)- 用途:读取用户的短信内容。
-
RECEIVE_WAP_PUSH(dangerous) -
RECEIVE_MMS(dangerous)
注意:由于滥用严重,Google Play 对使用 SMS 和 Call Log 权限的应用审核极其严格,通常只允许默认短信或拨号应用使用。大多数应用应使用其他方式(如 API 验证)替代。
9. 存储 (Storage)
-
READ_EXTERNAL_STORAGE(dangerous) (在 Android 13+ 上行为有变化)- 用途:读取设备上的共享文件(如照片、音乐、文档)。
- 描述文案示例:“用于访问您设备上的图片以设置为壁纸。” 或 “用于导入您下载的文档。”
-
WRITE_EXTERNAL_STORAGE(dangerous) (在 Android 10+ 上已废弃,Android 13+ 上仅对媒体文件有效)- 用途:修改或删除设备上的共享文件。
- 描述文案示例:“用于保存您下载的图片和文件。” 或 “用于缓存音乐和视频以供离线播放。”
Android 13 (API 33+) 及更高版本的媒体权限:
-
READ_MEDIA_IMAGES(dangerous) -
READ_MEDIA_VIDEO(dangerous) -
READ_MEDIA_AUDIO(dangerous)- 用途:取代旧的
READ_EXTERNAL_STORAGE,用于更精细地请求访问特定类型的媒体文件。 - 描述文案示例:“用于访问您的照片库以选择头像。” (对于
READ_MEDIA_IMAGES)
- 用途:取代旧的
10. 附近设备 (Nearby Devices) - Android 12+
-
BLUETOOTH_SCAN(dangerous)- 用途:发现并扫描附近的蓝牙设备。
-
BLUETOOTH_ADVERTISE(dangerous)- 用途:让当前设备可被其他蓝牙设备发现。
-
BLUETOOTH_CONNECT(dangerous)- 用途:连接已配对的蓝牙设备。
- 蓝牙权限描述文案示例:“用于连接您的无线耳机和智能手表。”
-
NEARBY_WIFI_DEVICES(dangerous) (Android 13+)- 用途:发现并连接到附近的 Wi-Fi 设备。用于替代在后台使用位置权限来执行 Wi-Fi API 调用。
11. 普通权限 (Normal Permissions - 无需运行时请求)
这些权限只需在 AndroidManifest.xml 中声明即可。
-
ACCESS_NETWORK_STATE(normal)- 检查网络连接状态。
-
INTERNET(normal)- 访问互联网(这是几乎所有网络应用的必备权限)。
-
WAKE_LOCK(normal)- 防止设备在后台休眠。
-
VIBRATE(normal)- 控制振动器。
-
FOREGROUND_SERVICE(normal)- 启动前台服务(Android 9+)。
最佳实践和建议
- 遵循最小权限原则:只申请应用功能绝对必需的权限。
- 在运行时解释原因:在请求危险权限之前,最好先向用户展示一个简单的解释(不是系统弹窗的一部分),说明为什么需要这个权限。这可以显著提高用户的授权率。
- 优雅处理拒绝:如果用户拒绝了某个权限,你的应用不应崩溃,而应禁用相关功能并提示用户如果没有该权限会有什么影响。
- 使用权限库:考虑使用 Android Jetpack 的 Activity Results API 或 Permissions 库来简化权限请求和处理流程,使代码更清晰易懂。
- 适配新版本:特别注意 Android 新版本(如 Android 10, 11, 12, 13)对权限模型的修改,尤其是作用域存储 (
Scoped Storage) 和后台位置访问。 - 检查权限状态:在使用权限前,始终使用
ContextCompat.checkSelfPermission()检查是否已获得授权。
这份清单涵盖了开发中遇到的大部分权限。始终建议在开发时查阅 Android 官方权限文档 以获取最新和最准确的信息。