如何在Android11上无需MANAGE_EXTERNAL_STORAGE权限访问Android/data文件夹
Android 11+ 跨应用访问Android/data目录的可行解决方案
无Root合规方案(优先推荐)
- 使用系统存储访问框架(SAF)
这是谷歌官方推荐的跨目录访问方案,无需申请特殊敏感权限:- 启动系统自带的目录选择器,对应启动代码为
startActivityForResult(Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)) - 引导用户手动定位到目标应用在Android/data下的对应文件夹,主动授予访问权限
- 拿到授权返回的Uri后,调用
takePersistableUriPermission()保留长期访问权限,后续可直接通过该Uri写入你的.bin格式文件,无需重复授权
- 启动系统自带的目录选择器,对应启动代码为
- 申请所有文件访问权限(MANAGE_EXTERNAL_STORAGE)
适合文件管理类功能的应用使用:- 在AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> - 引导用户跳转至系统设置的「所有文件访问权限」页面,为你的应用开启权限
- 权限开启后可直接通过原生File API读写Android/data下的所有目录
注意:若应用需上架Google Play,仅当应用核心功能依赖全存储访问时才可申请该权限,否则会被驳回上架申请
- 在AndroidManifest.xml中声明权限:
- 目标应用配合适配
如果目标应用为你自行开发,或可联系到目标应用开发者配合,可通过以下方式完全规避权限限制:- 目标应用暴露FileProvider,授权你的应用访问其私有目录下的指定路径
- 目标应用提供自定义ContentProvider接口,你可直接通过接口传入.bin文件数据,由目标应用自行存入对应的私有目录
特殊方案(需要额外环境支持)
- Root设备:设备获取Root权限后,你的应用申请Root授权即可无限制读写任意目录,包括所有应用的Android/data私有文件夹
- Shizuku服务授权:无需Root,只需用户在设备上激活Shizuku服务,你的应用接入Shizuku API后即可获得Android/data目录的读写权限,操作门槛远低于Root
内容的提问来源于stack exchange,提问作者Anmol Hira
相关产品推荐
相关产品推荐

