当前位置: 首页 > 知识库问答 >
问题:

Android9。API 29:/storage/emulated/0/Pictures/myPic.png打开失败:EACCES(权限被拒绝)

林德辉
2023-03-14

我正在尝试一个非常基本的相机应用程序的源代码在Android Studio 3.4.1与Android虚拟设备(AVD)Nexus 7(2012)API 29.我用模拟器中的相机拍了一张照片,并试图将其保存为 /storage/emulated/0/Pictures/myPic.png,但 /storage/emulated/0/Pictures/myPic.png打开失败:EACCES(拒绝许可)。我已经尝试了网上提供的所有建议,例如:

  1. 在AndroidManifest.xml中,我添加了:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

public class MainActivity extends Activity {

    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    public static void verifyStoragePermissions(Activity activity) {
        int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

        boolean checkPermission = (permission == PackageManager.PERMISSION_GRANTED);

        Toast toastPermission = Toast.makeText(activity,
                "Is permission granted? " + checkPermission,
                Toast.LENGTH_SHORT);
        LinearLayout toastLayoutPermission = (LinearLayout) toastPermission.getView();
        TextView toastTVPermission = (TextView) toastLayoutPermission.getChildAt(0);
        toastTVPermission.setTextSize(30);
        toastPermission.show();


        if (permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                    activity,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
        }
    }

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        verifyStoragePermissions(this);


......


private void saveImageToFile(File file)
    {
        if (mCameraBitmap != null)
        {
            FileOutputStream outStream = null;

            verifyStoragePermissions(this);

            try
            {
                outStream = new FileOutputStream(file);

                ...

            }
            catch (Exception e)
            {
                Toast toastException = Toast.makeText(MainActivity.this,
                        "Exception: " + e.getMessage(),
                        Toast.LENGTH_SHORT);
                LinearLayout toastLayoutException = (LinearLayout) toastException.getView();
                TextView toastTVException = (TextView) toastLayoutException.getChildAt(0);
                toastTVException.setTextSize(30);
                toastException.show();
            }

...

然而,这些建议都不管用!

代码抛出了一个异常

/存储/模拟/0/Pictures/myPic.png打开失败:EACCES(权限被拒绝)

当它到达终点线时

outStream = new FileOutputStream(file);

有没有进一步解决这个问题的办法?谢谢。

共有1个答案

东门理
2023-03-14

将android:requestLegacyExternalStorage=“true”添加到android清单对我使用android 29很有效

<application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:requestLegacyExternalStorage="true" ...
 类似资料:
  • 问题内容: 我一直在尝试加密文件,并将这些文件写回到同一位置。但是我收到错误消息说 我的档案是这个 我认为我已经提供了正确的许可。我用来加密文件的代码就是这个。 我在按钮内使用了这种方法 仍然我无法配置此错误。请有人帮忙! 问题答案: 我怀疑您运行的是Android 6.0棉花糖(API 23)或更高版本。在这种情况下, 必须先 实现运行时权限,然后才能尝试读取/写入外部存储。

  • 更新 结果发现我调用open和close FileOutputStream的频率太高了,这会在某个时候抛出FileNotFoundException。听起来更像是线程问题。

  • 我尝试使用以下方法从URI获取路径: 当我尝试压缩位图时: 我得到这个错误:

  • 问题内容: 我正在尝试使用android中的异步任务下载和存储图像,当单击下载按钮时出现以下错误。 WallpaperActivity.java Android目标Api 7.1.1 清单中添加的权限 android.permission.READ_EXTERNAL_STORAGE android.permission.WRITE_EXTERNAL_STORAGE 问题答案: 您需要为OS Mar

  • 我正试图在android中使用异步任务下载和存储图像,当点击下载按钮时得到以下错误。 null Android.permission.write_external_storage

  • 问题内容: 我已经加入包括。 当我尝试在Nexus5(Android 6.0)中运行我的应用程序时,它引发了如下异常: 然后我尝试了另一部Android手机(Android 5.1),一切正常。代码如下: Android 6.0在权限方面有区别吗? 问题答案: 在Android 6(Marshmallow)中,即使用户在安装时接受了你的所有权限,他们仍可以稍后决定从你手中夺走其中一些权限。 快速解