近 5 年后更新的答案:
原始答案中的代码不再可靠运行,因为来自不同来源的图像有时会返回不同的内容 URI,即 content:// 而不是 file://。更好的解决方案是简单地使用context.getContentResolver().openInputStream(intent.getData()),因为这将返回一个您可以选择处理的 InputStream。
例如,BitmapFactory.decodeStream() 在这种情况下完美运行,因为您还可以使用 Options 和 inSampleSize 字段对大图像进行下采样并避免内存问题。
但是,Google Drive 之类的东西会将 URI 返回到实际尚未下载的图像。因此,您需要在后台线程上执行 getContentResolver() 代码。
原答案:
其他答案解释了如何发送意图,但没有很好地解释如何处理响应。下面是一些关于如何做到这一点的示例代码:
protected void onActivityResult(int requestCode, int resultCode,
Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode) {
case REQ_CODE_PICK_IMAGE:
if(resultCode == RESULT_OK){
Uri selectedImage = imageReturnedIntent.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 filePath = cursor.getString(columnIndex);
cursor.close();
Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
}
}
}
在此之后,您已将选定的图像存储在“yourSelectedImage”中,以便随心所欲。此代码通过在 ContentResolver 数据库中获取图像的位置来工作,但仅靠它本身是不够的。每张图片都有大约 18 列信息,从文件路径到“上次修改日期”到照片拍摄地点的 GPS 坐标,但其中许多字段并未实际使用。
为了节省时间,因为您实际上并不需要其他字段,光标搜索是使用过滤器完成的。过滤器的工作方式是指定所需列的名称 MediaStore.Images.Media.DATA,即路径,然后将该字符串 [] 提供给游标查询。游标查询返回路径,但在使用columnIndex 代码之前您不知道它在哪一列。这只是根据其名称获取列的编号,与过滤过程中使用的相同。完成后,您终于可以使用我提供的最后一行代码将图像解码为位图了。