【发布时间】:2017-02-16 02:36:54
【问题描述】:
我正在尝试将设备内部和外部存储器中的图像添加到我的应用程序中。我能够打开图库意图并获取文件的路径,但是我无法将其转换为我的 ImageView 的位图。 这是调用图库的图标的 onClick 侦听器的代码:
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 上。它变为背景颜色。
【问题讨论】:
-
你在模拟器上运行吗?如果没有,请尝试在实际设备中运行并从您的电脑中移除 USB 连接。
-
我正在实际设备上进行测试。还是没有变化
-
您运行的设备是什么版本?我猜是安卓6.0。如果是这样,那是因为您需要启用运行时权限。尝试使用 Android 6.0 之前的设备,看看您的代码是否正常工作。