Android 版本适配 - 权限变更汇总

356 阅读6分钟

Android 6.0 (API 级别 23)

引入了运行时权限机制,应用需要在运行时动态请求敏感权限,而不是在安装时一次性获取所有权限。用户可以在设置中管理每个应用的权限。权限被分为多个组,用户授予一个权限组中的一个权限,应用即可获取该组内的所有权限。运行时权限如下:

1. CALENDAR 权限组

  • READ_CALENDAR: 读取日历事件和机密信息。
  • WRITE_CALENDAR: 添加或修改日历事件,发送电子邮件给嘉宾。

2. CAMERA 权限组

  • CAMERA: 拍摄照片和视频。

3. CONTACTS 权限组

  • READ_CONTACTS: 读取联系人信息。
  • WRITE_CONTACTS: 修改联系人信息。
  • GET_ACCOUNTS: 访问设备上的账户列表。

4. LOCATION 权限组

  • ACCESS_FINE_LOCATION: 通过GPS获取精确位置。
  • ACCESS_COARSE_LOCATION: 通过WiFi或移动基站获取粗略位置。

5. MICROPHONE 权限组

  • RECORD_AUDIO: 录制音频。

6. PHONE 权限组

  • READ_PHONE_STATE: 读取电话状态和设备标识。
  • CALL_PHONE: 拨打电话。
  • READ_CALL_LOG: 读取通话记录。
  • WRITE_CALL_LOG: 修改通话记录。
  • ADD_VOICEMAIL: 添加语音邮件。
  • USE_SIP: 使用SIP服务。
  • PROCESS_OUTGOING_CALLS: 监视、修改或终止拨出电话。

7. SENSORS 权限组

  • BODY_SENSORS: 访问传感器数据,如心率监测器。

8. SMS 权限组

  • SEND_SMS: 发送短信。
  • RECEIVE_SMS: 接收短信。
  • READ_SMS: 读取短信。
  • RECEIVE_WAP_PUSH: 接收WAP推送消息。
  • RECEIVE_MMS: 接收彩信。

9. STORAGE 权限组

  • READ_EXTERNAL_STORAGE: 读取外部存储中的内容。
  • WRITE_EXTERNAL_STORAGE: 向外部存储写入内容。

Android 7.0 (API 级别 24)

Android 8.0 (API 级别 26)

PHONE 权限组新增权限

  • ANSWER_PHONE_CALLS: 允许应用以编程方式接听来电,需使用 acceptRingingCall() 方法。
  • READ_PHONE_NUMBERS: 允许应用读取设备中存储的电话号码。

安装未知来源应用

  • AndroidManifest.xml 中添加 REQUEST_INSTALL_PACKAGES 权限,以允许应用安装未知来源的应用。

Android 9.0 (API 级别 28)

新增CALL_LOG 权限组

  • READ_CALL_LOG: 读取通话记录。
  • WRITE_CALL_LOG: 修改通话记录。
  • PROCESS_OUTGOING_CALLS: 处理外拨电话。

Wi-Fi 扫描限制

成功调用 WifiManager.getScanResults() 需要以下任意一项权限:

  • ACCESS_FINE_LOCATION
  • ACCESS_COARSE_LOCATION
  • CHANGE_WIFI_STATE

访问设备的硬件序列号

在 Android 9 中,Build.SERIAL 始终设置为 "UNKNOWN" 以保护用户隐私。需要访问设备的硬件序列号,应请求 READ_PHONE_STATE 权限,然后调用 getSerial()

Android 10 (API 级别 29)

后台位置信息权限

引入了 ACCESS_BACKGROUND_LOCATION 权限,应用需单独请求以在后台访问位置信息。

自动授予策略在 Android 9 或更低版本为目标平台时适用。

更过内容请参考在后台运行时访问设备位置信息需要权限

对不可重置的设备标识符的限制

应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包括 IMEI 和序列号)。

精确位置权限

