android mkdirs 不工作

android mkdirs not working

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

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

谢谢

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

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

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

对于像我这样没有经验的人。我与这个问题作斗争,脱发有一段时间了。我的目标是 api 21(为了兼容性),它在棒棒糖上工作,但在棉花糖上它不会创建目录。我在清单中确实拥有 "uses" 权限,但它仍然无法正常工作。显然在 Marshmallow 中,当您使用 Android studio 安装时,它从不询问您是否应该授予它许可,它只是安静地失败,就像您拒绝它一样。您必须进入设置、应用程序、select 您的应用程序并打开权限开关。

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

你有没有把

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

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

有人像我一样在 Android10 尝试过。请在清单中使用以下 API:

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

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

如果您已经允许 R/W 权限(也有运行时权限)但仍然不起作用,请在您的 AndroidManifest.xml

中添加下面提到的行

<申请 ………… ………… android:requestLegacyExternalStorage="真"> 注意:如果您的目标是 Android 10+

,那么这必须是必需的

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");

更新

这个答案提供了另一种解决方案

更新

另一种方法是在 manifest

中授予此权限
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

喜欢这个回答

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

我写了这段用于创建文件的代码,但它在 android11

中不起作用

为 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();
        }

    }