private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o);
// The new size we want to scale to
final int REQUIRED_SIZE = 140;
// Find the correct scale value. It should be the power of 2.
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE) {
break;
}
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o2);
}
14
您必须为结果启动图库意图 .
Intent i = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, ACTIVITY_SELECT_IMAGE);
10 回答
近5年后更新的答案:
原始答案中的代码不再可靠地工作,因为来自各种来源的图像有时会返回不同的内容URI,即
content://
而不是file://
. 更好的解决方案是简单地使用context.getContentResolver().openInputStream(intent.getData())
,因为它将返回一个您可以根据需要处理的InputStream .例如,
BitmapFactory.decodeStream()
在这种情况下可以正常工作,因为您还可以使用Options和inSampleSize字段对大图像进行缩减采样并避免内存问题 .但是,像Google Cloud 端硬盘这样的内容会将URI返回到尚未实际下载的图片 . 因此,您需要在后台线程上执行getContentResolver()代码 .
原始答案:
其他答案解释了如何发送意图,但他们没有很好地解释如何处理响应 . 以下是有关如何执行此操作的示例代码:
在此之后,您已经将选定的图像存储在“yourSelectedImage”中,以执行您想要的任何操作 . 此代码通过在ContentResolver数据库中获取映像的位置来工作,但这本身是不够的 . 每个图像有大约18列信息,从其文件路径到“最后修改日期”到拍摄照片的GPS坐标,尽管实际上没有使用许多字段 .
为了节省时间,在您使用
columnIndex
代码之前,不要知道它所在的列 . 这只是根据其名称获取列的编号,与过滤过程中使用的相同 . 一旦你最终能够使用我给出的最后一行代码将图像解码为位图 .开始意图
处理结果
或者,您也可以对图像进行下采样以避免OutOfMemory错误 .
您必须为结果启动图库意图 .
然后在
onActivityForResult
中,调用intent.getData()
以获取图像的Uri . 然后,您需要从ContentProvider获取图像 .这是一个经过测试的图像和视频代码 . 它适用于所有小于19且大于19的API .
图片:
视频:
.
这样做是为了启动图库并允许用户选择图像:
然后在
onActivityResult()
中使用返回的图像的URI来设置ImageView上的图像 .由于某些原因,该线程中的所有答案都在
onActivityResult()
中尝试对收到的Uri
进行后处理,就像获取图像的真实路径一样,然后使用BitmapFactory.decodeFile(path)
来获取Bitmap
.这一步是不必要的 .
ImageView
类有一个名为setImageURI(uri)
的方法 . 把你的uri传递给它,你应该完成 .有关完整的工作示例,您可以在这里查看:http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html
PS:
在要加载的图像太大而无法放入内存的情况下,将
Bitmap
放在单独的变量中是有意义的,并且需要按比例缩小操作来防止OurOfMemoryError
,如@siamii答案中所示 .调用chooseImage方法,如 -