java - 如何避免 BitmapFactory.decodeByteArray 出现不一致的 OutOfMemory 异常?

标签 java android bitmapfactory

我的 Android 应用程序有以下代码:

private PictureCallback pictureTakenCallback = new PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        Bitmap bmp = null;
        Bitmap scaledBitmap = null;
        ByteArrayOutputStream baos = null;

        showLoading(true);//UI crap

        try
        {
            bmp = BitmapFactory.decodeByteArray(data, 0, data.length); //OOM Exception Thrown Here

            //if the bitmap is smaller than 1600 wide, scale it up while preserving aspect ratio
            if(bmp.getWidth() < 1600) {
                int originalHeight = bmp.getHeight();
                int originalWidth = bmp.getWidth();

                scaledBitmap = Bitmap.createScaledBitmap(bmp, 1600,
                        originalHeight*1600/originalWidth, true);

                bmp = scaledBitmap;
                scaledBitmap = null;
            }

            baos = new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.JPEG, 30, baos); // 30% compression
            image = baos.toByteArray();

            submitImage();
        }
        catch (java.lang.OutOfMemoryError e) {
            e.printStackTrace();
            showLoading(false);
        }
        catch (Exception e) {
            e.printStackTrace();
            showLoading(false);
        }
        finally
        {
            bmp = null;

            if (baos != null) {
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            baos = null;
        }
    }
};

有时,我会收到用户提示手机内存不足的异常。我的设备从未遇到过这个问题,这可能与他们的手机内存不足有关吗?

有人可以看看这段代码并给我一些如何提高效率的提示吗? 谢谢!

最佳答案

始终尝试在 Manifest 中像这样 android:largeHeap="true"

<application 
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        >

关于java - 如何避免 BitmapFactory.decodeByteArray 出现不一致的 OutOfMemory 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27308541/

相关文章:

android - 优步深度链接 Android 应用

android - 支持库从 23.1.1 升级到 25.1.0 后,popBackStack() 行为有所不同

android - 使用 ADB 发送 Intent

android - 获取图像输入流的大小

java - 关于 Nexus 工件和构建说明的 Dockerfile 最佳实践

java - 我无法按名称切换窗口 (driver.switchTo ("windowName"))

java - 拆分或不拆分类(在 Java 中)

java - 递归计算数组的标准差

java - 为什么 BitmapFactory.decodeFile 返回 null?

android - Samsung galaxy S4 图像捕捉问题