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_LOCATIONACCESS_COARSE_LOCATIONCHANGE_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_SCAN、BLUETOOTH_ADVERTISE 和 BLUETOOTH_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)
}