Android SDK 30下应用大文件最优存储方案:如何避免卸载后文件丢失?
Android 11+ 自定义非媒体大文件存储方案解答
分区存储存储非媒体文件的性能问题
可以在分区存储中存储非媒体类文件,不会额外增加应用内存负担,也不会导致运行卡顿。
你提到的卡顿问题仅出现在使用DocumentFile操作公共目录的场景下,这类操作需要经过系统DocumentProvider中转,才会有明显性能损耗。而分区存储自带的沙箱目录Android/data/[包名]/files读写逻辑和旧版公共存储的原生File API完全一致,没有额外中转开销,IO性能和旧版方案持平。
注:沙箱目录读写不需要申请任何存储权限,操作逻辑和你之前读写公共内存的代码几乎没有差异,迁移成本极低。
Android 11+ 跨应用可访问、卸载不删除的公共存储路径
存在符合要求的存储位置,不需要申请特殊权限即可使用:
- 公共存储下的
Download、Documents目录支持写入自定义格式的非媒体文件,写入的文件不会随应用卸载删除,其他应用(包括系统文件管理器)可直接访问 - 写入时使用
MediaStore.Downloads或MediaStore.FilesAPI即可,不需要申请MANAGE_EXTERNAL_STORAGE权限,也不需要用户手动授权目录访问 - 应用自身写入公共目录的文件可直接读取,不需要额外权限;仅读取其他应用写入的自定义文件时,才需要通过SAF框架引导用户手动选中目标文件
最优存储方案选型
根据你的业务场景二选一即可:
- 如果生成的文件仅需当前应用内部使用,不需要用户手动查看、跨应用调用:直接存储到应用专属沙箱目录
Android/data/[包名]/files,性能最好,逻辑最简单,完全符合分区存储规范,仅缺点是卸载应用时文件会同步删除 - 如果生成的文件需要用户可通过文件管理器访问、跨应用使用、卸载后留存:直接写入
Download或Documents公共目录下的自定义子目录即可,性能远高于DocumentFile方案,不需要用户手动授权目录,完全适配Android 11+的分区存储规则
建议在公共目录下新建和应用名称匹配的子目录存放文件,避免和其他应用的文件混淆,也方便用户查找。
内容的提问来源于stack exchange,提问作者erinys
相关产品推荐
相关产品推荐

