Ошибка снимка экрана Android: буфер формата BLOB, переопределяющий RGBA, должен иметь высоту == ширину

Я пытаюсь сделать скриншоты своего Android-устройства (Samsung Galaxy Tab S5e) с помощью службы. Я использую код из здесь.

В связанном коде используется ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 2);. Обратите внимание на PixelFormat.RGBA_8888. Теперь это не позволит мне скомпилировать мой проект, и меня встречает ошибка: Error: Must be one of: ImageFormat.UNKNOWN, ImageFormat.RGB_565... etc.

Итак, я попытался изменить PixelFormat.RGBA_8888 на ImageFormat.JPEG, и он скомпилировался. Однако мое приложение теперь вылетает с сообщением:

Буфер формата BLOB, переопределяющий RGBA, должен иметь высоту == ширину

Я пытался изменить PixelFormat.RGBA_8888 на 0x4, 0x1, ImageFormat.RGB_565 и некоторые другие. Это часто приводит к исключению с сообщением:

Формат выходного буфера производителя 0x1 не соответствует настроенному формату буфера ImageReader 0x4.

Это каким-то образом связано с форматом, описанным в onImageAvailable(ImageReader reader).

Я видел следующий пост SO, и он кажется правильным формат зависит от устройства, но я пробовал их все, и ошибка одна из вышеперечисленных.

Я в полной растерянности (и я новичок в Java/Android), поэтому мне действительно нужна помощь.


person pookie    schedule 14.08.2020    source источник
comment
Вы уже нашли ответ? У меня такая же проблема.   -  person Teekam Suthar    schedule 03.12.2020
comment
@TeekamSuthar В конце концов я выполнил PixelCopy request. См. документацию здесь developer.android.com/reference/android/view/PixelCopy и пример здесь: stackoverflow.com/a/51103037/596841 Обратите внимание, что я не встраивал это в службу, хотя должно быть возможно.   -  person pookie    schedule 03.12.2020
comment
Спасибо за быстрый ответ. Попробую это!   -  person Teekam Suthar    schedule 04.12.2020
comment
столкнулся с той же проблемой. при удаче?   -  person Usman Rana    schedule 16.01.2021
comment
@UsmanRana проверь мой комментарий   -  person pookie    schedule 16.01.2021
comment
@pookie Я хочу сделать снимок экрана, даже если приложение находится в фоновом режиме. Но Pixelcopy принимает поверхность держателя вида.   -  person Usman Rana    schedule 16.01.2021


Ответы (1)


Создайте программу чтения изображений следующим образом:

 ImageReader imageReader =ImageReader.newInstance(width,
            height,
            PixelFormat.RGBA_8888,
            MAX_IMAGE_COUNT);

Затем на изображении, доступном слушателю, создайте растровое изображение как,

          try {
                image = reader.acquireLatestImage();
                if (image != null && mImagesProduced == 0){
                    Image.Plane[] planes = image.getPlanes();
                    Buffer imageBuffer = planes[0].getBuffer().rewind();

                    int pixelStride = planes[0].getPixelStride();
                    int rowStride = planes[0].getRowStride();
                    int rowPadding = rowStride - pixelStride * width;

                    // create bitmap
                    bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height,
                            Bitmap.Config.ARGB_8888);
                    bitmap.copyPixelsFromBuffer(imageBuffer);

                    saveImage(context, bitmap);
                }

Надеюсь, что это работает

person Abhijith Brumal    schedule 18.01.2021