Android 相机 导致OOM (Bitmap的尴尬)

xiaoxiao2021-02-28  50

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~~~

转载请注明原文地址: https://www.6miu.com/read-2632732.html

最新回复(0)