android7.0之后选取相册较高分辨率照片显示出现OOM解析

论坛 期权论坛 脚本     
匿名技术用户   2021-1-6 05:26   48   0

由于android越来越注重安全性,导致在7.0之后对存取的权限也被回收,如果需要从相册读取或是存到相册中。

切不可直接创建文件,会报FileNotFound的错误。此时需要借助Provider来实现对路径的开放。如何实现在provider中开启自定义路径的访问权限,,见我上一篇博文关于拍照返回原图的。

正常用Intent开启相册之后,在onActivityResult方法中,可以拿到获取的照片的一个Uri(data.getData())。

重要的就在这一步,怎样把得到的uri显示在指定的imageview上,通常如果图片过大,肯定会出现OOM,这时我们要做的就是把这个Uri根据所要显示的控件大小进行压缩后转化为bitmap,显示在imageview上。

以下方法用于压缩

public static Bitmap getbitmap(Context context,ImageView img,Uri uri) {

//获取目标控件的大小

int targetW = img.getWidth();

int targetH = img.getHeight();

//设置参数

BitmapFactory.Options bm = new BitmapFactory.Options();

//设置injustDecodeBounds属性为true,可以做到只加载图片的大小,而不在内存为其分配空间

bm. inJustDecodeBounds = true;

BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri),null,bm);

//得到原图片的尺寸

int photoW = bm.outWidth;

int photoH = bm.outHeight;

//获取缩放比例

int scaleFactor = Math.min(photoW/targetW,photoH/targetH);

// 将injustDecodeBounds属性设置为false,开始获取 bitmap

bm.injustDecodeBounds = false;

bm.inSampleSize = scaleFacor;

bm.inPurgeable = true;

//再次decodeStream获得压缩后的bitmap

Bitmap bit = BitmapFactory.decodeStream(context.getContentResolver().openInpurStream(uri),null,bm);

return bit;

}

至此便获得了压缩后的bitmap,直接将其设置在指定的imageview上便可。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP