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

在Android 7.0及更高版本中,由于安全性的增强,直接通过文件操作访问相册会遇到权限问题。解决方法是使用Provider来开放路径访问权限。在获取相册图片的Uri后,为了避免因图片过大导致的OOM错误,我们需要在显示前对图片进行压缩。提供了一个用于压缩图片的方法,该方法根据ImageView的大小计算缩放比例,然后使用BitmapFactory.decodeStream进行压缩,最终将压缩后的Bitmap设置到ImageView上,有效防止了内存溢出。
摘要由CSDN通过智能技术生成

由于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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值