【问题标题】:android mkdirs not workingandroid mkdirs 不工作
【发布时间】:2016-10-17 13:12:50
【问题描述】:

我需要在 android 上保存来自相机的图像。 我在清单中使用了写外部存储权限,我正在使用此代码

File dir = new File(Environment.getExternalStorageDirectory(), "Test");
if (!dir.exists() || !dir.isDirectory())
    dir.mkdirs();

String path = dir.getAbsolutePath();
Log.d(TAG, path);                     //log show the path
File file = new File(dir.getAbsolutePath() + "/Pic.jpg");
Log.d(TAG, file.getAbsolutePath());   //again path is shown here

outStream = new FileOutputStream(file);
outStream.write(bytes);
outStream.close();
Log.d(TAG, "onPictureTaken - wrote bytes: " + bytes.length);   //fail here
} catch (FileNotFoundException e) {
Log.d(TAG, "not done");                       //error is here (this exception is thrown)
} catch (IOException e) {
Log.d(TAG, "not");
} finally {  }

我也尝试了 mkdir() 而不是 mkdirs() 相同的结果。

知道代码出了什么问题吗?

谢谢

【问题讨论】:

  • 也许是you do not have runtime permissions implemented。除此之外,永远不要在没有记录的情况下捕获异常。将 e 作为第三个参数添加到您的 Log.d() 调用中,然后使用 LogCat 检查与您的崩溃相关的 Java 堆栈跟踪。
  • 你能告诉我们堆栈跟踪吗?
  • if (!dir.exists() || !dir.isDirectory()) dir.mkdirs();。糟糕代码的好例子。首先,如果它确实不是目录,则文件 mkdirs 不会将该文件转换为目录。其次,您应该检查 mkdirs 的返回值,因为它可能会失败。顺便说一句。
  • 试试这个它可能是工作 stackoverflow.com/a/41221852/5488468
  • 好问题!有帮助

标签: android mkdirs


【解决方案1】:

对于那些像我一样没有经验的人。我解决了这个问题,脱发了一段时间。我的目标是 api 21(为了兼容性),它在棒棒糖上工作,但在棉花糖上它不会创建目录。我确实在清单中有“使用”权限,但它仍然不起作用。显然,在 Marshmallow 中,当您使用 Android Studio 安装时,它从不询问您是否应该授予它权限,它只是悄悄地失败了,就像您拒绝它一样。您必须进入设置、应用程序,选择您的应用程序并打开权限开关。

【讨论】:

  • 试试这个它可能是工作 stackoverflow.com/a/41221852/5488468
  • @RobbyPatel 谢谢你。它就像一个魅力。但我有一个问题,如果我需要 2 个权限(比如说存储和相机)。我使用此代码检查权限,它检查第一个但不检查另一个。有没有办法做到这一点?
  • 可以把权限放入数组吗?
  • 我花了 4 天的时间来搜索为什么我的 logback 无法创建文件/目录。谢谢!
  • 这解决了允许 logback 写出文件。如何从运行 6.0 的设备中检索它?从我读过的所有内容来看 - 你不能。或者,文件附加程序的唯一用途可能是设备模拟器(工作正常)。
【解决方案2】:

像我这样尝试 Android10 的人。请在清单中使用以下 API:

<application android:requestLegacyExternalStorage="true" ... >
    ...
  </application> 

来自 Google 的最新更新: 在您将应用更新为面向 Android 11 后,系统会忽略 requestLegacyExternalStorage 标志。

【讨论】:

  • 谢谢!我正在将旧的 Android 7 项目移植到 Android 10
  • 有用的答案!谢谢大哥!
【解决方案3】:

白痴我!我已经使用了清单权限,但是当在手机上安装应用程序时,我没有授予存储权限!......我理解这个问题的否定......但我希望如果其他人面临同样的问题......请检查您的手机权限。不便之处,敬请见谅。

