android mkdirs无法正常工作

时间:2016-10-17 13:12:50

标签: android mkdirs

我需要在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()相同的结果。

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

感谢

10 个答案:

答案 0 :(得分:38)

对于那些不像我这样经验丰富的人。我打了这个问题,失去了一段时间的头发。我的目标是api 21(兼容性)并且它适用于棒棒糖,但是在marshmallow上它不会创建目录。我确实在清单中有“使用”权限,但它仍然无效。显然在Marshmallow中,当你安装Android工作室时,它永远不会问你是否应该给它许可它只是悄然失败,就像你拒绝它一样。您必须进入设置,应用程序,选择您的应用程序并打开权限开关。

答案 1 :(得分:20)

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

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

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

答案 2 :(得分:3)

IDIOT ME!我已经使用了Manifest权限,但是当我在手机上安装应用程序时,我没有授予存储权限!...我理解这个问题的否定...但我希望如果其他人面对同样的行为......检查你的手机许可。对不起给您带来不便。

答案 3 :(得分:2)

如果你在Android M上测试,你应该检查设置&gt;应用&gt;查看是否授予访问存储权限的权限。这救了我。

答案 4 :(得分:2)

你放了


R> library(RQuantLib)
R> setEvaluationDate(Sys.Date())
[1] TRUE
R>
你的AndroidManifest中的

?如果您使用的是Android M,则必须请求用户在sd上写入权限,在此处查看example

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

试试这个。为marshmallow提供运行时权限,它完全适用于我的应用程序代码:

 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()))

答案 7 :(得分:0)

如果您已经允许了R / W权限(也具有Runtime Permission),但仍然不起作用,请在AndroidManifest.xml中添加下面提到的这一行

<应用程序 ........ ........ android:requestLegacyExternalStorage =“ true”> 注意:如果您要定位Android 10以上版本,则必须这么做

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

int

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