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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值