27

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

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

谢谢

4

11 回答 11

58

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

于 2016-12-28T15:13:54.360 回答
37

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

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

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

于 2020-04-22T08:26:32.477 回答
6

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

于 2016-10-17T13:40:57.417 回答
6

你放了吗

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

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

于 2017-02-20T14:43:41.143 回答
3

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

File file = new File(dir.getAbsolutePath() + "/Pic.jpg");
file.createNewFile()
于 2016-10-17T13:15:22.513 回答
3

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

于 2017-02-20T14:39:07.770 回答
2

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

<application ........ ........ android:requestLegacyExternalStorage="true"> 注意:如果您的目标是 Android 10+,这必须是必需的

于 2020-10-06T11:06:57.383 回答
0

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

 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()))
于 2016-10-17T13:18:09.457 回答
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

于 2021-04-16T00:49:30.097 回答
0

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 中不起作用

于 2021-05-12T18:24:58.827 回答
0

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

    }
于 2022-02-17T15:25:41.340 回答