FileNotFoundException:open failed:EACCES(权限被拒绝)

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

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的一些相关问题和解决方案,似乎问题出在我的允许之下:

    

我错过了什么吗? 谢谢你的回应

您必须在开始使用之前请求许可,因为此许可在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 } 

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

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

有关详细信息,请查看此答案: https : //stackoverflow.com/a/15270626/425238