Android Studio打包APK适配Android10/11存储政策报错求解
Android 10/11 存储适配报错解决方案
Android 10(API 29)引入的分区存储机制与Android 11(API 30)对该机制的强制执行,是导致APK在低版本系统正常运行、高版本报错的核心原因,可按以下方案处理:
1. 紧急临时兼容方案
仅适用于Android 10设备的紧急上线场景,不支持Android 11及以上版本,不可长期使用:
在AndroidManifest.xml的application节点添加如下属性,临时关闭分区存储校验:
<application ... android:requestLegacyExternalStorage="true"> </application>
注:Android 11及以上系统会直接忽略该属性,必须完成正式适配
2. 正式适配方案
2.1 调整权限声明
根据实际业务场景调整权限配置,无需冗余申请权限:
- 仅读写应用专属目录:无需申请任何存储权限,直接通过Context提供的API获取路径即可
- 访问公共媒体文件(图片/音频/视频):仅需申请
READ_EXTERNAL_STORAGE权限,修改自身应用生成的媒体文件无需额外权限,修改其他应用生成的媒体文件需单独申请用户授权 - 访问公共非媒体文件(文档/安装包等):使用系统存储访问框架(SAF)唤起用户主动选择文件/目录,无需申请存储权限
- 全量存储访问(仅适用于文件管理器/备份类工具等特殊应用):需申请
MANAGE_EXTERNAL_STORAGE特殊权限,声明后引导用户跳转系统设置页手动开启:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
2.2 替换存储路径逻辑
废弃原有直接读写Environment.getExternalStorageDirectory()公共根目录的逻辑,按场景替换为对应路径:
- 应用私有缓存/文件:使用
context.getExternalCacheDir()、context.getExternalFilesDir(对应目录类型) - 公共媒体文件读写:统一使用
MediaStoreAPI进行查询、插入、修改操作 - 跨应用文件分享:使用
FileProvider生成临时访问URI,禁止直接传递本地文件路径
内容的提问来源于stack exchange,提问作者Atul Kumar 9517
相关产品推荐
相关产品推荐

