Я использую пример Google, приведенный здесь .Я изменил OnImageAvailableListener
следующим образом:
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
= reader -> {
Image image = reader.acquireLatestImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
image.close();
String pictureId = "asdasd";
Bitmap bitmap = createMutableBitmap(bytes);
StorageClass.getInstance().put(pictureId, bitmap);
Intent intent = new Intent(Camera2MainActivity.this, TPCameraPreviewSnapActivity.class);
intent.setType("image/*");
intent.putExtra("pictureId", pictureId);
startActivityForResult(intent, 1123);
};
Там, где начинаются новые намерения, используется PhotoView для отображения растрового изображения.StorageClass
обеспечивает статический способ обмена большими данными (например, этими растровыми изображениями) между намерениями.
Кроме того, метод createMutableBitmap
:
public static Bitmap createMutableBitmap(byte[] data){
BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;
Log.d(TAG, "BT1: " + data.length);
Bitmap mutableBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);
Log.d(TAG, "BT2: " + mutableBitmap.getByteCount());
return mutableBitmap;
}
После выполнения этого кода вHuawei P30 Pro Я получаю вывод примерно так:
W/ImageReader_JNI: Unable to acquire a buffer item, very likely client tried to acquire more than maxImages buffers
E/ion: ioctl c0044901 failed with code -1: Invalid argument
D/Camera2BasicFragment: BT1: 1019119
W/ServiceManagement: getService: unable to call into hwbinder service for vendor.huawei.hardware.jpegdec@1.0::IJpegDecode/default.
D/HwAppInnerBoostImpl: asyncReportData rs.tp.camera2verifiedbypi,1,1,10,0 interval=2774
D/Camera2BasicFragment: BT2: 159694848
Независимо от того, как я изменяю качество изображения JPEG, число 159694848
выскакивает.159694848 байт - это ~ 160 МБ.
Впоследствии, при попытке установить Bitmap
в качестве источника для
`PhotoView`, I get an exception:
E/BitmapDrawable: Canvas: trying to use a recycled bitmap
W/System.err: java.lang.RuntimeException: Canvas: trying to draw too large(159694848bytes) bitmap.
Этот пример с моими изменениями отлично работает на всех других телефонах, которые я пробовал, но онипод управлением Android 8 или ниже.
Итак, в чем причина этой проблемы и как ее устранить?