Android 11如何无需Root访问/sdcard/Android/data/<package_name>目录
无Root解决Android 11 访问私有目录权限报错问题
Android 11(API级别30)开始强制开启分区存储特性,默认限制所有第三方应用、adb进程访问其他应用的/sdcard/Android/data、/data/data等私有目录,直接访问就会返回Permission denied错误。
场景1:访问自己开发应用的私有目录
- 应用内代码访问:无需申请任何存储权限,直接调用系统API获取路径即可读写
代码示例:// 获取 /sdcard/Android/data/[你的包名]/files 路径 File externalFilesDir = getExternalFilesDir(null); // 获取 /data/data/[你的包名]/files 路径 File internalFilesDir = getFilesDir(); - adb调试访问:无需Root,只要应用是Debug版本,用
run-as命令即可访问
命令示例:adb shell "run-as <你的应用包名> ls /sdcard/Android/data/<你的应用包名>/files"
场景2:访问其他应用的私有目录
无Root合规访问仅支持以下两种方式:
- 目标应用主动共享:让目标应用通过FileProvider将指定文件/目录共享给你的应用,你收到共享Uri后即可执行读写操作
- 用户主动授权:调用系统存储访问框架(SAF)引导用户手动选中目标目录,拿到授权后即可访问
触发目录授权的代码示例:
用户选中目标目录后,在// 调用系统目录选择器 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); startActivityForResult(intent, 1001);onActivityResult回调中获取返回的Uri,后续通过ContentResolver即可对该目录下的文件进行读写,权限会被系统持久化保存,不需要重复申请。
注意事项
分区存储是Android系统的强制安全策略,任何绕过系统权限直接访问其他应用私有目录的适配方式都属于违规行为,上架Google Play会被直接驳回,不建议使用非合规方案。
内容的提问来源于stack exchange,提问作者sweet_vish
相关产品推荐
相关产品推荐

