Android 12 上架Google Play后App无法在Downloads目录创建文件夹
问题原因
这个问题是Android 12针对Google Play分发应用的存储强制管控规则导致的,和mkdir()/mkdirs()方法实现无关:
- 本地通过Android Studio直接运行安装的debug构建包,默认会获得系统的存储兼容豁免,不会触发应用商店分发场景的合规校验,因此可以正常执行目录创建操作。
- 上传到Google Play分发的正式发布包,只要
targetSdkVersion >= 30,在Android 12设备上会被强制启用分区存储(Scoped Storage)机制,禁止应用直接通过File类在公共存储目录(包括Download公共目录)下创建自定义文件夹,哪怕你动态申请了READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE权限也无效——这两个权限在Android 12及以上版本已经不再授予公共目录的直接文件读写权限。
你看到日志里打印的路径完全一致,但系统在框架层直接拦截了写入操作,所以mkdirs()会直接返回false,和目标文件夹是否已存在没有关系。部分厂商的Android 11版本没有完全落地分区存储的强制校验,所以不会复现该问题,Android 12已经对所有GP分发的target30+应用全量强制执行该规则。
可行解决方案
根据你的业务场景选对应方案即可:
- 如果不需要让用户/其他应用在你的应用外访问存放在该目录的文件:直接改用应用专属外部存储目录,调用
context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)获取路径,不需要申请任何存储权限就可以正常创建目录、读写文件,对应路径类似/storage/emulated/0/Android/data/你的应用包名/files/Download/,应用卸载时该目录下的内容会被自动清理。 - 如果确实需要把文件放到公共Download目录,供用户在系统文件管理器中查看、或者供其他应用访问:不要自行创建
/Download/SampleApp/这类自定义子目录,改用MediaStoreAPI或者系统存储访问框架(SAF)完成文件写入操作,系统会自动处理权限校验,不需要申请额外存储权限。
注意:除非你的应用是文件管理器、整机备份这类核心功能必须依赖全盘存储访问的产品,否则不要尝试申请
MANAGE_EXTERNAL_STORAGE所有文件访问权限绕过规则,这类应用提交Google Play审核时会被严格校验,非合规场景会直接被拒。
内容的提问来源于stack exchange,提问作者tomazj
相关产品推荐
相关产品推荐

