Android11 Scoped Storage下targetSdk=30无MANAGE_EXTERNAL_STORAGE如何存非媒体文件到Documents/Download
问题解答
在targetSdk=30及以上版本的Android系统中,不申请MANAGE_EXTERNAL_STORAGE权限,完全可以将非媒体文件保存到系统公共/Documents或/Download目录。
先澄清你提到的目录歧义:
文档中提到的两类
/Documents//Download目录区别如下:
- 应用专属目录下的对应文件夹:路径为
/sdcard/Android/data/[应用包名]/files/Documents,不需要任何权限即可读写,但应用卸载时数据会同步删除,普通用户很难在系统文件管理器中直接访问到该路径下的文件- 系统公共共享目录:即你要实现的根目录下的
/Documents、/Download,所有应用都可以通过官方提供的存储访问框架访问,文件不会随应用卸载删除,用户可以直接在系统文件管理器中查看
具体实现方案
用Android系统原生提供的存储访问框架(Storage Access Framework, SAF) 即可实现,全程不需要申请任何读写存储权限,也符合Google Play的上架规范:
场景1:用户主动触发单次文件导出(比如用户点击「导出数据」按钮)
- 构造
ACTION_CREATE_DOCUMENT类型的Intent,指定你要保存的非媒体文件的MIME类型、默认文件名 - 拉起系统原生文件选择器,用户可以自主选择保存到
/Documents、/Download或者其他任意自定义路径 - 用户确认保存路径后,你会拿到对应文件的Uri,通过
ContentResolver打开输出流写入数据即可
场景2:需要批量写入多个非媒体文件,无需每次都让用户选择路径
- 构造
ACTION_OPEN_DOCUMENT_TREE类型的Intent,让用户主动授权你访问指定目录(用户可以直接选择/Documents或者/Download根目录/子目录) - 拿到目录授权Uri之后可以持久化该权限,后续不需要重复申请,就能直接在该授权目录下创建、修改、删除你自己生成的非媒体文件
注意事项
- 你只能访问、修改你自己通过SAF在公共目录下创建的文件,其他应用生成的非媒体文件你无法直接读取,除非用户主动通过SAF选择对应文件授权你访问
- 部分系统版本对APK、EXE等可执行文件写入公共目录有额外限制,这类特殊文件需要单独适配
- 不需要用户感知文件存储位置的场景,优先使用应用专属目录存储,只有需要用户可以直接找到、卸载应用不删除的非媒体文件才用SAF方案写入公共目录

内容的提问来源于stack exchange,提问作者A. M.
相关产品推荐
相关产品推荐

