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)若用户勾选 “不再询问”,需引导用户到应用设置页面手动开启权限。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