2017-03-03 249 views
2

我有一个关于BitMapFactory.decodeFile的问题。BitmapFactory:无法解码流:java.io.FileNotFoundException

在我的应用程序中,我希望用户能够从他/她的设备中选择图像或拍摄照片。这必须然后显示在一个ImageView的

下面是代码片段:

Uri selectedImage = data.getData(); 
String[] filePathColumn = {MediaStore.Images.Media.DATA}; 
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); 
        cursor.moveToFirst(); 
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
        String picturePath = cursor.getString(columnIndex); 
        cursor.close(); 
        MyImage image = new MyImage(); 
        image.setTitle("Test"); 
        image.setDescription("test choose a photo from gallery and add it to " + "list view"); 
        image.setDatetime(System.currentTimeMillis()); 
        image.setPath(picturePath); 

而且我得到这个异常:

BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20170302-WA0012.jpg: open failed: EACCES (Permission denied) 

如何解决it.Please帮助me.Thanks提前..

回答

12

它的权限问题,你需要在外部读取存储的清单中添加权限,然后你就可以使用它,如果你使用os 6.0以上,那么你需要使用容易许可。

对于写:

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

对于阅读:

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

高于6.0:

private String[] galleryPermissions = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; 

if (EasyPermissions.hasPermissions(this, galleryPermissions)) { 
      pickImageFromGallery(); 
     } else { 
      EasyPermissions.requestPermissions(this, "Access for storage", 
        101, galleryPermissions); 
     } 

感谢

+2

这是EasyPermissions,如果它是类或字段? – Monali

+3

它的库编译'pub.devrel:easypermissions:0.2.1' –

+0

非常感谢..你节省了我的一天.. – Monali

0

你问读 - 外部运行一次许可存储当你开始y我们的相机意图:

final int MyVersion = Build.VERSION.SDK_INT; 
     if (MyVersion > Build.VERSION_CODES.LOLLIPOP_MR1) { 
      if (!checkIfAlreadyhavePermission()) { 
       ActivityCompat.requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, 1); 
      } else { 
       startYourCameraIntent(); 
      } 
     } 

checkIfAlreadyhavePermission()方法:

private boolean checkIfAlreadyhavePermission() { 
     int result = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     return result == PackageManager.PERMISSION_GRANTED; 
    } 

手柄权限对话框 “允许” 和 “拒绝” 按钮的动作在onRequestPermission():

@Override 
     public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     switch (requestCode) { 
      case 1: { 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        startYourCameraIntent(); 

       } else { 
        Toast.makeText(getActivity(), "Please give your permission.", Toast.LENGTH_LONG).show(); 
       } 
       break; 
      } 
     } 
    } 

并添加此到您的Manifest的应用程序标签:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
相关问题