Android 11 scoped storage权限适配及低版本兼容合规方案咨询
分区存储适配方案(目标SDK30场景)
安卓10及以上走分区存储API,安卓9及以下走原有存储权限逻辑,可实现全版本兼容,不会影响旧系统用户正常使用,以下是你三个疑问的具体解答:
疑问1:剩余两个权限的maxSdkVersion配置要求
READ_EXTERNAL_STORAGE需要添加android:maxSdkVersion="32"配置:安卓13(API33)开始该权限被拆分为READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO三个细分媒体权限,API33及以上申请原READ_EXTERNAL_STORAGE会被系统直接拒绝,必须加版本限制。WRITE_INTERNAL_STORAGE直接从manifest中删除即可:该权限是系统级私有目录权限,默认应用本身就持有自身私有目录的读写权限,第三方应用申请该权限无效,也不需要做任何版本限制配置。
适配后的完整权限配置示例:
<!-- 安卓9及以下需要写外部存储权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <!-- 安卓10-12需要读外部存储权限,安卓13及以上用细分媒体权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- 安卓13及以上细分媒体权限,按需申请对应类型 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
疑问2:动态权限申请逻辑处理
manifest的maxSdkVersion仅会告知系统对应权限在高版本不需要授予,不会自动处理动态申请逻辑,必须手动添加SDK版本判断分支:
- 当
Build.VERSION.SDK_INT < 29:申请WRITE_EXTERNAL_STORAGE+READ_EXTERNAL_STORAGE - 当
29 <= Build.VERSION.SDK_INT <= 32:仅申请READ_EXTERNAL_STORAGE - 当
Build.VERSION.SDK_INT >= 33:按需申请对应READ_MEDIA_*系列权限
如果不在高版本拦截废弃权限的申请,系统会直接返回拒绝结果,不会导致崩溃,但会干扰后续权限判断逻辑,必须添加分支处理。
疑问3:文件罗列逻辑是否需要更新
必须更新:当前能正常运行是安卓系统的向下兼容临时生效,但Google Play的政策审核会扫描存储API调用逻辑,直接遍历外部存储的旧代码会被判定为违规:
- 多媒体文件(图片、视频、音频、下载文件):统一用
MediaStoreAPI查询,该API兼容安卓4.4及以上版本,旧系统也可正常运行,不需要依赖原有的File路径遍历逻辑 - WhatsApp管理功能:安卓11及以上通过
SAF(存储访问框架)引导用户授权访问WhatsApp对应目录即可,低版本保留原有File逻辑 - 所有直接调用
Environment.getExternalStorageDirectory()遍历的逻辑必须全部替换,否则即使功能正常也会被Google Play判定违规下架。
注意:不要申请
MANAGE_EXTERNAL_STORAGE特殊权限,Google对该权限管控极严,普通清理类应用申请后100%会被驳回,上述MediaStore+SAF的方案完全可以覆盖你的功能需求,符合政策要求。
内容的提问来源于stack exchange,提问作者Teekam Suthar
相关产品推荐
相关产品推荐

