Android API 26下mkdir()/mkdirs()创建目录失败问题求助
解决Android API26(8.0)下无法创建目录的问题
你遇到的这个问题很典型,在Android 8.0(API26)上,系统对公共存储目录的访问权限做了更严格的限制,再加上你用到的MEDIA_SHARED目录本身的特殊性,才导致了创建子目录失败的情况。结合你的代码和场景,我整理了几个可行的解决方案:
1. 更换为标准公共存储目录
Environment.MEDIA_SHARED是系统用于共享媒体的特殊目录,在API26及部分设备中,应用可能没有写入权限,甚至这个目录本身都不存在。建议改用Android官方推荐的公共目录,比如文档、下载目录等,这些目录的访问权限更稳定:
public static boolean createDir() { // 替换为文档公共目录,也可根据需求改用DIRECTORY_DOWNLOADS等 String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath(); java.io.File folder = new java.io.File(dir + "/SomeFolderName"); if (!folder.exists()) { try { // 用mkdirs替代mkdir,确保父目录不存在时也能递归创建 if (folder.mkdirs()) { Log.e("Creating Folder", "Success"); return true; } else { Log.e("Creating Folder", "Failed to create folder"); return false; } } catch (Exception e) { e.printStackTrace(); return false; } } else { return true; } }
2. 改用应用专属外部存储目录
如果不需要让其他应用访问这个目录,强烈推荐使用应用专属的外部存储路径。从API19开始,访问这个路径不需要申请WRITE_EXTERNAL_STORAGE权限,而且不会受系统存储权限变更的影响,还能避免卸载应用后残留文件:
public static boolean createDir(Context context) { // 需要传入Context实例 // 获取应用专属外部存储目录,卸载应用时该目录会被自动删除 File folder = new File(context.getExternalFilesDir(null), "SomeFolderName"); if (!folder.exists()) { try { if (folder.mkdirs()) { Log.e("Creating Folder", "Success"); return true; } else { Log.e("Creating Folder", "Failed"); return false; } } catch (Exception e) { e.printStackTrace(); return false; } } else { return true; } }
3. 确认动态权限申请是否完成
虽然你在Manifest中声明了权限,但Android 6.0(API23)及以上版本需要动态申请危险权限(包括WRITE_EXTERNAL_STORAGE)。如果只是静态声明但没有在代码中请求用户授权,实际还是没有写入权限,这是很多开发者容易忽略的点:
// 在Activity中添加权限申请逻辑 private static final int REQUEST_WRITE_STORAGE = 101; public void checkStoragePermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_STORAGE); } else { // 权限已授予,执行创建目录操作 createDir(); } } // 处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_WRITE_STORAGE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { createDir(); } else { Log.e("Permission", "Write storage permission denied, can't create folder"); } } }
4. 尝试用mkdirs()替代mkdir()
如果父目录(比如MEDIA_SHARED)本身不存在,mkdir()会直接创建失败,而mkdirs()会递归创建所有不存在的父目录。你可以先尝试把代码中的folder.mkdir()改成folder.mkdirs(),看看是否能临时解决问题,但更推荐前面的长期方案。
内容的提问来源于stack exchange,提问作者Ussaid Iqbal
相关产品推荐
相关产品推荐

