一文精通-安卓隐私权限

151 阅读7分钟

Android 的权限分为 several types,最重要的是 普通权限 (Normal)  和 危险权限 (Dangerous)

Android 权限核心机制

  1. 安装时权限 (Normal Permissions)

    • 涉及低风险数据或设备功能的权限(如设置时区、访问网络)。
    • 在 AndroidManifest.xml 中声明后,系统在安装时自动授予,无需用户动态请求。
  2. 运行时权限 (Dangerous Permissions)

    • 涉及用户隐私或敏感数据的权限(如相机、位置、通讯录)。
    • 不仅需要在 AndroidManifest.xml 中声明,还必须在应用运行时向用户弹窗请求。
    • 用户可以在设置中随时撤销这些权限。
  3. 特殊权限

    • 如 SYSTEM_ALERT_WINDOW(绘制悬浮窗)、WRITE_SETTINGS(修改系统设置)。
    • 授予方式与危险权限不同,通常需要引导用户到特定设置页面开启。
  4. 权限组 (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+)。

最佳实践和建议

  1. 遵循最小权限原则:只申请应用功能绝对必需的权限。
  2. 在运行时解释原因:在请求危险权限之前,最好先向用户展示一个简单的解释(不是系统弹窗的一部分),说明为什么需要这个权限。这可以显著提高用户的授权率。
  3. 优雅处理拒绝:如果用户拒绝了某个权限,你的应用不应崩溃,而应禁用相关功能并提示用户如果没有该权限会有什么影响。
  4. 使用权限库:考虑使用 Android Jetpack 的 Activity Results API 或 Permissions 库来简化权限请求和处理流程,使代码更清晰易懂。
  5. 适配新版本:特别注意 Android 新版本(如 Android 10, 11, 12, 13)对权限模型的修改,尤其是作用域存储 (Scoped Storage) 和后台位置访问。
  6. 检查权限状态:在使用权限前,始终使用 ContextCompat.checkSelfPermission() 检查是否已获得授权。

这份清单涵盖了开发中遇到的大部分权限。始终建议在开发时查阅 Android 官方权限文档 以获取最新和最准确的信息。