0

У меня есть приложение со следующей планировкойAndroid: Принимая скриншот всех взглядов на дисплее

  • SurfaceHolder
  • SurfaceView
  • CameraPreview
  • Посмотреть (глупые очки)

All Я хочу сделать снимок/снимок этого и заглядывая в него, кажется, бонкерс/комплекс

Сначала я сделал снимок SurfaceView и получил черный квадрат, кажется, что этот метод неверен

Теперь я использую MediaProjection/ImageReader?

Обновление: Так что я получаю изображение, но волнистые линии, и он падает, потому что я пытаюсь остановить MediaProjection. Как сказал все, что я хочу сделать, это принять единую картину

private void saveImage() 
    { 
     final Handler mHandler = new Handler(); 

     final ImageReader mImageReader = ImageReader.newInstance(cameraSurface.getWidth(), cameraSurface.getHeight(), PixelFormat.RGBA_8888, 2); 
     mProjection.createVirtualDisplay("screen-mirror", cameraSurface.getWidth(), cameraSurface.getHeight(), mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null); 

     mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { 
      @Override 
      public void onImageAvailable(ImageReader reader) { 
       Image image = null; 
       FileOutputStream fos = null; 
       Bitmap bitmap = null; 

       try { 
        image = mImageReader.acquireLatestImage(); 
        fos = new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "/myscreen.jpg"); 
        final Image.Plane[] planes = image.getPlanes(); 
        final Buffer buffer = planes[0].getBuffer().rewind(); 
        bitmap = Bitmap.createBitmap(cameraSurface.getWidth(), cameraSurface.getHeight(), Bitmap.Config.ARGB_8888); 
        bitmap.copyPixelsFromBuffer(buffer); 
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); 

        //MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Title" , "Desc"); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } finally { 
        if (fos!=null) { 
         try { 
          fos.close(); 
         } catch (IOException ioe) { 
          ioe.printStackTrace(); 
         } 
        } 

        if (bitmap!=null) 
         bitmap.recycle(); 

        if (image!=null) 
         image.close(); 

        if (mProjection!=null) { 
         mProjection.stop(); 
         mImageReader.close(); 

        } 
       } 
      } 

     }, mHandler); 
    } 

ответ

2

вы настраиваете свой ImageReader для ImageFormat.RGB_565, что формат 0x4. Виртуальный дисплей возвращает кадры в формате 0x1, PixelFormat.RGBA_8888. (Да, есть два совпадающих определения цветового формата.) Конфигурации не совпадают, следовательно, ошибка.

Измените свою линию создания ImageReader, чтобы использовать формат RGBA_8888.

У вас будет другая проблема при попытке создать растровое изображение. decodeByteArray() предназначен для сжатых данных, таких как PNG или JPEG. Он не будет знать, как интерпретировать необработанные пиксельные данные. Вместо этого используйте вызов, например Bitmap#createBitmap(), передав ARGB_8888 в параметре Bitmap.Config.

(Для получения более общего комментария см. this answer.)