2017-02-16 117 views
0

我试图从设备的内部和外部存储器中添加图像到我的应用程序。我能够打开画廊的意图,并获得文件的路径,但我无法将其转换为我的ImageView的位图。 这里是导出代码为的onClick侦听器的图标调用库:Android从内部/外部存储器选择图像

icoGallery = (ImageView) findViewById(R.id.icoGallery); 
icoGallery.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     Intent galleryIntent = new Intent(Intent.ACTION_PICK, 
       MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     galleryIntent.setType("image/*"); 
     startActivityForResult(galleryIntent, RESULT_LOAD_IMAGE); 
    } 
}); 

下面是onActivitResult代码:我已经包括以下权限清单

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null !=data){ 
     Uri selectedImageUri = data.getData(); 
     String[] projection = {MediaStore.Images.Media.DATA}; 
     @SuppressWarnings("deprecation") 
     Cursor cursor = getContentResolver().query(selectedImageUri, projection, null, null, null); 
     cursor.moveToFirst(); 

     int column_index = cursor.getColumnIndex(projection[0]); 
     imagePath = cursor.getString(column_index); 
     cursor.close(); 

     imageFile = new File(imagePath); 
     if (imageFile.exists()){ 
      Bitmap imageBitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath()); 
      imgPhoto.setImageBitmap(imageBitmap); 
     } 

    } else { 
     Toast.makeText(context, "You have not selected and image", Toast.LENGTH_SHORT).show(); 
    } 
} 

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

我总是收到以下错误

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/20170215_152240.jpg: open failed: EACCES (Permission denied) 

我相信它失败的部分原因是因为该设备只有内部存储。有没有办法从本地存储设备或外部设备添加图像?或者我必须提出一个功能,询问用户是否想使用内部或外部存储器?

感谢提前:)

编辑: 的错误是由未初始化的ImageView引起的。但是,从Gallery活动返回并返回文件的路径后,图像不会显示在ImageView上。它更改为背景颜色。

+0

你是在模拟器上运行?如果不是,请尝试在实际设备中运行,并从您的电脑中取出USB连接。 – noahutz

+0

我正在测试一个实际的设备。仍然没有变化 –

+0

您正在运行的设备的版本是什么?我猜测它是Android 6.0。如果是这样,那是因为您需要启用运行时权限。尝试使用Android 6.0之前的设备,并查看您的代码是否正常工作。 – noahutz

回答

2

您可以直接设置UriImageView像这样:

Uri selectedImageUri = data.getData(); 
imageView.setImageURI(selectedImageUri); 

然后从ImageView的得到位图:

Drawable drawable = imageView.getDrawable(); 
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); 
+0

非常感谢你!这工作完美。所以现在我可以在Uri的活动上设置图像,但是当我尝试在RecyclerView上执行相同的操作时,它不会显示任何内容,而只显示背景颜色。 –