Android 11+无需MANAGE_EXTERNAL_STORAGE权限实现可访问文件读写
可行解决方案(无需MANAGE_EXTERNAL_STORAGE权限)
方案1:使用存储访问框架(SAF)让用户指定可访问位置
这是Google推荐的合规方案,完全不需要特殊权限,且文件能在文件管理器中可见:
- 保存文件时,调用SAF的
ACTION_CREATE_DOCUMENTIntent,引导用户选择保存位置(比如系统的「文档」「下载」目录,或者用户自定义的文件夹),用户选择后就能生成一个可被文件管理器访问的文件。 - 读取文件时,调用
ACTION_OPEN_DOCUMENTIntent让用户选择之前保存的文件,或者通过takePersistableUriPermission持久化URI权限,后续可直接访问该文件,无需每次让用户选择。 - 核心代码示例:
处理返回结果后,拿到URI即可通过// 启动保存文件的Intent val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "application/octet-stream" // 适配任意二进制文件,也可根据需求用text/plain等类型 putExtra(Intent.EXTRA_TITLE, "my_key_file.dat") // 自定义文件名 } startActivityForResult(intent, REQUEST_CODE_SAVE_FILE)ContentResolver完成文件读写。
方案2:引导用户开启Android Data目录的访问权限
多数主流厂商的文件管理器(小米、三星、OPPO等)已支持手动开启「Android Data目录访问权限」,开启后用户就能看到Android/Data/你的包名/下的文件:
- 在App内添加引导步骤:告诉用户打开系统文件管理器 → 找到「设置」或「更多」选项 → 开启「显示隐藏文件」或「Android Data访问权限」(不同厂商操作路径略有差异)。
- 该方案无需修改App代码,但依赖用户操作,部分小众厂商的文件管理器可能不支持此功能。
方案3:添加手动导入/导出功能
在App内实现两个核心功能:
- 导出:将关键文件通过
ACTION_SENDIntent分享给用户,用户可选择保存到邮件、微信,或用SAF保存到公共目录。 - 导入:调用
ACTION_GET_CONTENTIntent让用户选择之前导出的文件,App读取后恢复关键信息。 - 这个方案完全合规,用户可自主控制文件的备份和转移,非常适合你和朋友小范围使用的场景。
备选方案:利用Android自动备份功能
如果用户不需要直接看到文件,仅需换机时恢复数据,可开启Android自动备份:
- 在
AndroidManifest.xml中配置:<application ... android:allowBackup="true" android:fullBackupContent="@xml/backup_rules"> </application> - 创建
res/xml/backup_rules.xml,指定需要备份的文件路径,Google会自动备份App内部存储和App-specific目录内容,用户换机登录同一Google账号后会自动恢复。但用户无法直接访问备份文件,仅适合不需要手动复制文件的场景。
内容的提问来源于stack exchange,提问作者aarelovich
相关产品推荐
相关产品推荐