【讨论】:

    【解决方案4】:

    你放了吗

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    在您的 AndroidManifest 中?如果您使用的是 android M,您必须请求用户权限才能在 sd 上写入,请看这里 example

    【讨论】:

      【解决方案5】:

      您创建的是目录,而不是文件。使用以下代码创建新文件

      File file = new File(dir.getAbsolutePath() + "/Pic.jpg");
      file.createNewFile()
      

      【讨论】:

      • 感谢回复/我根据您的代码创建了文件现在我得到了 IOException 异常而不是找不到文件。
      • 这意味着写入文件时出现了一些错误。
      • PS:当我在 android 上浏览我的文件时,没有创建目录(我不知道这是否是问题的一部分)
      【解决方案6】:

      如果您在 android M 上进行测试,您可能应该检查 Settings > App > Permission 以查看是否授予了访问存储的权限。这救了我。

      【讨论】:

        【解决方案7】:

        如果您已经允许 R/W 权限(也允许运行时权限)并且仍然无法正常工作,请在您的 AndroidManifest.xml 中添加下面提到的行

        注意:如果您的目标是 Android 10+,则必须这样做

        【讨论】:

          【解决方案8】:

          试试这个。为棉花糖提供运行时权限,它在我的应用程序代码中完美运行:

           private String getFilename(String strFileName) {
                  String filepath = Environment.getExternalStorageDirectory().getPath();
                  File fileBase = new File(filepath, "Test");
                  if (!fileBase.exists()) {
                      fileBase.mkdirs();
                  }
                  return (file.getAbsolutePath() + "/" + strFileName + file_exts[currentFormat]);
              }
          
          new File(getFilename(edt.getText().toString().trim()))
          

          【讨论】:

            【解决方案9】:

            API 30开始你只能写在你的app-specific files

             File dir = new File(context.getFilesDir(), "YOUR_DIR");
             dir.mkdirs();
            

            或在您应用的外部存储中Android/data

            File dir = new File(myContext.getExternalFilesDir("FolderName"),"YOUR_DIR");
            

            更新

            这个答案提供了另一个解决方案https://stackoverflow.com/a/65744517/8195076

            更新

            另一种方法是在manifest 中授予此权限

            <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
            

            喜欢这个答案https://stackoverflow.com/a/66968986/8195076

            【讨论】:

              【解决方案10】:

              outputFile = new File(apkStorage + "/" + downloadFileName ); //在主文件中创建输出文件

                          //Create New File if not present
                          if (!outputFile.exists()) {
                              isExternalStorageWritable();
                              outputFile.getParentFile().mkdirs();
                              outputFile.createNewFile();
                              Log.e(TAG, "File Created");
                              OutputStream fos = new FileOutputStream(outputFile);//Get OutputStream for NewFile Location
                              InputStream fis = c.getInputStream();//Get InputStream for connection
                              byte[] buffer = new byte[1024];//Set buffer type
                              int len1 = 0;//init length
                              while ((len1 = fis.read(buffer)) >0) {
                                  fos.write(buffer, 0, len1);//Write new file
                              }
              
                              //Close all connection after doing task
                              fos.close();
                              fis.close();
              

              我为创建文件编写了这段代码,但它在 android 11 中不起作用

              【讨论】:

              • 请提供更多信息。有一些logcat错误吗?用于在旧 Android 版本中工作的代码?有没有一步步调试,看看每一步都发生了什么?
              【解决方案11】:

              为 android API 29 及更高版本编写代码时,在您的应用程序清单 (AndroidManifest.xml) 中使用以下权限

              <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
              <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
              <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
              

              将您的代码调整为如下所示

                  ActivityCompat.requestPermissions(this, new String[]
                                  {
                                          Manifest.permission.READ_EXTERNAL_STORAGE,
                                          Manifest.permission.WRITE_EXTERNAL_STORAGE
                                  },
                          PackageManager.PERMISSION_GRANTED);
              
                  StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
                  StrictMode.setVmPolicy(builder.build());
              
                  file = new File(Environment.getExternalStorageDirectory().getPath(), "TestDirectory/Document/");
                  if (!file.exists()) {
                      try {
                          file.mkdirs();
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
              
                  }
              

              【讨论】:

                猜你喜欢
                • 2015-06-04
                • 1970-01-01
                • 2017-09-22
                • 2016-03-11
                • 2018-03-16
                • 2018-09-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多