Мое приложение вылетает при открытии камеры. Но только на некоторых специальных устройствах, таких как 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