Получите исключение BufferUnderflowException при захвате изображения

Мое приложение вылетает при открытии камеры. Но только на некоторых специальных устройствах, таких как Asus Z00ED Zenfone Laser. Android 5.0 и Sony Xperia Xa F3116 Android 7.0. Он вызвал исключение BufferUnderflowException, но я не знаю, почему и как это исправить.

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
        = new ImageReader.OnImageAvailableListener() {

    @Override
    public void onImageAvailable(ImageReader reader) {
        if (reader == null) {
            return;
        }

        Image captureImage = reader.acquireLatestImage();
        if (captureImage == null) {
            return;
        }

        final byte[] yuvBytes = new byte[(captureImage.getWidth() * captureImage.getHeight()) + (captureImage.getWidth() * captureImage.getHeight()) / 2];
        Log.i("Hung98", "onImageAvailable: " + (captureImage.getWidth() * captureImage.getHeight()) + (captureImage.getWidth() * captureImage.getHeight()) / 2);
        Log.i("Hung98", "width: " + captureImage.getWidth());
        Log.i("Hung98", "Height: " + captureImage.getHeight());
        int offset = 0;
        for (Image.Plane plane : captureImage.getPlanes()) {
            ByteBuffer buffer = plane.getBuffer();
            int rowStride = plane.getRowStride();
            int pixelStride = plane.getPixelStride();
            int width = captureImage.getWidth() / pixelStride;
            int height = captureImage.getHeight() / pixelStride;
            for (int row = 0; row < height; row++) {
                buffer.position(row * (rowStride / pixelStride));
                buffer.get(yuvBytes, offset, width);
                offset += width;
            }
        }

        onPreviewFrame(yuvBytes);

        captureImage.close();
    }
};

Вот изображение журнала:

Вот журнал:

03-31 16:42:02.817 19619-19619/com.densowave.dwqrkitsample E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.densowave.dwqrkitsample, PID: 19619
java.nio.BufferUnderflowException
    at java.nio.Buffer.checkGetBounds(Buffer.java:171)
    at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:113)
    at com.densowave.dwqrkit.DWQRCameraSurfaceView$2.onImageAvailable(DWQRCameraSurfaceView.java:626)
    at android.media.ImageReader$ListenerHandler.handleMessage(ImageReader.java:547)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5289)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)

Я зарегистрировал некоторые значения и вижу в строке 239, что буфер меньше ширины (длины буфера) => выброшено исключение BufferUnderflowException. Оставшийся буфер = предел буфера минус позиция, поэтому я думаю, что формула расчета позиции неверна в этом случае, но верна почти на другом устройстве.

04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample I/YUV: pos: 87952
04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample I/YUV: limit : 88320
04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample I/YUV: offset: 517680
04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample I/YUV: width: 720
04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample I/YUV: buffer remaining: 368
04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample I/YUV: row: 239
04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample D/AndroidRuntime: Shutting down VM
04-02 10:50:43.310 14888-14888/com.densowave.dwqrkitsample E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.densowave.dwqrkitsample, PID: 14888
    java.nio.BufferUnderflowException
        at java.nio.Buffer.checkGetBounds(Buffer.java:171)
        at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:113)
        at com.densowave.dwqrkit.DWQRCameraSurfaceView$2.onImageAvailable(DWQRCameraSurfaceView.java:643)
        at android.media.ImageReader$ListenerHandler.handleMessage(ImageReader.java:547)

Как я могу это исправить?

Этот ost может вам помочь: stackoverflow.com/questions/14807125/bufferunderflowexceptio‌ n

JHDev 31.03.2021 13:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
21
0

Другие вопросы по теме