You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:59:02