CameraSource Exception java.lang.OutOfMemoryError

时间:2017-03-21 12:37:08

标签: java android out-of-memory android-camera

我有一个问题..

  

异常java.lang.OutOfMemoryError:

在以下一行..

byte[] byteArray = new byte[bufferSize];

原因应该是什么以及如何防止它。

CODE

private byte[] createPreviewBuffer(Size previewSize) {
    int bitsPerPixel = ImageFormat.getBitsPerPixel(ImageFormat.NV21);
    long sizeInBits = previewSize.getHeight() * previewSize.getWidth() * bitsPerPixel;
    int bufferSize = (int) Math.ceil(sizeInBits / 8.0d) + 1;

    //
    // NOTICE: This code only works when using play services v. 8.1 or higher.
    //

    // Creating the byte array this way and wrapping it, as opposed to using .allocate(),
    // should guarantee that there will be an array to work with.
    byte[] byteArray = new byte[bufferSize];
    ByteBuffer buffer = ByteBuffer.wrap(byteArray);
    if (!buffer.hasArray() || (buffer.array() != byteArray)) {
        // I don't think that this will ever happen.  But if it does, then we wouldn't be
        // passing the preview content to the underlying detector later.
        throw new IllegalStateException("Failed to create valid buffer for camera source.");
    }
    mBytesToByteBuffer.put(byteArray, buffer);
    return byteArray;
}

CRASH DEVICE INFO

enter image description here

2 个答案:

答案 0 :(得分:0)

为什么用大数字计算?

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn">
<shape android:shape="rectangle">
    <corners android:radius="30dp"/>
</shape>
</item>

可能是

    int bitsPerPixel = ImageFormat.getBitsPerPixel(ImageFormat.NV21);
    long sizeInBits = previewSize.getHeight() * previewSize.getWidth() * bitsPerPixel;
    int bufferSize = (int) Math.ceil(sizeInBits / 8.0d) + 1;

您不需要十进制转换并保持在int类型范围内。

你在哪一行获得了OOM-Error?

我不知道你是否可以要求设备提供空闲内存,并且如果可用的话小于计算的缓冲区大小,则会发出消息。

答案 1 :(得分:0)

那段代码来自Google的Android视觉库,我经常看到它复制到人们自己的项目中。

https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/CameraSource.java

这是一个特别占用内存的代码,因此如果您的设备内存不足,则很有可能会失败。我建议在您的应用上运行探查器,以查看泄漏的位置。

对我来说,泄漏发生在CameraSource周围,其中包含未正确处理的上述代码。确保您调用cameraSource!!.release()进行活动破坏,随着时间的推移会破坏其他活动,每次您击中该活动都会慢慢消耗掉更多的内存:)