Android 11/12中mkdir()无法创建Android/data目录的解决方案咨询
在Android 11/12中创建Android/data下应用专属目录的正确方式
问题原因
Android 11(API 30)及以上系统启用了**Scoped Storage(分区存储)**机制,Android/data/[你的包名]属于应用的专属外部存储目录,系统禁止通过硬编码路径的方式直接创建或访问该目录——即使你申请了WRITE_EXTERNAL_STORAGE权限,该权限在Android 11+对这类专属目录也不再生效,这就是你之前的代码失效的原因。
正确解决方案
无需手动创建该根目录,系统会通过官方API自动为你维护,直接使用以下方式获取或操作该目录即可:
获取应用专属外部存储根目录
利用Context提供的getExternalFilesDir()方法,它会直接返回Android/data/com.moh.phc.phcis/files目录,且如果目录不存在,系统会自动创建。若你需要的是Android/data/com.moh.phc.phcis这个根目录,只需取它的父目录:// 获取files目录,对应Android/data/com.moh.phc.phcis/files File filesDir = getExternalFilesDir(null); // 获取应用专属根目录Android/data/com.moh.phc.phcis File appRootDir = filesDir.getParentFile();在专属目录下创建子目录
如果需要在根目录下创建子文件夹,直接基于上述目录对象操作即可,无需额外权限:File subFolder = new File(appRootDir, "custom_subfolder"); if (!subFolder.exists()) { // 创建多级子目录用mkdirs(),单级用mkdir() subFolder.mkdirs(); }
注意事项
- 不要通过硬编码路径拼接的方式访问
Android/data下的任何目录,分区存储机制会直接拦截这类操作。 WRITE_EXTERNAL_STORAGE权限在Android 11+仅对公共共享目录(如Downloads、Pictures)有效,且访问这些目录需要使用MediaStore或存储访问框架(SAF)。- 若需兼容Android 10,可在
AndroidManifest.xml的<application>标签中添加android:requestLegacyExternalStorage="true",但这是临时兼容方案,Android 12及以上该属性已失效,建议彻底迁移到分区存储API。
内容的提问来源于stack exchange,提问作者user3429946
相关产品推荐
相关产品推荐

