Android 10(API 29)如何实现应用卸载后存储数据仍持久保存
非SAF场景下Android 10+ 持久化文件存储适配方案
核心适配边界
- 完全规避
getExternalStorageDirectory()废弃带来的版本兼容问题 - 不触发SAF流程,不引导用户通过
ACTION_OPEN_DOCUMENT_TREE手动选择目录 - 存储文件不具备应用卸载自动清除的特性,和
getFilesDir()、getExternalFilesDir()的私有目录行为做区分 - 避免高风险特殊权限带来的上架审核问题
分版本适配实现逻辑
Android 10(API 29)设备适配
- 在Manifest文件的
<application>标签下添加属性配置android:requestLegacyExternalStorage="true",强制系统为应用启用传统外部存储模式 - 按标准流程申请
READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE运行时权限,即可正常向公共存储目录写入文件,这部分文件不会随应用卸载被清理,全程无额外用户交互 - 注意:该配置仅对API29版本的系统生效,Android 11及以上版本会忽略该属性
Android 11(API 30)及以上设备适配
- 基于MediaStore公共集合完成文件写入,不需要申请特殊全量存储权限,也不触发SAF目录选择弹窗:
- 图片、视频、音频类文件,直接写入
MediaStore.Images、MediaStore.Video、MediaStore.Audio对应公共集合,文件会存储到系统对应的公共媒体目录,应用卸载时系统不会自动清理这部分公共文件 - 非媒体类通用文件(文档、压缩包、安装包等),写入
MediaStore.Downloads公共集合,文件会自动存储到系统公共Download目录,同样具备卸载不清理的特性 - 应用自身通过MediaStore写入的公共文件,后续的读取、修改、删除操作不需要额外申请权限;只有操作其他应用写入的公共文件时,才需要触发SAF授权流程
- 图片、视频、音频类文件,直接写入
常见避坑提醒
- 区分应用私有目录和公共目录的清理规则:
getExternalFilesDir()属于应用专属私有外部目录,无论存储路径在内部存储还是可挂载SD卡,系统都会在应用卸载时对该目录做全量清除 - 避免不必要的高风险权限申请:不要为了直接访问任意公共目录申请
MANAGE_EXTERNAL_STORAGE权限,该权限属于高风险敏感权限,多数应用商店会对这类权限做严格审核,通过MediaStore实现的公共目录写入已经可以覆盖绝大多数下载、文件存储类场景 - 统一权限申请逻辑:
- targetSdkVersion ≤ 28:按传统逻辑申请存储权限后直接操作公共目录即可
- targetSdkVersion = 29:启用传统存储模式配置
- targetSdkVersion ≥30:直接调用MediaStore API完成公共文件写入
内容的提问来源于stack exchange,提问作者Zain
相关产品推荐
相关产品推荐

