Android 相机 导致OOM (Bitmap的尴尬)
Bitmap大家都不陌生了,很多环境下都能用的到这个东东,昨天,就在昨天,我自己用的手机华为mate9pro,拍照设置头像的时候,没问题,但是很多低配手机例如,oppoA31,魅蓝note5,三星 GALAXY on5,华为荣耀四等手机,软件崩了,就崩了,就崩了,看了下log发现OOM,下面给大家看看代码:
ByteArrayOutputStream baos = null;
Bitmap bitmap;
try {
InputStream is = this.getContentResolver().openInputStream(imageUri);
//解码图像大小,对图片进行缩放...防止图片过大导致内存溢出...
BitmapFactory.Options o = new BitmapFactory.Options();
//读取图片,此方法只有读取功能,没有缓存
o.inJustDecodeBounds = true;
//缩放的倍率
o.inSampleSize = 8;
o.inPreferredConfig = Bitmap.Config.RGB_565;
o.inJustDecodeBounds = false;
if (isClickCamera) {
bitmap = BitmapFactory.decodeStream(is, null, o);
} else {
bitmap = BitmapFactory.decodeFile(imagePath, o);
}
baos = new ByteArrayOutputStream();
//1.5M的压缩后在100Kb以内,测试得值,压缩后的大小=94486字节,压缩后的大小=74473字节
//这里的JPEG 如果换成PNG,那么压缩的就有600kB这样
//40代表图片质量,值越大,耗内存越大
bitmap.compress(Bitmap.CompressFormat.JPEG, 40, baos);
byte[] b = baos.toByteArray();
Log.d("OkHttp", "压缩后的大小=" + b.length);
base64ImgAvatar = android.util.Base64.encodeToString(b, android.util.Base64.DEFAULT);
setImageToHeadView(bitmap);
try {
//流每次用完都要关闭,不能多用,如果想再次使用,需要再次打开
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (baos != null) {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面这段代码,是我已经处理过的了,不存在OOM的情况,原来的代码,我没加 BitmapFactory.Options的操作,导致拍照后,读取图片进行设置,是对原图片处理的,但时原图片太大太大,导致* bitmap = BitmapFactory.decodeStream(is, null, o);*这句代码出现OOM的情况,然后就想到读取原图太大,那就把图片缩小后在读取设置可能好点,抱着试试的心态添加了Opions的操作,但是又踩了一个坑
if (isClickCamera) {
bitmap = BitmapFactory.decodeStream(is, null, o);
} else {
bitmap = BitmapFactory.decodeFile(imagePath, o);
}
baos = new ByteArrayOutputStream();
o.inJustDecodeBounds = false;
//1.5M的压缩后在100Kb以内,测试得值,压缩后的大小=94486字节,压缩后的大小=74473字节
//这里的JPEG 如果换成PNG,那么压缩的就有600kB这样
//40代表图片质量,值越大,耗内存越大
bitmap.compress(Bitmap.CompressFormat.JPEG, 40, baos);
当时代码是这个样子,美滋滋,我报了一个空指针异常bitmap.compress(Bitmap.CompressFormat.JPEG, 40, baos);在这个位置,你猜猜是到底是哪个参数的毛病?后来我把o.inJustDecodeBounds = false;这行代码挪到了if块的上面,解决了这个空指针问题,留心的baby肯定会发现我上面设置了一个东西,导致了这个空指针,这个问题完全就是代码的执行先后顺序导致的。因此挪一挪代码就搞定了。OVER~~~