您的位置:首页 > 其它

从系统相册取得照片,并解决oom

2016-03-30 17:26 260 查看

Android 多种方式正确的加载图像,有效避免oom

推荐博客
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1212/3770.html
//1.button绑定监听器:
button.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);

getAlbum.setType("image/*");

startActivityForResult(getAlbum, IMAGE_CODE);
}
});
//2.在onActivityResult()方法中处理返回的数据:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) { // 此处的 RESULT_OK 是系统自定义得一个常量,判断是不是正常返回
return;
}
if (requestCode == IMAGE_CODE) {
try {
Uri vUri = data.getData();
System.out.println(vUri.toString());
String[] proj = { MediaStore.Images.Media.DATA};// 返回一个数据流
Cursor cursor = managedQuery(vUri, proj, null, null, null);//
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);//按我个人理解 这个是获得用户选择的图片的索引值
cursor.moveToFirst();// 将光标移至开头 ,这个很重要,不小心很容易引起越界
String path1 = cursor.getString(column_index); //最后根据索引值获取图片路径
Bitmap bmp = ImageTools.decodeSampledBitmapFromResource(path1, 100, 100);
iv.setImageBitmap(bmp);
} catch (Exception e) {

}

}

}
//解决oom问题:
public class ImageTools {

public static Bitmap decodeSampledBitmapFromResource(String path,
int reqWidth, int reqHeight)
{
// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
// 调用上面定义的方法计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(path, options);

}

private static int calculateInSampleSize(Options options, int reqWidth,
int reqHeight)
{
// 源图片的高度和宽度
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// 计算出实际宽高和目标宽高的比率
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
// 一定都会大于等于目标的宽和高。
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: