news 2026/1/10 23:52:08

Android系统解决-授予管理所有文件的权限问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android系统解决-授予管理所有文件的权限问题

提示:解决授予管理所有文件的权限问题

文章目录

  • 前言
  • 一、需求-场景
  • 二、参考文档
  • 三、部分源码分析
    • 1、定位授权页面ManageExternalStorageDetails
    • 2、ManageExternalStorageDetails 源码分析
      • 类注释分析
    • 3、权限开关设置-setManageExternalStorageState - mAppOpsManager.setUidMode
  • 四、解决方案
  • 五、延伸知识点-AppOpsManager.setUidMode 对应的 ADB 命令
    • 1、完整的 ADB 命令语法
      • 基本语法
      • OP_CODE 列表
      • 权限相关MODE 值
    • 2、实际使用示例
      • 设置所有文件访问权限
      • 存储权限相关
      • 位置权限
      • 其他常用权限
    • 3、查询和检查命令
      • 查询应用当前的权限设置
      • 重置权限
      • 查看详细权限信息
    • 4、完整的脚本示例
      • 批量设置权限脚本
      • 通过 UID 设置的脚本
  • 总结

前言

Android版本一直在加,Android9/Android10/Android11/Android12/Android13/Android14/Android15 , 客户app 也在不断适配,但是存在特别是定制产品中,客户不愿意适配,啥问题都让系统解决,绕过一定机制、实现。

这里说的就是一个常见的常见需求:Android13 上面,客户要求默认授予管理所有文件的权限,如下:问题是机器重启后这个权限仍需要重新打开才行,那就是每次开机使用某些功能前都需要授权一次。

一、需求-场景

默认打开 授权管理所有文件的权限,让App 不用每次机器重启后都需要去授权。

二、参考文档

推荐如下 相关权限的笔记,之前了解过 让应用显示在其它应用的上层功能, 这里的权限需求其实后面源码核心机制一模一样。
MTK-Android12_13-显示在其它应用的上层功能默认

对于授权管理所有文件的权限,首先要明白这是个啥玩意,基本机制:其实还是Android版本的上升,不同版本对权限把控不一样,开发者需要跟随谷歌脚步不断适配才行:
管理存储设备上的所有文件
Android13适配所有文件管理权限

三、部分源码分析

1、定位授权页面ManageExternalStorageDetails

老方法,这里应该是设置界面,直接通过日志查看当前授权页面是哪个界面

2、ManageExternalStorageDetails 源码分析

类注释分析

首先看一下类注释,如下:AppOpsManager#OP_MANAGE_EXTERNAL_STORAGE这个类就是用来处理OP_MANAGE_EXTERNAL_STORAGE

/** * Class for displaying app info related to {@link AppOpsManager#OP_MANAGE_EXTERNAL_STORAGE}. */

但是:你看AppOpsManager#O和之前的笔记MTK-Android12_13-显示在其它应用的上层功能默认 太相似了,建议一起阅读,其实就是一样的类型问题。

3、权限开关设置-setManageExternalStorageState - mAppOpsManager.setUidMode

看到这些,就可以直接参考我之前的笔记了: MTK-Android12_13-显示在其它应用的上层功能默认 之前分析过一遍源码了。

所以解决方案有两个:

四、解决方案

直接执行命令:adb shell appops set com.qhjy.qxh MANAGE_EXTERNAL_STORAGE allow

那么就在系统启动后,在代码里面执行一次命令即可。

之前的笔记参考:替换命令即可

五、延伸知识点-AppOpsManager.setUidMode 对应的 ADB 命令

AppOpsManager.setUidMode是通过代码动态修改应用权限,对应的ADB命令是adb shell appops set。

1、完整的 ADB 命令语法

基本语法

# 设置单个权限 adb shell appops set<PACKAGE_NAME><OP_CODE><MODE># 按 UID 设置 adb shell appops set--uid<UID><OP_CODE><MODE>

OP_CODE 列表

以下是常见的操作代码(对应 Android 中的权限):

OP_CODE描述对应权限
MANAGE_EXTERNAL_STORAGE所有文件访问MANAGE_EXTERNAL_STORAGE
READ_EXTERNAL_STORAGE读取外部存储READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE写入外部存储WRITE_EXTERNAL_STORAGE
REQUEST_INSTALL_PACKAGES安装应用REQUEST_INSTALL_PACKAGES
SYSTEM_ALERT_WINDOW悬浮窗SYSTEM_ALERT_WINDOW
POST_NOTIFICATION通知POST_NOTIFICATION
ACCESS_FINE_LOCATION精确定位ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION粗略定位ACCESS_COARSE_LOCATION
CAMERA相机CAMERA
RECORD_AUDIO录音RECORD_AUDIO
READ_CONTACTS读取联系人READ_CONTACTS
WRITE_CONTACTS写入联系人WRITE_CONTACTS
READ_CALENDAR读取日历READ_CALENDAR
WRITE_CALENDAR写入日历WRITE_CALENDAR
ACTIVITY_RECOGNITION活动识别ACTIVITY_RECOGNITION
READ_MEDIA_AUDIO读取音频READ_MEDIA_AUDIO (Android 13+)
READ_MEDIA_VIDEO读取视频READ_MEDIA_VIDEO (Android 13+)
READ_MEDIA_IMAGES读取图片READ_MEDIA_IMAGES (Android 13+)
SCHEDULE_EXACT_ALARM精确闹钟SCHEDULE_EXACT_ALARM

权限相关MODE 值

MODE描述
allow0允许
ignore1忽略(不询问)
deny2拒绝
default3默认(根据应用 targetSdk 决定)
foreground4仅前台允许

2、实际使用示例

设置所有文件访问权限

# 给 com.example.app 授予所有文件访问权限 adb shell appops set com.example.app MANAGE_EXTERNAL_STORAGE allow # 按 UID 设置(需要先获取 UID) adb shell dumpsyspackagecom.example.app|grep userId=# 假设 UID 是10123adb shell appops set--uid10123MANAGE_EXTERNAL_STORAGE allow

存储权限相关

#Android13+的媒体权限 adb shell appops set com.example.app READ_MEDIA_IMAGES allow adb shell appops set com.example.app READ_MEDIA_VIDEO allow adb shell appops set com.example.app READ_MEDIA_AUDIO allow #Android12及以下的存储权限 adb shell appops set com.example.app READ_EXTERNAL_STORAGE allow adb shell appops set com.example.app WRITE_EXTERNAL_STORAGE allow

位置权限

# 精确定位 adb shell appops set com.example.app ACCESS_FINE_LOCATION allow # 粗略定位 adb shell appops set com.example.app ACCESS_COARSE_LOCATION allow # 设置仅前台可用 adb shell appops set com.example.app ACCESS_FINE_LOCATION foreground

其他常用权限

# 相机权限 adb shell appops set com.example.app CAMERA allow # 麦克风权限 adb shell appops set com.example.app RECORD_AUDIO allow # 悬浮窗权限 adb shell appops set com.example.app SYSTEM_ALERT_WINDOW allow # 安装应用权限 adb shell appops set com.example.app REQUEST_INSTALL_PACKAGES allow # 通知权限 adb shell appops set com.example.app POST_NOTIFICATION allow

3、查询和检查命令

查询应用当前的权限设置

# 查看所有权限状态 adb shell appops get com.example.app # 查看特定权限 adb shell appops get com.example.app MANAGE_EXTERNAL_STORAGE # 查看所有应用的某个权限 adb shell appops query-op MANAGE_EXTERNAL_STORAGE all

重置权限

# 重置单个权限 adb shell appops reset com.example.app MANAGE_EXTERNAL_STORAGE # 重置所有权限 adb shell appops reset com.example.app # 重置所有应用的所有权限 adb shell appops reset--all

查看详细权限信息

# 查看AppOps服务状态 adb shell dumpsys appops # 查看特定包的详细权限信息 adb shell dumpsyspackagecom.example.app|grep-A20-B5"AppOps"# 查看 UID 对应的包名 adb shell cmdpackagelistpackages-U

4、完整的脚本示例

便于测试使用或者系统开机统一授权

批量设置权限脚本

#!/bin/bash # grant_permissions.sh PACKAGE_NAME="com.example.app"echo"正在为 $PACKAGE_NAME 设置权限..."# 存储权限(根据Android版本)if["$(adb shell getprop ro.build.version.sdk)"-ge33];then #Android13+adb shell appops set $PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow adb shell appops set $PACKAGE_NAME READ_MEDIA_IMAGES allow adb shell appops set $PACKAGE_NAME READ_MEDIA_VIDEO allow adb shell appops set $PACKAGE_NAME READ_MEDIA_AUDIO allowelse#Android12及以下 adb shell appops set $PACKAGE_NAME READ_EXTERNAL_STORAGE allow adb shell appops set $PACKAGE_NAME WRITE_EXTERNAL_STORAGE allow fi # 其他必要权限 adb shell appops set $PACKAGE_NAME CAMERA allow adb shell appops set $PACKAGE_NAME RECORD_AUDIO allow adb shell appops set $PACKAGE_NAME ACCESS_FINE_LOCATION allow adb shell appops set $PACKAGE_NAME SYSTEM_ALERT_WINDOW allow echo"权限设置完成!"

通过 UID 设置的脚本

#!/bin/bash # grant_by_uid.sh PACKAGE_NAME="com.example.app"# 获取UIDUID=$(adb shell dumpsyspackage$PACKAGE_NAME|grep userId=|head-1|cut-d=-f2|cut-d' '-f1)if[-z"$UID"];then echo"未找到应用: $PACKAGE_NAME"exit1fi echo"应用 $PACKAGE_NAME 的 UID 是: $UID"# 通过 UID 设置权限 adb shell appops set--uid $UID MANAGE_EXTERNAL_STORAGE allow adb shell appops set--uid $UID CAMERA allow adb shell appops set--uid $UID ACCESS_FINE_LOCATION allow echo"通过 UID 设置权限完成"

总结

  • adb shell appops setAppOpsManager.setUidModeADB对应命令
  • 自己可以尝试一下,用Java API 方式去获取和设置setUidMode 权限,但是我之前没有成功,可以尝试一下。
  • 多看源码、多总结、多把知识点串联起来
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/7 16:41:05

React JSON Schema Form终极指南:3步构建专业表单应用

React JSON Schema Form终极指南&#xff1a;3步构建专业表单应用 【免费下载链接】react-jsonschema-form A React component for building Web forms from JSON Schema. 项目地址: https://gitcode.com/gh_mirrors/re/react-jsonschema-form React JSON Schema Form&a…

作者头像 李华
网站建设 2026/1/7 12:06:07

低价游陷阱专坑老年人?

「莫道桑榆晚&#xff0c;为霞尚满天」现在有越来越多退休的朋友&#xff0c;不再只是想着在家带带孙子孙女这类事情&#xff0c;而是跟老伙伴约好背上背包&#xff0c;到处去游历大江南北&#xff0c;朋友圈里那些拍摄美景时的笑容&#xff0c;就是老年人重新焕发出生机活力的…

作者头像 李华
网站建设 2026/1/10 13:14:03

Hazel引擎揭秘:如何用开源技术打造高性能2D/3D游戏开发平台

Hazel引擎揭秘&#xff1a;如何用开源技术打造高性能2D/3D游戏开发平台 【免费下载链接】Hazel Hazel Engine 项目地址: https://gitcode.com/gh_mirrors/ha/Hazel 你是否曾梦想开发属于自己的游戏&#xff0c;却被复杂的商业引擎吓退&#xff1f;&#x1f914; Hazel引…

作者头像 李华
网站建设 2026/1/9 21:41:44

Spark-TTS方言合成实战:零样本实现普通话到多地域口音转换

Spark-TTS方言合成实战&#xff1a;零样本实现普通话到多地域口音转换 【免费下载链接】Spark-TTS Spark-TTS Inference Code 项目地址: https://gitcode.com/gh_mirrors/sp/Spark-TTS 你是否曾因标准普通话语音无法让方言使用者理解而困扰&#xff1f;是否在开发地域化…

作者头像 李华
网站建设 2026/1/10 9:46:15

【无标题】激活函数应该具有哪些特征

1.非线性2.可微性3.计算效率高4.缓解梯度消失与爆炸5.合理的输出范围6.稀疏激活能力7.主流激活函数对比&#xff08;扩展版&#xff09;#人工智能#具身智能#VLA#大模型#AI

作者头像 李华