无法在外部公共存储图片目录创建子文件夹问题求助
嘿,我来帮你搞定这个创建目录总是失败的问题!先看看你给出的代码片段:
File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "foto_test_app"); if(!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { Log.e(LOG_TAG, "External Storage not mounted."); return null; } if(!storageDir.exists() && !storageDir.mkdir()) { // 推测你是这里判断创建失败 Log.e(LOG_TAG, "Directory doesn't exist and create failed."); return null; }
大概率是这几个原因导致的,一个个来排查:
1. 误用mkdir()而非mkdirs()
mkdir()只能创建单级目录,如果父目录(比如DIRECTORY_PICTURES)不存在的话就会直接失败;而mkdirs()会递归创建所有不存在的父目录。把代码里的mkdir()换成mkdirs(),这是最常见的坑!
2. 权限问题(分Android版本处理)
Android 6.0(API 23)~ Android 9(API 28):
首先要在AndroidManifest.xml里声明权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />然后在代码里动态申请权限(因为6.0之后危险权限需要用户手动授权):
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1001); return null; }记得处理权限申请的回调结果,只有用户同意后再执行创建目录的逻辑。
Android 10(API 29)及以上:
系统默认开启了分区存储,如果你还是想用旧的存储方式,需要在AndroidManifest.xml的<application>标签里加:android:requestLegacyExternalStorage="true"要是你的targetSdkVersion是30+,
WRITE_EXTERNAL_STORAGE权限会被限制,除非是文件管理器类应用,否则不建议申请MANAGE_EXTERNAL_STORAGE权限(需要用户去系统设置手动开启),更推荐遵循分区存储规范用MediaStore来管理文件。
3. 确认外部存储状态细节
虽然你已经做了存储挂载检查,但可以加个日志看看具体状态,比如是否是只读模式:
Log.d(LOG_TAG, "External storage state: " + Environment.getExternalStorageState());
如果返回MEDIA_MOUNTED_READ_ONLY,那肯定没法创建目录。
4. 设备/模拟器存储配置问题
如果用模拟器,检查下是否配置了SD卡、存储空间是否足够;如果是真机,看看SD卡是不是满了,或者被系统挂载为只读模式。
最后给你一份修改后的参考代码:
File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "foto_test_app"); String storageState = Environment.getExternalStorageState(); // 检查存储是否可读写 if(!Environment.MEDIA_MOUNTED.equals(storageState)) { Log.e(LOG_TAG, "External Storage not writable, state: " + storageState); return null; } // 检查权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { Log.w(LOG_TAG, "Need to request storage permission first"); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1001); return null; } // 创建目录 if(!storageDir.exists()) { if(storageDir.mkdirs()) { Log.d(LOG_TAG, "Directory created successfully: " + storageDir.getAbsolutePath()); } else { Log.e(LOG_TAG, "Failed to create directory: " + storageDir.getAbsolutePath()); return null; } }
内容的提问来源于stack exchange,提问作者Skusku

