Android 权限查询
60 多条常用权限的保护级别、权限组、引入版本与废弃情况都在这里。勾选需要的权限,直接拿到能粘进 AndroidManifest.xml 的声明片段;危险的权限还会附一段运行时申请的 Kotlin 代码。
显示 67 / 67 条,已选 0 条
权限常量对照表
| 选 | 权限 | 保护级别 | 运行时申请 | 权限组 / 引入 | 复制 |
|---|---|---|---|---|---|
| android.permission.READ_EXTERNAL_STORAGE 读取外部存储 读取其他应用写进外部存储的文件,包括相册、下载目录里的内容。 注意:targetSdk 33 以上的应用申请它,系统会直接忽略;但为了兼容旧系统,manifest 里通常仍然保留,并用 maxSdkVersion 限制生效范围。 已废弃:Android 13(API 33)起对 targetSdk 33 的应用不再生效,读取媒体请改用 READ_MEDIA_IMAGES / READ_MEDIA_VIDEO / READ_MEDIA_AUDIO | 危险 | 需要 | 存储 API 16 | ||
| android.permission.WRITE_EXTERNAL_STORAGE 写入外部存储 在外部存储公共目录里创建和修改文件。 注意:现在写自己的外部目录、媒体集合、Downloads 都不需要这个权限,往公共目录塞任意文件要走 MediaStore 或 SAF。 已废弃:Android 10(API 29)起分区存储生效后基本无用,Android 11 起 targetSdk 30 的应用即使申请也不再被授予 | 危险 | 需要 | 存储 API 1 | ||
| android.permission.MANAGE_EXTERNAL_STORAGE 所有文件访问权限(细节请以官方文档为准) 读写外部存储上的任意文件,不只是自己的目录和媒体文件。 注意:官方名是「所有文件访问权限」,要跳 Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION 由用户开关;上架 Google Play 需要说明理由(文件管理器、备份工具等),审核很严。官方文档把它写作 signature|appop|preinstalled 之类的组合值,这里归入特殊权限。 | 特殊 | 不需要 | 存储 API 30 | ||
| android.permission.ACCESS_MEDIA_LOCATION 读取照片位置信息(细节请以官方文档为准) 读取图片 EXIF 里的真实地理位置,Android 10 起默认被抹掉。 注意:它只影响读取照片里的位置,不改动照片本身;官方没有把它归进 STORAGE 这类公开权限组,表里为了归类放在「存储」下,以官方文档为准。 | 危险 | 需要 | 存储 API 29 | ||
| android.permission.READ_MEDIA_IMAGES 读取图片 读取相册里的图片,Android 13 起取代 READ_EXTERNAL_STORAGE 的媒体部分。 注意:只给图片,不给视频和音频。targetSdk 33 起这条与 READ_MEDIA_VIDEO、READ_MEDIA_AUDIO 之间彼此独立,用户可以不一起同意。 | 危险 | 需要 | 媒体 API 33 | ||
| android.permission.READ_MEDIA_VIDEO 读取视频 读取相册里的视频文件。 | 危险 | 需要 | 媒体 API 33 | ||
| android.permission.READ_MEDIA_AUDIO 读取音频 读取音乐与录音等音频文件。 | 危险 | 需要 | 媒体 API 33 | ||
| android.permission.READ_MEDIA_VISUAL_USER_SELECTED 读取用户选中的图片视频(细节请以官方文档为准) Android 14 的「选中部分照片」:用户只授权选中的那几张,应用只能读到它们。 注意:和 READ_MEDIA_IMAGES / READ_MEDIA_VIDEO 一起申请时,用户可以只选一部分;此时这两条权限不会被授予。保护级别的官方写法请以文档为准。 | 危险 | 需要 | 媒体 API 34 | ||
| android.permission.ACCESS_FINE_LOCATION 精确位置 通过 GPS、Wi-Fi、基站拿到米级精度的位置。 注意:Android 12 起用户可以在对话框里选择只给「大致位置」,此时系统只授予 ACCESS_COARSE_LOCATION;所以代码里必须两种精度都能跑。 | 危险 | 需要 | 位置 API 1 | ||
| android.permission.ACCESS_COARSE_LOCATION 大致位置 城市街区级别的定位,精度约几公里。 注意:在 Android 12 及以上,用户可能只同意这一条;只申请大致位置时也不能偷偷要求精确位置。 | 危险 | 需要 | 位置 API 1 | ||
| android.permission.ACCESS_BACKGROUND_LOCATION 后台位置 应用退到后台后继续定位,Android 10 起单独拆出来的权限。 注意:Android 11 起不能和前台位置权限一起申请:要么先拿前台位置,再单独申请它(会跳到设置页),要么直接跟用户说明用途引导过去。用户选择「仅在使用时允许」时这条不会授予。 | 危险 | 需要 | 位置 API 29 | ||
| android.permission.CAMERA 相机 打开摄像头拍照、录像,也用于扫码。 注意:只读取相册不需要这条权限;Android 11 起如果应用在后台使用相机,会被系统直接掐断。 | 危险 | 需要 | 相机 API 1 | ||
| android.permission.RECORD_AUDIO 麦克风 录制音频、语音识别、通话降噪等。 注意:Android 11 起前台服务里用麦克风需要在 manifest 里声明对应的服务类型;Android 14 起还要额外声明 FOREGROUND_SERVICE_MICROPHONE。 | 危险 | 需要 | 麦克风 API 1 | ||
| android.permission.READ_CONTACTS 读取联系人 读取通讯录里的联系人、最近联系记录与资料。 | 危险 | 需要 | 联系人 API 1 | ||
| android.permission.WRITE_CONTACTS 写入联系人 新增、修改、删除通讯录条目。 | 危险 | 需要 | 联系人 API 1 | ||
| android.permission.GET_ACCOUNTS 读取账户列表(细节请以官方文档为准) 列出设备上已登录的账户(Google、厂商账号等)。 注意:它属于联系人组,很多人以为它是普通权限。实际只拿账户名时也可以考虑 AccountManager 的授权流程。 | 危险 | 需要 | 联系人 API 5 前后 | ||
| android.permission.READ_CALENDAR 读取日历 读取用户日历里的日程与提醒。 | 危险 | 需要 | 日历 API 1 | ||
| android.permission.WRITE_CALENDAR 写入日历 新增、修改、删除日历事件。 | 危险 | 需要 | 日历 API 1 | ||
| android.permission.SEND_SMS 发送短信 直接调用短信通道发送消息。 注意:Google Play 只允许默认短信应用申请它;普通应用发短信应该用 SENDTO 跳系统短信界面。 | 危险 | 需要 | 短信 API 1 | ||
| android.permission.RECEIVE_SMS 接收短信 监听并读取新收到的短信内容。 注意:Play 政策限制同样严格,非默认短信应用申请会要求额外审核;读取验证码应考虑 SMS Retriever API,不需要这条权限。 | 危险 | 需要 | 短信 API 1 | ||
| android.permission.READ_SMS 读取短信 读取短信数据库里的历史消息。 注意:Play 上仅默认短信应用可用。 | 危险 | 需要 | 短信 API 1 | ||
| android.permission.RECEIVE_MMS 接收彩信 监听新收到的彩信。 | 危险 | 需要 | 短信 API 1 | ||
| android.permission.RECEIVE_WAP_PUSH 接收 WAP 推送 接收运营商通过 WAP 通道下发的推送(含 MMS 通知)。 | 危险 | 需要 | 短信 API 1 | ||
| android.permission.CALL_PHONE 直接拨号 不经过系统拨号界面直接拨出电话。 注意:只想跳到拨号盘的话用 ACTION_DIAL,不需要任何权限。 | 危险 | 需要 | 电话 API 1 | ||
| android.permission.READ_PHONE_STATE 读取电话状态 读取通话状态、运营商信息、网络类型等。 注意:Android 10 起第三方应用拿不到 IMEI、序列号等设备标识(需要 READ_PRIVILEGED_PHONE_STATE,只给系统应用),这条权限现在主要用于通话状态与运营商信息。 | 危险 | 需要 | 电话 API 1 | ||
| android.permission.READ_PHONE_NUMBERS 读取本机号码 Android 8.0 起从电话状态里拆出来的权限,用于读取本机号码。 注意:很多 ROM 上本机号码本身是空的,拿不到不代表代码写错了。 | 危险 | 需要 | 电话 API 26 | ||
| android.permission.ANSWER_PHONE_CALLS 接听电话 以编程方式接听来电。 注意:Play 上基本只给默认拨号应用。 | 危险 | 需要 | 电话 API 26 | ||
| android.permission.READ_CALL_LOG 读取通话记录 读取通话记录列表。 注意:Android 9 起从电话组拆到通话记录组;Play 上只给默认拨号应用或需要通话相关核心功能的应用。 | 危险 | 需要 | 通话记录 API 16 | ||
| android.permission.WRITE_CALL_LOG 写入通话记录 修改或插入通话记录条目。 注意:默认拨号应用写自己的通话记录不需要它,只有改别人的记录才需要。 | 危险 | 需要 | 通话记录 API 16 | ||
| android.permission.PROCESS_OUTGOING_CALLS 处理拨出电话 监听拨出号码并可以改写它。 注意:新代码不要再申请,用 CallRedirectionService 处理号码重写。 已废弃:Android 10(API 29)起废弃,由 CallRedirectionService 取代 | 危险 | 需要 | 通话记录 API 1 | ||
| android.permission.BODY_SENSORS 身体传感器 读取心率等来自体表传感器的数据。 注意:Android 13 起,应用在后台读取这类传感器还要 BODY_SENSORS_BACKGROUND。 | 危险 | 需要 | 身体传感器 API 20 | ||
| android.permission.BODY_SENSORS_BACKGROUND 后台身体传感器(细节请以官方文档为准) 应用退到后台后继续读取心率等体表传感器。 注意:上架 Google Play 需要声明用途,审核对健康类数据的后台访问很敏感。 | 危险 | 需要 | 身体传感器 API 33 | ||
| android.permission.HIGH_SAMPLING_RATE_SENSORS 高采样率传感器(细节请以官方文档为准) 以高于 200 Hz 的频率读取传感器数据。 注意:普通权限,装着就能用,但超过 200 Hz 的采样仍会被系统限流,需要这条权限才能解锁。 | 普通 | 不需要 | 身体传感器 API 31 | ||
| android.permission.ACTIVITY_RECOGNITION 身体活动识别 读取步数、走路骑车等运动状态。 注意:Android 9 及以前用的是 Google Fit 的 com.google.android.gms.permission.ACTIVITY_RECOGNITION,所以兼容代码要把两条都写进 manifest。 | 危险 | 需要 | 身体活动 API 29 | ||
| android.permission.POST_NOTIFICATIONS 发送通知 Android 13 起,弹出通知需要用户同意。 注意:targetSdk 33 的应用如果没申请,通知会被系统直接丢掉而且不报错;通知渠道仍然要自己建,两者是两件事。 | 危险 | 需要 | 通知 API 33 | ||
| android.permission.BLUETOOTH 蓝牙 配对与连接经典蓝牙设备。 注意:为了兼容 Android 11 及以下,manifest 里仍然要保留,并加 android:maxSdkVersion="30"。 已废弃:Android 12(API 31)起被 BLUETOOTH_SCAN / CONNECT / ADVERTISE 取代 | 普通 | 不需要 | 附近设备 API 1 | ||
| android.permission.BLUETOOTH_ADMIN 蓝牙管理 开关蓝牙、发起扫描与配对。 注意:同样建议加 android:maxSdkVersion="30"。 已废弃:Android 12(API 31)起同样被新蓝牙权限取代 | 普通 | 不需要 | 附近设备 API 1 | ||
| android.permission.BLUETOOTH_SCAN 扫描蓝牙设备 扫描附近的蓝牙与 BLE 设备。 注意:只想扫描不想定位的话,可以加 android:usesPermissionFlags="neverForLocation",就不用再要位置权限;反过来,若声称从不用于定位却被检测到推断位置,会被 Play 下架。 | 危险 | 需要 | 附近设备 API 31 | ||
| android.permission.BLUETOOTH_CONNECT 连接蓝牙设备 连接已配对的蓝牙设备并读写其特征。 | 危险 | 需要 | 附近设备 API 31 | ||
| android.permission.BLUETOOTH_ADVERTISE 蓝牙广播 让本机以 BLE 外设身份对外广播。 | 危险 | 需要 | 附近设备 API 31 | ||
| android.permission.NEARBY_WIFI_DEVICES 附近 Wi-Fi 设备(细节请以官方文档为准) Android 13 起管理本机与附近 Wi-Fi 设备的交互(Wi-Fi Direct、热点等)。 注意:保护级别的官方写法以及是否能靠 neverForLocation 免掉位置权限,请以官方文档为准;不确定时同时声明位置权限最稳妥。 | 危险 | 需要 | 附近 Wi-Fi 设备 API 33 | ||
| android.permission.INTERNET 访问网络 打开网络套接字,任何联网操作的前提。 | 普通 | 不需要 | 系统与常规 API 1 | ||
| android.permission.ACCESS_NETWORK_STATE 读取网络状态 查询当前是否有网络、是 Wi-Fi 还是移动数据。 | 普通 | 不需要 | 系统与常规 API 1 | ||
| android.permission.ACCESS_WIFI_STATE 读取 Wi-Fi 状态 读取 Wi-Fi 开关状态与连接信息。 注意:Android 6.0 到 12 之间,想拿到 SSID、BSSID 这类信息还要位置权限;Android 13 起对应的是 NEARBY_WIFI_DEVICES。 | 普通 | 不需要 | 系统与常规 API 1 | ||
| android.permission.CHANGE_WIFI_STATE 修改 Wi-Fi 状态 开关 Wi-Fi、连接指定的网络。 注意:能连的网络要在代码里给凭据,用户看到的仍然是「应用要求连接 Wi-Fi」的系统提示。 | 普通 | 不需要 | 系统与常规 API 1 | ||
| android.permission.CHANGE_NETWORK_STATE 修改网络状态 改变网络连接状态,例如切换数据网络。 | 普通 | 不需要 | 系统与常规 API 1 | ||
| android.permission.WAKE_LOCK 保持唤醒 申请电源锁,让 CPU 或屏幕在任务期间不被休眠。 注意:漏掉释放会造成耗电异常,是电量和后台被杀问题的常见来源。 | 普通 | 不需要 | 系统与常规 API 1 | ||
| android.permission.VIBRATE 振动 控制振动器,用于通知与触感反馈。 | 普通 | 不需要 | 系统与常规 API 1 | ||
| android.permission.RECEIVE_BOOT_COMPLETED 开机自启 在系统启动完成后收到广播,用来恢复闹钟、同步等。 注意:权限是普通的,但国内 ROM 普遍还有自己的自启开关;广播接收器是否生效还要看它在哪个进程里被拉起。 | 普通 | 不需要 | 系统与常规 API 1 | ||
| android.permission.NFC NFC 读写 NFC 标签、做近场通信。 | 普通 | 不需要 | 系统与常规 API 9 | ||
| android.permission.MODIFY_AUDIO_SETTINGS 修改音频设置 调整音量、音频路由与音频模式。 | 普通 | 不需要 | 系统与常规 API 1 | ||
| android.permission.FOREGROUND_SERVICE 前台服务 启动前台服务,让任务在后台继续跑并显示常驻通知。 注意:Android 12 起前台服务不能再从后台随便启动;Android 14 起还要为服务的每种类型单独声明 FOREGROUND_SERVICE_* 权限。 | 普通 | 不需要 | 系统与常规 API 28 | ||
| android.permission.FOREGROUND_SERVICE_LOCATION 前台服务·位置(细节请以官方文档为准) 前台服务里使用位置信息时需要额外声明。 注意:要同时具备 ACCESS_FINE_LOCATION 与 ACCESS_COARSE_LOCATION 才能启动这类服务,且服务类型要在 manifest 里写成 location。 | 普通 | 不需要 | 系统与常规 API 34 | ||
| android.permission.FOREGROUND_SERVICE_CAMERA 前台服务·相机(细节请以官方文档为准) 前台服务里使用相机时需要额外声明。 | 普通 | 不需要 | 系统与常规 API 34 | ||
| android.permission.FOREGROUND_SERVICE_MICROPHONE 前台服务·麦克风(细节请以官方文档为准) 前台服务里录音时需要额外声明。 | 普通 | 不需要 | 系统与常规 API 34 | ||
| android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK 前台服务·媒体播放(细节请以官方文档为准) 前台服务里播放音视频时需要额外声明。 | 普通 | 不需要 | 系统与常规 API 34 | ||
| android.permission.QUERY_ALL_PACKAGES 查询所有应用(细节请以官方文档为准) 绕过 Android 11 的软件包可见性限制,看到设备上安装的全部应用。 注意:保护级别是普通,但 Google Play 对它有单独的政策限制:必须属于允许的用途(安全、文件管理、启动器等),否则会被拒审。更好的做法是用 queries 元素声明要查的包名或 intent。 | 普通 | 不需要 | 系统与常规 API 30 | ||
| android.permission.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION 动态注册接收器兜底 系统为 Android 13 上动态注册非导出接收器自动加上的自定义权限。 注意:不用手写,AndroidX 会注入;了解它的存在可以少一次「这个权限哪来的」的困惑。 | 普通 | 不需要 | 系统与常规 API 33 | ||
| android.permission.USE_EXACT_ALARM 使用精确闹钟 Android 13 起闹钟、日历这类应用可以直接使用精确闹钟。 注意:Play 政策只允许闹钟与日历类应用申请;其他应用要走 SCHEDULE_EXACT_ALARM 并在设置里请用户开启。 | 普通 | 不需要 | 系统与常规 API 33 | ||
| android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 请求忽略电池优化 申请把应用加入电池优化白名单,减少后台被杀。 注意:要用 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 拉起系统对话框,用户拒绝后不能反复弹;Play 只允许在核心功能确实需要常驻时使用。 | 特殊 | 不需要 | 特殊权限 API 23 | ||
| android.permission.SCHEDULE_EXACT_ALARM 申请精确闹钟(细节请以官方文档为准) 申请以精确时间唤醒设备的能力(AppOps 控制)。 注意:Android 13 起要在设置里请用户开启(ACTION_REQUEST_SCHEDULE_EXACT_ALARM),Android 14 起对大多数应用默认不授予;不确定时用 canScheduleExactAlarms() 先判断,别直接崩溃。 | 特殊 | 不需要 | 特殊权限 API 31 | ||
| android.permission.SYSTEM_ALERT_WINDOW 悬浮窗(细节请以官方文档为准) 在其他应用之上绘制内容,包括悬浮球、弹幕、调试工具。 注意:要用 Settings.canDrawOverlays() 判断,再用 ACTION_MANAGE_OVERLAY_PERMISSION 跳设置页;官方把它写作 signature|setup|appop 之类的组合值,所以这里归入特殊权限。 | 特殊 | 不需要 | 特殊权限 API 1 | ||
| android.permission.WRITE_SETTINGS 修改系统设置(细节请以官方文档为准) 修改亮度、铃声等系统设置。 注意:同样要跳 ACTION_MANAGE_WRITE_SETTINGS 由用户开启;Android 6.0 起不再随对话框授予。 | 特殊 | 不需要 | 特殊权限 API 1 | ||
| android.permission.PACKAGE_USAGE_STATS 应用使用情况 读取应用使用统计,用于屏幕时间、数字健康类功能。 注意:必须用 ACTION_USAGE_ACCESS_SETTINGS 跳设置页,再通过 AppOpsManager 检查是否开启;申请对话框申请不到它。 | 特殊 | 不需要 | 特殊权限 API 21 | ||
| android.permission.REQUEST_INSTALL_PACKAGES 安装其他应用(细节请以官方文档为准) 通过 Intent 安装 APK 文件。 注意:配合「安装未知应用」开关使用,用户需要在设置里为这个应用单独打开;Play 政策对自更新、应用商店类用途限制很严。保护级别的官方写法请以文档为准。 | 特殊 | 不需要 | 特殊权限 API 26 | ||
| android.permission.REBOOT 重启设备 让系统重启。 注意:只有系统签名应用拿得到,这里留作签名级权限的示例:普通应用写进 manifest 也不会被授予,运行时申请必然失败。 | 签名 | 不需要 | 特殊权限 API 1 | ||
| android.permission.WRITE_SECURE_SETTINGS 修改安全设置 修改系统安全相关设置,涵盖的开发选项与权限开关。 注意:调试时可以用 adb shell pm grant 临时授予,这正是「系统权限为什么调试能过、上线就崩」的典型原因。 | 签名 | 不需要 | 特殊权限 API 1 |
已选权限与清单片段
还没有选中任何权限。可以在上面的表里勾选,或者直接点下面「常见场景的推荐组合」里的按钮,一键带出一整套。
常见场景的推荐组合
点一下整体替换当前选择。每组都考虑了新老系统的差别,比如读取相册会同时给出媒体权限和带版本上限的旧存储权限。
使用说明
这张表按「查得到、看得懂、拷得走」来组织:每条权限给出常量全名、中文名、一句话说明,再标注保护级别、是否需要运行时申请、所属权限组和引入版本。保护级别用的是归档后的五类——普通、危险、签名、签名或系统、特殊。普通权限装上就有,只要在 manifest 里声明;危险权限涉及隐私数据,从 Android 6.0(API 23)起必须在代码里申请;签名权限只有与系统同签名的应用才拿得到,第三方应用写了也不会被授予;特殊权限是我为了区分「要跳设置页单独开关」这一类而单独归的,官方文档里多写成 signature|appop 之类的组合值,凡是拿不准的条目都标了「请以官方文档为准」。
运行时权限的完整链路是「manifest 声明 + 代码申请 + 用户同意」三步,少任何一步都拿不到权限,而且失败的方式还不一样:manifest 没声明时申请会被系统直接拒绝,连对话框都不弹;代码里没申请时 checkSelfPermission 一直是 denied;用户拒绝过两次或勾了「不再询问」之后,再申请也不会弹框,只能自己判断并跳应用设置页。判断方法是用 shouldShowRequestPermissionRationale:返回 true 说明还能再弹一次,可以和用户解释用途;返回 false 而权限又没授予,那就是被永久拒绝了。页面里生成的 Kotlin 片段只负责第二步,声明部分由上面的 manifest 片段补齐。
权限组与「同组自动授予」这个坑
权限组是系统为了少弹对话框而做的分组,它带来过一个很常见的误判。Android 8.0(API 26)以前,同一组里只要有一条权限被授予,同组的其他权限会被一并标记为已授予;Android 8.0 起收紧了:系统只授予你当次申请的那一条,但之后再去申请同组权限会静默通过、不再弹框,于是「没单独申请却也到手了」的现象依然存在。开发者在代码里申请了两条同组权限、看到两条都通过,就以为自己的申请逻辑生效了,其实第二条是随组赠送的。Google 官方现在明确说不要依赖分组,因为组内成员随时可能调整,再加上各厂商 ROM 的差异,正确做法是按功能逐条声明、逐条申请;反过来也要注意,用户在设置里关掉「联系人」整组时,你依赖的那几条也会一起失效。表里的权限组列保留官方分组名只为方便对照,不代表组内权限可以互相代替。
存储与位置这两块变化最大
存储权限是十几年里改动最多的一块。READ_EXTERNAL_STORAGE 与 WRITE_EXTERNAL_STORAGE 曾经是标配,如今:Android 10 引入分区存储,应用往自己的目录、媒体集合、下载目录写文件不再需要写权限;Android 11 起 targetSdk 30 的应用申请 WRITE_EXTERNAL_STORAGE 也不再被授予;Android 13 起 targetSdk 33 的应用申请 READ_EXTERNAL_STORAGE 会被直接忽略,读图片、视频、音频分别改用 READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO,Android 14 又补了「选中部分照片」的 READ_MEDIA_VISUAL_USER_SELECTED。所以兼容写法的核心就是用 android:maxSdkVersion 把旧权限限制在老系统上,让新系统只看到新的权限。
位置权限则是在「精度」和「时长」两个维度被不断细分:精度上,Android 12 起用户可以在对话框里选择只给大致位置,此时只有 ACCESS_COARSE_LOCATION 被授予;时长上,Android 10 拆出 ACCESS_BACKGROUND_LOCATION,Android 11 起「仅这一次」的授权会在应用退到后台一段时间后被收回,而后台位置必须单独引导用户去设置页选「始终允许」,不能和前台位置一起申请。做地图、跑步、打卡这类功能时,先想清楚「退到后台还要不要定位」,再决定要不要碰后台权限。
怎么确认自己手上这台设备到底怎么判
文档与设备实际行为有时会有差距,尤其是厂商 ROM 和较新的 Android 版本。下面的命令可以通过 adb 直接查设备上的真实情况,比任何速查表都准;表里的保护级别、是否需要运行时申请这些结论也都应该以设备输出和官方文档为准。另外提醒一句:权限是应用能在系统里做什么的开关,不是数据安全的边界——装在用户设备上的应用,客户端拿到的密钥和接口地址最终都是可以被人翻出来的,敏感的判定逻辑要放在服务端。
| 用途 | 命令 | 复制 |
|---|---|---|
| 看设备系统版本与 API 级别 两条属性分别给出 Android 版本号与 API 级别,判断权限行为要看的是 API 级别。 | adb shell getprop ro.build.version.release; adb shell getprop ro.build.version.sdk | |
| 看某条权限的保护级别 在权限相关的输出里能看到 protectionLevel,这是设备实际认的级别,比文档更贴近手上的这台机器。 | adb shell dumpsys package android.permission.CAMERA | |
| 看某个应用拿了哪些权限 列出的 granted=true / false 就是运行时权限的实际状态,排查「明明申请了却没生效」时最有用。 | adb shell dumpsys package com.example.app | grep -A 40 "runtime permissions" | |
| 临时授予签名级权限 调试时才有效,重启或重新安装后会失效;用于验证权限本身而不是绕过它。 | adb shell pm grant com.example.app android.permission.WRITE_SECURE_SETTINGS |
最后补一句关于时效性:权限的行为几乎每个大版本都在动,这张表以 Android 13 及之后的版本为准整理,凡是我没有把握的地方都标了「请以官方文档为准」,核对时优先看 Android 开发者文档里权限那一节的 Added in / protectionLevel,以及各版本的「行为变更」说明。权限相关的调试经常要连着看接口返回,需要把请求转成 curl 或代码可以用curl 转代码,适配不同屏幕密度和分辨率可以用屏幕分辨率查询。
五个保护级别分别意味着什么
| 级别 | 条数 | 含义与申请方式 |
|---|---|---|
| 普通 | 21 | 装上就生效,只要在 manifest 里声明 不需要运行时申请 |
| 危险 | 37 | 涉及隐私数据,Android 6.0 起必须运行时申请 需要运行时申请,且必须在 manifest 里声明 |
| 签名 | 2 | 只有与系统同签名的应用才能拿到,第三方应用申请也拿不到 不需要运行时申请,写了也没用 |
| 签名或系统 | 0 | 系统镜像里的应用,或与平台同签名的应用 不需要运行时申请 |
| 特殊 | 7 | 不能靠对话框申请,要跳到设置里由用户手动开关(AppOps) 不走运行时权限对话框,需要跳设置页 |
签名或系统这一类权限基本不会出现在普通应用的清单里,本表没有收录条目;表里出现的分组说明同样只作对照用。
| 权限组 | 条数 | 覆盖范围 |
|---|---|---|
| 存储 | 4 | 读写外部存储与媒体文件,Android 13 起被细分成媒体权限 |
| 位置 | 3 | 前台与后台定位,Android 10 起拆出后台定位 |
| 相机 | 1 | 拍照与录像,不含只读取相册 |
| 麦克风 | 1 | 录音与语音输入 |
| 联系人 | 3 | 读取与写入通讯录、账户列表 |
| 日历 | 2 | 读取与写入日程 |
| 短信 | 5 | 收发短信、彩信与 WAP 推送 |
| 电话 | 4 | 拨号、读取电话状态与号码 |
| 通话记录 | 3 | 读写通话记录,Android 9 起移出电话组 |
| 身体传感器 | 3 | 心率等来自体表传感器的数据 |
| 身体活动 | 1 | 计步与运动识别,Android 10 起独立成组 |
| 媒体 | 4 | Android 13 起细分的图片、视频、音频读取权限;官方把图片与视频归在 READ_MEDIA_VISUAL、音频单独归在 READ_MEDIA_AURAL 两个组里,表里为便于阅读统称媒体 |
| 附近设备 | 5 | 蓝牙扫描与连接,Android 12 起取代旧蓝牙权限 |
| 附近 Wi-Fi 设备 | 1 | Android 13 起管理 Wi-Fi 设备发现 |
| 通知 | 1 | Android 13 起发通知也要用户同意 |
| 系统与常规 | 18 | 网络、唤醒锁这类装上就能用的普通权限 |
| 特殊权限 | 8 | 悬浮窗、修改系统设置这类要在设置页单独开关的权限 |
常见问题
只申请了读取联系人,为什么写入联系人也直接通过了?
这是权限组的老行为:同一组里只要有一条被授予,同组的其他权限会被系统一并标记为已授予。它从 Android 8.0(API 26)起收了紧——系统只授予你当次申请的那一条,但之后再申请同组权限会静默通过、不再弹框,所以给人的感觉依然像「没单独申请也到手了」。存储组、联系人组、位置组最容易撞上这个坑,很多人因此误以为是自己代码里的两条申请都生效了。Google 官方明确说过不要依赖分组,因为组内成员随时可能调整;正确做法是按功能逐条声明、逐条申请自己真正需要的权限。
manifest 里声明了权限,运行时还是拿不到,为什么?
两件事得同时成立:manifest 里声明,代码里申请。危险权限从 Android 6.0(API 23)起必须用 requestPermissions 或 ActivityResult API 主动申请,只写 manifest 不会自动授予;反过来,manifest 里没声明的权限再怎么申请都会被系统直接拒绝,而且不会弹任何对话框。用户点了拒绝之后还有一层:可以继续申请的(能再弹一次)和「不再询问」的(后面必须跳应用设置页),判断方法是看 shouldShowRequestPermissionRationale 是否返回 false。
targetSdk 跟权限有什么关系,为什么升级 targetSdk 之后权限行为就变了?
系统的权限与存储行为是按应用的 targetSdk 决定的,不是按设备的系统版本。targetSdk 33 的应用申请 READ_EXTERNAL_STORAGE 会被直接忽略,只能改用 READ_MEDIA_IMAGES 这类媒体权限;targetSdk 30 起分区存储强制生效,写公共目录必须走 MediaStore。所以「同一个权限在旧项目里好使、新项目里不行」通常不是设备问题,而是 targetSdk 升级触发了新规则。
Android 13 起读取相册到底该申请哪几条权限?
读图片用 READ_MEDIA_IMAGES,读视频用 READ_MEDIA_VIDEO,两条是独立的,用户可以只同意其中一条。要兼容旧系统就同时保留 READ_EXTERNAL_STORAGE,并用 android:maxSdkVersion="32" 把它限制在 Android 12L 及以前生效,这样新系统上它不会参与申请。音频要单独用 READ_MEDIA_AUDIO。Android 14 又多了「选中部分照片」,用户只授权选中的那几张时得到的是 READ_MEDIA_VISUAL_USER_SELECTED。
「仅在使用时允许」「仅这一次」「始终允许」分别在什么时候出现?
位置权限的对话框从 Android 11(API 30)开始提供「仅这一次」,授权只在本次前台会话内有效,应用退到后台一段时间后会被收回;「仅在使用时允许」对应前台位置;「始终允许」对应 ACCESS_BACKGROUND_LOCATION,从 Android 11 起不能和前台位置一起申请,只能先拿到前台位置,再单独引导用户去设置页选。Android 12 起用户还能在对话框里选择只给大致位置,于是 ACCESS_FINE_LOCATION 可能被拒而 ACCESS_COARSE_LOCATION 被授予,代码必须两种精度都能跑。
后台位置权限为什么一直申请失败?
因为它不能通过权限对话框拿到。Android 11 起 ACCESS_BACKGROUND_LOCATION 必须单独申请,系统会直接把用户带到设置页,在那里手动选「始终允许」;如果和前台位置一起申请,这次申请会被系统整体忽略。另外从 Android 11 左右开始,很多厂商 ROM 还会额外做一层后台限制,即使设置里选了「始终允许」,应用仍可能因为电池优化策略被限制定位,这类问题需要结合后台耗电白名单一起看。
模拟器或调试机上能用的权限,为什么上线就失败?
常见原因是权限级别不对。签名级权限(例如 REBOOT、WRITE_SECURE_SETTINGS)只有与系统同签名的应用才拿得到,调试时可以用 adb shell pm grant 临时授予,所以在本机测试通过,装到正式签名包里立刻就失败。另一类原因是分发渠道的政策:短信、通话记录、所有文件访问、查询所有应用、精确闹钟这类权限,即使技术上申请得到,上架审核也可能直接拒绝,得先用不影响功能的方案替代。
表里带「请以官方文档为准」标记的条目是什么意思?
表示这一条的保护级别或版本细节我没法百分百确定,例如特殊权限在官方文档里写作 signature|appop 这类组合值、Android 14 新增的媒体权限级别写法还在变化。与其按记忆写一个可能过时的结论,不如明确标出来。核对的办法是在自己的设备上跑 adb shell dumpsys package 加权限名,输出里的 protectionLevel 就是这台机器实际认的级别,比任何第三方速查表都可靠;接口联调时把请求转成 curl 或代码也可以用命令行工具配合。
相关:curl 转代码