由于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(pho

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

被折叠的 条评论
为什么被折叠?



