Java.io.FileNotFoundException:打开失败: EACCES(权限被拒绝)。

9
当我尝试将位图存储到存储器中时,出现了这个错误 #。
    File path = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "picture");
    if (! path.exists()) {
        path.mkdirs();
        if (!path.exists()) {
            return null;
        }
    }
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HH_mm_ss", Locale.CHINA).format(new Date());
    File imagePath = new File(path.getPath() + "_" + "IMG_" + timeStamp + ".jpg");
    BufferedOutputStream fos;
    try {
        fos =new BufferedOutputStream(new FileOutputStream(imagePath));
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
        fos.flush();
        fos.close();
        return imagePath;
    } catch (FileNotFoundException e) {
        Log.e("GREC", e.getMessage(), e);
        return null;
    } catch (IOException e) {
        Log.e("GREC", e.getMessage(), e);
        return null;
    }

fos = new BufferedOutputStream(new FileOutputStream(imagePath));

我调试后发现这行代码导致了错误。

而在清单文件中,权限设置是正确的。


你给了什么权限? - Ravi
2
"在清单文件中权限集合应该是正确的" -- 请发一下清单文件。你测试的 Android 版本是什么? - CommonsWare
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.mount_unmount_filesystems" /> 权限位于<application>标签之外。 - Alexander
最低支持版本为17 目标版本为22 - Alexander
ANDROID.PERMISSION 应该改为 android.permission - greenapps
显示剩余4条评论
3个回答

19

这个问题出现在Android Pie及更高版本中。 因此,在清单文件中添加此行可以修复错误。

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

4
这是一个临时解决方案,直到Android 11发布。 - Sharukh Mohammed

10

在Android10上

use method -> Environment.getExternalStoragePublicDirectory()

java.io.FileNotFoundException: /storage/emulated/0/Download open failed: EACCES (Permission denied)

在您的应用程序完全兼容作用域存储之前,您可以根据应用程序的目标SDK级别或requestLegacyExternalStorage清单属性暂时选择退出:

谷歌在Android Q上有一个新功能:外部存储的过滤视图。解决这个问题的快速方法是将以下代码添加到AndroidManifest.xml文件中:


<manifest ... >
  <!-- This attribute is "false" by default on apps targeting
       Android 10 or higher. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

4

问题是我的权限格式有误。

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"

android.permission 应该是小写字母。

uses-permission android:name=android.permission.WRITE_EXTERNAL_STORAGE

如果我添加了 imagePath.createNewFile();

它也会抛出 FileNotFoundExceptions 异常。


1
谢谢,我也遇到了同样的问题。大写字母权限是由Android Studio自动生成的。 - Yaohui.W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接