Android mkdirs不起作用

android mkdirs not working

我需要从Android上的相机保存图像。
我在清单中使用了写入外部存储权限,并且正在使用此代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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()相同的结果。

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

谢谢


对于那些没有像我这样经验丰富的人。我打了这个问题,掉了头发一段时间。我的目标是api 21(出于兼容性考虑),它可以在棒棒糖上工作,但在棉花糖上却无法创建目录。我确实在清单中具有"使用"权限,但仍然无法使用。显然,在棉花糖中安装Android Studio时,它从不询问您是否应该授予它许可,而它只是悄悄地失败了,就像您拒绝了它一样。您必须进入"设置","应用",选择您的应用,然后打开权限开关。


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

1
2
    ...
  </application>

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


您放了

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

在您的AndroidManifest中?如果您使用的是android M,则必须请求用户权限才能在sd上进行写操作,请在此处查看示例


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


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


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

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


如果您已经允许了R / W权限(也具有运行时权限),但仍然无法正常工作,请在AndroidManifest.xml

中添加下面提到的这一行

<应用 ........ ........ android:requestLegacyExternalStorage =" true">
注意:如果您要定位Android 10

,则必须这样做


尝试一下。为棉花糖提供运行时权限,这在我的应用程序代码中非常有用:

1
2
3
4
5
6
7
8
9
10
 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()))