【问题标题】:FileNotFoundException: open failed: EACCES (Permission denied)FileNotFoundException:打开失败:EACCES(权限被拒绝)
【发布时间】:2016-09-26 00:13:57
【问题描述】:

在模拟器中(我使用 genymotion)它工作正常,但是当我在真实设备上运行它时(我的手机是华硕 ZenFone Laser 5.0)会抛出一个 filenotfoundexception

java.io.FileNotFoundException:/storage/emulated/0/cam20160926_075819.jpg:打开失败:EACCES(权限被拒绝)

imgBitmap = MediaStore.Images.Media.getBitmap(cr, selectedImage);

这是 onActivityResult() 的方法

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case CAMERA_REQUEST:
                if (resultCode == Activity.RESULT_OK){
                    Uri selectedImage = imageUri;
                    getActivity().getContentResolver().notifyChange(selectedImage, null);
                    ContentResolver cr = getActivity().getContentResolver();
                    Bitmap imgBitmap;
                    try {
                        imgBitmap = MediaStore.Images.Media.getBitmap(cr, selectedImage);

                        accountPhoto.setImageBitmap(imgBitmap);
                    } catch (IOException e) {
                        e.printStackTrace();
                        Toast.makeText(getActivity().getApplicationContext(), "Something went wrong while taking a photo", Toast.LENGTH_LONG).show();
                        Log.e("Camera", e.toString());
                    }

                }
        }
    }

我阅读了有关此 EACCES 的一些相关问题和解决方案,看来问题是在我的许可下:

<uses-feature android:name="android.hardware.camera2" android:required="true"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

我错过了什么吗?感谢回复

【问题讨论】:

  • 你用的是哪个版本的SDK和android?
  • 我现在在棉花糖 6.0 中 api lvl 23。我的应用程序的最小 sdk 版本是 api lvl 18
  • 所以我在这里看不到您关于读写外部存储的权限请求?
  • 什么?我不明白你在说什么
  • 什么是 imageUri?我认为它是空的。请尝试在函数中使用参数数据,并在使用前先检查它是否为空。使用Uri selectedImage = data.getData();。详情见stackoverflow.com/a/23868051/5241603

标签: java android


【解决方案1】:

你必须在开始你的指令之前请求许可,因为这个许可在 Marshmallow 中被认为是危险的:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && 
checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) 
     {
      requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, RESULT);
     } 
    else
     {
    //your code
     }

【讨论】:

  • 我把这个放在哪里?
  • 你把它放在你使用权限的指令之前
  • 我在这件事上使用的是fragment,我找不到RESULT的初始化
  • 将其初始化为 static int =1
  • 幸运的是,它解决了我的问题。但我认为这不是最好的解决方案,我仍然会检查这个。谢谢!
【解决方案2】:

我怀疑WRITE_EXTERNAL_STORAGE 覆盖了READ_EXTERNAL_STORAGE 读取权限。如果您查看documentation,您会发现前者也允许从存储中读取。

尝试删除android:maxSdkVersion 属性,看看是否有效。我怀疑您的设备运行的 SDK 版本 > 18。

查看此答案了解更多信息:https://stackoverflow.com/a/15270626/425238

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2012-09-07
    • 2020-11-29
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    相关资源
    最近更新 更多