You need to enable JavaScript to run this app. Android 10(API 29)如何实现应用卸载后存储数据仍持久保存
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 03:06:01