【51】【项目开发知识管理】Android权限适配基础知识
Android权限适配基础知识
文章目录
1.Android权限分为哪几类?
Android 权限根据敏感程度、授权方式和使用范围,主要分为以下几类:
1.1普通权限(Normal Permissions)
(1)特点:低风险权限,仅涉及应用正常运行的基础功能,不直接威胁用户隐私或设备安全。
(2)授权方式:系统在应用安装时自动授予,无需用户手动授权,且用户无法在设置中单独撤销(部分系统可能允许,但不影响应用核心功能)。
(3)示例:
- INTERNET(访问网络)
- ACCESS_NETWORK_STATE(获取网络状态)
- VIBRATE(控制振动)
- WAKE_LOCK(阻止设备休眠)
1.2危险权限(Dangerous Permissions)
(1)特点:高风险权限,涉及用户隐私(如位置、通讯录)、设备敏感功能(如相机、麦克风)或可能影响数据安全的操作(如读写存储)。
(2)授权方式:需在应用运行时动态申请,用户可选择 “允许” 或 “拒绝”,且可在设置中随时撤销。
(3)权限组机制:危险权限按功能归类为 “权限组”(如LOCATION组包含精确 / 粗略位置权限),用户授予组内任一权限后,组内其他权限会自动生效。
(4)示例:
- CAMERA(相机访问)
- ACCESS_FINE_LOCATION(精确位置)
- READ_CONTACTS(读取联系人)
- RECORD_AUDIO(录音)
1.3系统级权限(System Permissions)
(1)特点:最高级别的权限,涉及系统核心功能、底层资源或敏感配置(如修改系统时间、挂载文件系统),直接影响系统稳定性和安全。
(2)授权方式:仅授予系统应用(如预装的系统设置、电话应用),需满足:
- 应用通过 “系统签名”(与系统固件使用相同的签名密钥);
- 安装在/system/app或/system/priv-app目录下。
(3)第三方应用限制:普通应用即使在AndroidManifest.xml中声明,也无法获得授权。
(4)示例:
- REBOOT(重启设备)
- WRITE_SECURE_SETTINGS(修改安全设置)
- DELETE_PACKAGES(卸载应用)
- MOUNT_UNMOUNT_FILESYSTEMS(挂载 / 卸载文件系统)
1.4特殊权限(Special Permissions)
(1)特点:权限级别介于危险权限和系统级权限之间,涉及特殊系统功能,不归类到普通或危险权限中。
(2)授权方式:需通过系统设置页面手动开启,无法通过常规的动态申请 API 触发授权弹窗,需引导用户跳转至设置页操作。
(3)示例:
- SYSTEM_ALERT_WINDOW(显示悬浮窗,覆盖其他应用)
- WRITE_SETTINGS(修改系统设置,如亮度、音量等非安全设置)
- REQUEST_INSTALL_PACKAGES(允许安装未知来源应用,Android 8.0+)
- ACCESS_BACKGROUND_LOCATION(Android 10+,允许后台获取位置,需先授予前台位置权限)
1.5小结
Android 权限的分类核心是风险等级和授权粒度:
- 普通权限:自动授予,低风险;
- 危险权限:动态申请,用户可控,涉及隐私;
- 系统级权限:仅系统应用可用,高风险;
- 特殊权限:需手动开启,涉及特殊系统功能。
随着 Android 版本迭代,权限分类和授权机制可能微调(如 Android 13 + 对媒体权限的拆分),建议结合官方文档适配最新规范。
2.什么是普通权限?
Android 的普通权限(Normal Permissions) 是指不会直接威胁用户隐私或设备安全的权限,系统会在应用安装时自动授予,无需在运行时动态申请,用户也无法手动撤销(部分系统可能允许,但通常不影响应用基本功能)。
2.1常见的普通权限列表及用途说明
| 权限名称 | 说明 |
|---|---|
| android.permission.INTERNET | 允许应用访问网络(如 HTTP/HTTPS 请求、WebSocket 等)。 |
| android.permission.ACCESS_NETWORK_STATE | 允许应用获取网络连接状态(如是否联网、网络类型为移动数据 / WiFi)。 |
| android.permission.ACCESS_WIFI_STATE | 允许应用获取 WiFi 状态(如 WiFi 是否开启、当前连接的 SSID、信号强度)。 |
| android.permission.CHANGE_NETWORK_STATE | 允许应用修改网络连接状态(如开启 / 关闭移动数据、切换网络)。 |
| android.permission.CHANGE_WIFI_STATE | 允许应用修改 WiFi 状态(如开启 / 关闭 WiFi、连接指定 WiFi 热点)。 |
| android.permission.WAKE_LOCK | 允许应用阻止设备进入休眠状态(如视频播放时保持屏幕常亮、后台服务保活)。 |
| android.permission.VIBRATE | 允许应用控制设备振动(如通知、闹钟、游戏反馈时触发振动) |
| android.permission.NFC | 允许应用使用近场通信(NFC)功能(如手机刷卡、数据传输) |
| android.permission.SET_WALLPAPER | 允许应用设置系统桌面壁纸。 |
| android.permission.SET_WALLPAPER_HINTS | 允许应用设置壁纸相关参数(如壁纸滚动方式、缩放比例)。 |
| android.permission.BLUETOOTH | 允许应用连接到已配对的蓝牙设备(Android 12 之前为普通权限;12 + 需配合BLUETOOTH_CONNECT等危险权限 |
| android.permission.RECEIVE_BOOT_COMPLETED | 允许应用接收设备启动完成的广播(用于开机自启动服务等场景)。 |
| android.permission.INSTALL_SHORTCUT | 允许应用在桌面创建快捷方式。 |
| android.permission.UNINSTALL_SHORTCUT | 允许应用删除桌面快捷方式。 |
| android.permission.WRITE_SYNC_SETTINGS | 允许应用修改系统同步设置(如开启 / 关闭账户同步)。 |
| android.permission.READ_SYNC_SETTINGS | 允许应用读取系统同步设置。 |
| android.permission.READ_SYNC_STATS | 允许应用读取同步统计信息(如同步成功 / 失败次数)。 |
| android.permission.USE_FULL_SCREEN_INTENT | 允许应用使用全屏 Intent(如来电时全屏显示、紧急通知)。 |
| android.permission.KILL_BACKGROUND_PROCESSES | 允许应用终止其他应用的后台进程(释放系统资源,不影响前台应用)。 |
| android.permission.MODIFY_AUDIO_SETTINGS | 允许应用修改音频设置(如调整音量、切换音频输出设备)。 |
| android.permission.ACCESS_LOCATION_EXTRA_COMMANDS | 允许应用使用额外的位置命令(如向位置提供商发送额外请求)。 |
| android.permission.SET_TIME_ZONE | 允许应用设置系统时区(注意:修改系统时间需系统级权限,此处仅时区)。 |
| android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND | 允许配对的 Companion 设备应用在后台运行(针对穿戴设备等场景)。 |
| android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND | 允许配对的 Companion 设备应用在后台使用数据。 |
| android.permission.BLUETOOTH_ADMIN | 允许应用管理蓝牙连接(如发现新设备、配对设备,需与BLUETOOTH配合)。 |
2.2注意事项
(1)普通权限仅需在AndroidManifest.xml中声明即可生效,无需运行时申请。
(2)部分权限的分类可能随 Android 版本调整(如蓝牙权限在 Android 12 + 的拆分),建议以官方文档为准。
(3)应用应遵循 “最小权限原则”,仅声明实际需要的权限,避免过度申请。
(4)以上列表涵盖了大多数常用普通权限,完整列表可参考 Android SDK 中的android.Manifest.permission类或官方文档。
3.什么是危险权限?
Android 中需要动态申请(运行时请求) 的危险权限(Dangerous Permissions)均属于特定的权限组,用户授予组内任一权限后,组内其他权限会自动获得授权。
3.1按权限组分类的危险权限列表(涵盖主流 Android 版本,标注版本差异)
| 权限组名称 | 包含的危险权限 | 权限用途说明 | 版本说明 |
|---|---|---|---|
| CAMERA(相机) | android.permission.CAMERA | 允许访问设备相机,用于拍照、录像等。 | 全版本适用 |
| MICROPHONE(麦克风) | android.permission.RECORD_AUDIO | 允许录制音频(如语音通话、录音功能)。 | 全版本适用 |
| LOCATION(位置) | android.permission.ACCESS_FINE_LOCATION(精确位置)android.permission.ACCESS_COARSE_LOCATION(粗略位置) | 允许获取设备位置信息(精确位置含 GPS,粗略位置基于网络)。 | 全版本适用;Android 10 + 后台位置需额外申请ACCESS_BACKGROUND_LOCATION(特殊权限) |
| CONTACTS(联系人) | android.permission.READ_CONTACTS(读取联系人) android.permission.WRITE_CONTACTS(修改联系人) android.permission.GET_ACCOUNTS(获取账户列表) |
允许读写系统联系人数据、获取设备上的账户信息。 | 全版本适用 |
| CALENDAR(日历) | android.permission.READ_CALENDAR(读取日历) android.permission.WRITE_CALENDAR(修改日历) |
允许读写系统日历事件。 | 全版本适用 |
| SMS(短信) | android.permission.SEND_SMS(发送短信) android.permission.RECEIVE_SMS(接收短信) android.permission.READ_SMS(读取短信) android.permission.RECEIVE_WAP_PUSH(接收 WAP 推送) android.permission.RECEIVE_MMS(接收彩信) |
允许发送、接收、读取短信 / 彩信 / WAP 推送。 | 全版本适用 |
| PHONE(电话) | android.permission.READ_PHONE_STATE(读取电话状态) android.permission.CALL_PHONE(拨打电话) android.permission.READ_CALL_LOG(读取通话记录) android.permission.WRITE_CALL_LOG(修改通话记录) android.permission.ADD_VOICEMAIL(添加语音信箱) android.permission.USE_SIP(使用 SIP 服务) android.permission.PROCESS_OUTGOING_CALLS(处理呼出电话) |
允许访问电话状态、拨打电话、读写通话记录等。 | 全版本适用;部分权限在高版本中限制更严 |
| STORAGE(存储,旧版) | android.permission.READ_EXTERNAL_STORAGE(读取外部存储) android.permission.WRITE_EXTERNAL_STORAGE(写入外部存储) |
允许读写设备外部存储(如 SD 卡)中的文件。 | Android 12 及以下适用;Android 13 + 被细分为媒体权限 |
| MEDIA(媒体,Android 13+) | android.permission.READ_MEDIA_IMAGES(读取图片) android.permission.READ_MEDIA_VIDEO(读取视频) android.permission.READ_MEDIA_AUDIO(读取音频) android.permission.WRITE_MEDIA_IMAGES(写入图片) android.permission.WRITE_MEDIA_VIDEO(写入视频) android.permission.WRITE_MEDIA_AUDIO(写入音频) |
替代旧版存储权限,更细粒度地控制媒体文件访问(图片、视频、音频分别授权)。 | 仅 Android 13(API 33)及以上适用 |
| BODY_SENSORS(身体传感器) | android.permission.BODY_SENSORS | 允许访问身体传感器数据(如心率传感器、步数传感器)。 | 全版本适用 |
| ACTIVITY_RECOGNITION(活动识别) | android.permission.ACTIVITY_RECOGNITION | 允许识别用户的物理活动(如步行、跑步、乘车)。 | Android 10(API 29)及以上适用;部分设备归类为特殊权限 |
3.2关键说明
3.2.1权限组特性
申请同一组中的任一权限时,系统弹窗会显示权限组名称(如申请READ_CONTACTS时显示 “联系人”),用户授权后,组内其他权限自动生效,无需重复申请。
3.2.2版本适配
(1)Android 13+ 必须使用细分的媒体权限(READ_MEDIA_xxxx),而非旧版READ_EXTERNAL_STORAGE。
(2)若应用targetSdkVersion >= 33,需优先声明细粒度媒体权限。
3.2.3动态申请流程
需通过 checkSelfPermission() 检查权限,requestPermissions() 发起请求,并在 onRequestPermissionsResult() 中处理结果(或使用 Activity Result API)。
实际开发中,建议结合官方文档确认权限的最新状态,并仅申请应用必需的权限,以提升用户信任度。
4.什么是系统级权限?
系统级权限(System-level Permissions)是 Android 中权限等级最高的一类权限,主要用于控制系统核心功能、底层资源或敏感配置(如修改系统时间、挂载文件系统、修改安全设置等)。
4.1这类权限的特点
4.1.1仅授予系统应用
普通第三方应用即使在AndroidManifest.xml中声明,也无法获得授权,只有通过系统签名(与系统固件使用相同的签名密钥)或安装在/system/app、/system/priv-app目录下的系统应用(如系统设置、电话应用、文件管理器等预装应用)才能使用。
4.1.2涉及系统安全与稳定性
权限对应的操作可能直接影响系统运行,因此限制严格(例如卸载系统应用、修改系统时区等)。
4.2常见的系统级权限列表
以下是 Android 中典型的系统级权限(不同 Android 版本可能略有差异,具体以官方文档为准):
| 权限名称 | 用途说明 |
|---|---|
| android.permission.MOUNT_UNMOUNT_FILESYSTEMS | 允许挂载 / 卸载外部文件系统(如 SD 卡、OTG 存储)。 |
| android.permission.WRITE_SECURE_SETTINGS | 允许修改系统 “安全设置”(如开启 USB 调试、修改默认输入法等,普通应用只能修改非安全设置)。 |
| android.permission.SET_TIME | 允许修改系统时间(不包括时区,需配合SET_TIME_ZONE)。 |
| android.permission.SET_TIME_ZONE | 允许修改系统时区。 |
| android.permission.SHUTDOWN | 允许应用关闭设备(如系统电源菜单的功能)。 |
| android.permission.REBOOT | 允许重启设备。 |
| android.permission.DELETE_PACKAGES | 允许卸载应用(普通应用只能卸载自己,系统应用可卸载其他应用)。 |
| android.permission.INSTALL_PACKAGES | 允许静默安装应用(无需用户确认,普通应用安装需用户手动授权)。 |
| android.permission.CHANGE_CONFIGURATION | 允许修改系统配置(如屏幕方向、字体大小等全局设置)。 |
| android.permission.ACCESS_SURFACE_FLINGER | 允许访问底层图形渲染服务(SurfaceFlinger),用于系统级 UI 渲染。 |
| android.permission.MANAGE_USERS | 允许管理多用户账户(如创建、删除用户,仅系统应用可用)。 |
| android.permission.READ_FRAME_BUFFER | 允许读取帧缓冲区(用于屏幕截图等系统级功能)。 |
| android.permission.CAMERA_DISABLE | 允许禁用相机硬件(系统级应用控制相机开关)。 |
| android.permission.MODIFY_PHONE_STATE | 允许修改电话状态(如强制挂断通话、修改信号强度等,Android 6.0 后限制更严)。 |
| android.permission.WRITE_APN_SETTINGS | 允许修改 APN(移动网络接入点)设置(影响网络连接,需系统级权限)。 |
4.3注意事项
- 系统级权限的具体列表和限制会随 Android 版本更新而调整(例如部分权限可能被拆分或废弃),建议参考Android 官方权限文档获取最新信息。
- 普通第三方应用无需考虑系统级权限,因为即使声明也无法获取;若需实现类似功能,需通过系统提供的公共 API(如通过Intent调用系统功能)间接实现。
5.什么是特殊权限?
Android 的特殊权限(Special Permissions) 是一类特殊的系统权限,其授权方式与普通权限、危险权限均不同:它们通常涉及对系统行为的特殊控制,无法通过常规的运行时权限弹窗申请,必须由用户在系统设置页面手动开启。
5.1常见的特殊权限列表及说明
| 权限名称 | 用途说明 | 适用版本 | 授权方式 |
|---|---|---|---|
| SYSTEM_ALERT_WINDOW | 允许应用在其他应用之上显示悬浮窗(如悬浮按钮、弹窗)。 | 全版本 | 需引导用户到「设置 > 应用 > 特殊应用权限 > 显示在其他应用上层」手动开启,可通过 Settings.ACTION_MANAGE_OVERLAY_PERMISSION 意图跳转。 |
| WRITE_SETTINGS | 允许应用修改系统全局设置(如屏幕亮度、音量、默认铃声等非安全设置)。 | 全版本 | 需引导用户到「设置 > 应用 > 特殊应用权限 > 修改系统设置」开启,可通过 Settings.ACTION_MANAGE_WRITE_SETTINGS 意图跳转。 |
| REQUEST_INSTALL_PACKAGES | 允许应用安装未知来源的 APK 文件(非应用商店下载的应用)。 | Android 8.0+ | 需在「设置 > 应用 > 应用信息 > 安装未知应用」中开启,可通过 Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES 意图跳转。 |
| ACCESS_BACKGROUND_LOCATION | 允许应用在后台(非前台运行时)持续获取位置信息。 | Android 10+ | 需先授予前台位置权限(ACCESS_FINE_LOCATION 等),再在权限设置中手动开启「允许后台访问位置」,可通过 Settings.ACTION_APPLICATION_DETAILS_SETTINGS 意图引导。 |
| MANAGE_EXTERNAL_STORAGE | 允许应用访问设备上的所有文件(突破 Android 10 + 的分区存储限制)。 | Android 11+ | 需引导用户到「设置 > 应用 > 特殊应用权限 > 所有文件访问权限」开启,可通过 Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION 意图跳转。 |
| PACKAGE_USAGE_STATS | 允许应用获取其他应用的使用情况(如启动次数、使用时长)。 | Android 5.0+ | 需在「设置 > 应用 > 特殊应用权限 > 应用使用情况访问权限」中开启,可通过 Settings.ACTION_USAGE_ACCESS_SETTINGS 意图跳转。 |
| ACTIVITY_RECOGNITION | 允许应用识别用户的物理活动(如步行、跑步、乘车,原属于危险权限)。 | Android 10+ | Android 10+ 起归类为特殊权限,需在设置中开启,或通过动态申请(部分设备支持弹窗)。 |
| BLUETOOTH_ADVERTISE | 允许应用通过蓝牙广播(BLE)发送数据(如 Beacon 信号)。 | Android 12+ | 需在设置中开启蓝牙相关权限,部分场景支持动态申请。 |
| BLUETOOTH_CONNECT | 允许应用连接到已配对的蓝牙设备。 | Android 12+ | 需在设置中开启,或在应用运行时动态申请(需用户触发操作)。 |
| BLUETOOTH_SCAN | 允许应用扫描蓝牙设备(包括未配对设备)。 | Android 12+ | 需在设置中开启,或动态申请(若需扫描所有设备,还需额外声明 ACCESS_FINE_LOCATION)。 |
5.2关键特点总结
(1)手动授权:特殊权限必须由用户在系统设置页面主动开启,应用无法通过 requestPermissions() 直接弹窗申请。
(2)意图跳转:应用需通过指定的 Intent 引导用户到对应设置页面(如 Settings.ACTION_MANAGE_OVERLAY_PERMISSION)。
(3)版本依赖:部分特殊权限是高版本新增(如 MANAGE_EXTERNAL_STORAGE 仅 Android 11 + 支持),需做好版本适配。
(4)功能敏感:这些权限通常涉及系统级行为控制(如悬浮窗、后台定位),滥用可能影响用户体验,需谨慎申请。
实际开发中,应仅在必要时使用特殊权限,并通过清晰的引导说明权限用途,提升用户授权意愿。
6.Android 需要动态申请的权限有哪些?
Android 权限分为普通权限(Normal Permissions)和危险权限(Dangerous Permissions)。其中,危险权限需要动态申请(即运行时向用户请求授权),因为这些权限涉及用户隐私或可能影响设备安全。
6.1常见的需要动态申请的危险权限包括哪些?
- 相机(CAMERA)
- 麦克风(RECORD_AUDIO)
- 位置信息(ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION)
- 存储访问(READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE,Android 13+ 拆分为更细粒度的媒体权限)
- 联系人(READ_CONTACTS、WRITE_CONTACTS)
- 电话(READ_PHONE_STATE、CALL_PHONE)
- 短信(SEND_SMS、READ_SMS)
- 日历(READ_CALENDAR、WRITE_CALENDAR)
- 身体传感器(BODY_SENSORS)等。
7. 什么是权限组?
权限组(Permission Groups)是 Android 将功能相似、用途相关的权限归类后的集合。其设计目的是简化权限管理:当用户授予某个权限组中的一个权限时,系统会自动授予该组内的其他权限(部分场景下),避免用户频繁授权。
例如:STORAGE 权限组包含 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE,用户授予其中一个后,通常会自动获得另一个的授权。
7.1Android 有哪些权限组?
Android 系统定义了多个权限组,每个组包含若干具体权限。常见的权限组如下(不同 Android 版本可能略有调整):
| 权限组名称 | 包含的典型权限 |
|---|---|
| CAMERA | CAMERA(相机访问) |
| MICROPHONE | RECORD_AUDIO(录音) |
| LOCATION | ACCESS_FINE_LOCATION(精确位置)、ACCESS_COARSE_LOCATION(粗略位置) |
| STORAGE | READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE(存储访问,Android 13+ 拆分) |
| CONTACTS | READ_CONTACTS、WRITE_CONTACTS、GET_ACCOUNTS(联系人访问) |
| CALENDAR | READ_CALENDAR、WRITE_CALENDAR(日历访问) |
| SMS | SEND_SMS、READ_SMS、RECEIVE_SMS(短信相关) |
| PHONE | READ_PHONE_STATE、CALL_PHONE、READ_CALL_LOG(电话相关) |
| BODY_SENSORS | BODY_SENSORS(身体传感器,如心率传感器) |
| ACTIVITY_RECOGNITION | ACTIVITY_RECOGNITION(活动识别,如步数统计) |
7.2如何申请权限组权限?
申请权限组中的权限需遵循 “声明 - 检查 - 请求 - 回调” 四步流程,核心是通过系统 API 在运行时向用户请求授权:
7.2.1步骤 1:在 Manifest 中声明权限
无论是否需要动态申请,都需在 AndroidManifest.xml 中声明权限,例如申请相机权限:
<uses-permission android:name="android.permission.CAMERA" />
7.2.2步骤 2:检查权限是否已授予
在代码中通过 ContextCompat.checkSelfPermission() 检查权限状态:
// 检查相机权限是否已授予
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// 未授予,需要申请
}
7.2.3步骤 3:请求权限
若未授予权限,通过 ActivityCompat.requestPermissions() 向用户弹窗请求:
// 请求相机权限(可同时请求多个权限,放入数组)
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.CAMERA},
REQUEST_CAMERA_PERMISSION // 自定义请求码,用于回调识别
);
7.2.4步骤 4:处理权限请求结果
重写 onRequestPermissionsResult() 回调方法,判断用户是否授予权限:
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户授予权限,执行相关操作(如打开相机)
} else {
// 用户拒绝权限,可提示用户权限的必要性
}
}
}
7.2.5注意
(1)申请权限组中的任一权限时,系统弹窗会显示该权限组的名称(而非具体权限名),用户授予后,组内其他权限通常会自动生效。
(2)对于 Android 10+,部分权限(如后台位置)需要额外声明和申请。
(3)若用户勾选 “不再询问”,需引导用户到应用设置页面手动开启权限。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)