某些电话 API、蓝牙 API 和 WLAN API 需要 ACCESS_FINE_LOCATION 权限。

受影响的 API 请参考一些电话 API、蓝牙 API 和 WLAN API 需要精确位置权限

Android 11 (API 级别 30)

单次授权

用户可以授予对位置信息、麦克风和摄像头的临时访问权限。

自动重置权限

长期未使用的应用,其敏感权限会被系统自动重置。

后台位置信息访问权限

Android 11 更改了用户向应用授予后台位置信息权限的方式。

建议应用对位置权限执行递增请求,先请求前台位置信息访问权限,再请求后台位置信息访问权限。如果同时请求前台和后台位置信息权限,系统会忽略该请求,且不会向应用授予其中的任一权限。

更多内容请查看在运行时请求位置信息访问权限

Android 12 (API 级别 31)

蓝牙权限

引入了 BLUETOOTH_SCANBLUETOOTH_ADVERTISEBLUETOOTH_CONNECT 权限。

大致位置权限

用户可以选择只授予应用大致位置信息访问权限。

精确的闹钟权限

需要在清单中请求 SCHEDULE_EXACT_ALARM 权限以访问“闹钟和提醒”功能。

Android 13 (API 级别 33)

新的 Wi-Fi 设备权限

应用需请求 NEARBY_WIFI_DEVICES 权限来管理 Wi-Fi 连接。

细化的媒体权限

访问其它应用创建的媒体文件,需要请求以下权限,而不是READ_EXTERNAL_STORAGE 权限:

  • READ_MEDIA_IMAGES:图片
  • READ_MEDIA_VIDEO :视频
  • READ_MEDIA_AUDIO :音频

WRITE_EXTERNAL_STORAGE 被废弃

WRITE_EXTERNAL_STORAGE 权限在 Android 13 中被废弃。

照片选择器

Android 13 引入了新的照片选择器,用户可以选择授予应用对单张或多张照片的访问权限,而不需要授予对整个媒体库的访问权限。

通知权限

Android 13 引入了 POST_NOTIFICATIONS 权限,应用需要在运行时请求此权限以显示通知。

精细和粗略位置权限

针对某些传感器和连接 API,应用需要 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限。

使用精确闹钟的新权限

满足以下条件之一, 可以使用自动授予的 USE_EXACT_ALARM 权限:

  • 您的应用是闹钟应用或计时器应用。
  • 您的应用是日历应用,可显示即将进行的活动的通知。

否则,请改为继续声明 SCHEDULE_EXACT_ALARM 权限

后台身体传感器权限

引入 BODY_SENSORS_BACKGROUND 权限,允许在后台访问身体传感器信息。

Android 14 (API 级别 34)

精确闹钟权限默认拒绝

系统默认拒绝向大多数新安装的应用授予 SCHEDULE_EXACT_ALARM 权限。

BluetoothAdapter 权限

调用 BluetoothAdapter.getProfileConnectionState() 方法时,强制要求 BLUETOOTH_CONNECT 权限。

录音权限的变更

对于应用在后台录制音频的操作,Android 14 做出了更严格的限制。应用需要声明 RECORD_AUDIO 权限,并且只能在前台服务中进行录音操作。

更严格的安装权限

INSTALL_PACKAGES 权限:应用需要在 AndroidManifest.xml 文件中声明此权限,以允许安装其他应用的 APK 文件。

适配方案

由于Android各版本系统API的差异,以及新的权限要求,适配时需要判断版本信息,根据版本请求不同的权限。

比如,请求蓝牙相关权限:

val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    // 如果是Android 12及更高版本,需要请求蓝牙权限
    arrayOf(
        Manifest.permission.BLUETOOTH_CONNECT,
        Manifest.permission.BLUETOOTH_SCAN,
        Manifest.permission.BLUETOOTH_ADVERTISE,
        Manifest.permission.ACCESS_FINE_LOCATION
    )
} else {
    arrayOf(Manifest.permission.ACCESS_FINE_LOCATION)
}