【问题标题】:Android File.mkdirs() returns false while trying to create a directory in sdcardAndroid File.mkdirs() 尝试在 sdcard 中创建目录时返回 false
【发布时间】:2018-02-01 03:21:36
【问题描述】:

我知道这是 Stackoverflow 中多次被问到的问题,我已经看到了这些问题。答案建议检查权限,重新启动设备,检查父目录是否存在等。我尝试了所有这些,但仍然无法正常工作。

我在清单中指定了Manifest.permission.WRITE_EXTERNAL_STORAGE 权限。

以下是我的代码。

        File newFile = new File(parent.getCanonicalPath() + "/" + dirName + "/");
        if(!newFile.exists()){
            boolean created = newFile.mkdirs();
            if(!created){
                int permission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
                boolean permissionGranted = (permission == PackageManager.PERMISSION_GRANTED);
                Log.e(getClass().getSimpleName(), "Could not create directory " 
                        + ", Parent exists : " + parent.exists()
                        + ", Parent Dir writable : " + parent.canWrite()
                        + ", Permission granted : " + permissionGranted);

            }
        }

日志打印出来

Could not create directory, Parent exists : true, Parent Dir writable : true, Permission granted : true

我通过它的 TreeUri 获得了对 sdcard 的写入权限,然后我将树 uri 转换为实际路径以将其与 File 类一起使用。

我的 minSdkVersion 是 19,而 targerSdkVersion 是 25

我做错了什么?

编辑:

我尝试了上述所有建议,但都失败了。现在,我使用 DocumentFile 解决了这个问题。我现在可以创建新的目录和文件。但我仍然不确定 File 发生了什么。谁能告诉我发生了什么?

我做了测试,

设备:联想 A2010-A

安卓版本:5.1

【问题讨论】:

  • 您能否也发布您的最终newFile.path?整个异常堆栈更好

标签: android storage android-sdcard


【解决方案1】:

替换

 boolean created = newFile.mkdirs();

 boolean created = newFile.mkdir();

【讨论】:

    【解决方案2】:

    您不应使用getCanonicalPath,而应使用getAbsolutePath。下面是我如何创建一个新文件夹:

    File newFile = new File(parent,dirName);
    if(!newFile.exists()){
            boolean created = newFile.mkdirs();
    }
    

    【讨论】:

      【解决方案3】:

      将 parent.getCanonicalPath() 替换为 Environment.getExternalStorageDirectory()

      File myDirectory = new File(Environment.getExternalStorageDirectory(), dirName);
      
      if(!myDirectory.exists()) {
      
      //create file if not generated                                 
      myDirectory.mkdirs();
      
      }else { 
      //not created file
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 2022-07-10
        • 1970-01-01
        • 2014-02-22
        相关资源
        最近更新 更多