android mkdirs不工作

android mkdirs不工作,android,mkdirs,Android,Mkdirs,我需要在android上保存一个摄像头的图像。 我在manifest中使用了write external storage权限,我正在使用此代码 File dir = new File(Environment.getExternalStorageDirectory(), "Test"); if (!dir.exists() || !dir.isDirectory()) dir.mkdirs(); String path = dir.getAbsolutePath(); Log.d(TAG

我需要在android上保存一个摄像头的图像。 我在manifest中使用了write external storage权限,我正在使用此代码

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(),结果相同

你知道密码出了什么问题吗


谢谢

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

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

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

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

我真傻!我使用了清单权限,但在手机上安装应用程序时,我没有授予存储权限!。。。我对这个问题的看法是否定的。。。但是我希望如果其他人也面临同样的问题…检查你的电话许可。非常抱歉给您带来不便。

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

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

你把

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


在你的AndroidManifest里?如果您使用的是安卓M,您必须请求用户许可才能在sd上进行写操作,这里有一个像我这样的人在尝试使用Android10。请在清单中使用以下API:

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

...
谷歌最新更新:
将应用程序更新为目标Android 11后,系统将忽略requestLegacyExternalStorage标志。

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


注意:如果您的目标是Android 10+

API30
开始,则必须执行此操作,您只能在
应用程序特定的文件中写入

 File dir = new File(context.getFilesDir(), "YOUR_DIR");
 dir.mkdirs();
或者在应用程序的外部存储中
Android/data

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

这个答案提供了另一个解决办法

更新

另一种方法是在
manifest

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

像这个答案一样,outputFile=新文件(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中可能无法工作。除此之外,在不记录异常的情况下,永远不要捕获异常。将
e
作为第三个参数添加到
Log.d()
调用中,然后使用LogCat检查与崩溃相关的Java堆栈跟踪。能否显示堆栈跟踪?
如果(!dir.exists()| |!dir.isDirectory())dir.mkdirs()。很好的坏代码示例。首先,如果它确实不是目录,那么文件mkdirs将不会将该文件转换为目录。其次,您应该检查mkdirs的返回值,因为它可能会失败。顺便说一句,这可能是工作stackoverflow.com/a/41221852/5488468的好问题!Helpfulthx for the reply/我根据您的代码创建了文件现在我得到了IOException的异常,而不是找不到的文件。这意味着在写入文件时出现了一些错误。PS:当我在android上浏览我的文件时,目录没有创建(我不知道这是否是问题的一部分)试试这个,可能是work stackoverflow.com/a/41221852/5488468@RobbyPatel谢谢你。它就像一个符咒。但我有一个问题,如果我需要2个权限(比如存储和相机)。我用这个代码检查权限,它检查第一个,但不检查另一个。有没有办法做到这一点?可以将权限放入数组中吗?我花了4天时间搜索我的logback无法创建文件/目录的原因。谢谢这解决了允许logback写出文件的问题。如何从运行6.0的设备中检索它?从我所读到的一切来看,你不能。或者,文件附加器的唯一用途是设备模拟器(whcih工作正常)。谢谢!我正在将一个旧的安卓7项目移植到安卓10上,这是一个有用的答案!谢谢兄弟!请提供更多信息。是否存在一些logcat错误?在旧的Android版本中使用的代码是什么?您是否已一步一步地调试以查看每个步骤中发生的情况?