Android:显示所有视图的屏幕截图

时间:2016-06-09 14:45:49

标签: android screenshot android-bitmap android-mediaprojection

我有一个具有以下布局的应用

  • SurfaceHolder
  • SurfaceView
  • CameraPreview
  • 查看(傻眼镜)

我想要做的就是拍摄照片/快照并观察它,看起来像是疯子/复杂

我首先拍摄了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);
    }

1 个答案:

答案 0 :(得分:2)

您正在为ImageFormat.RGB_565配置ImageReader,格式为0x4。虚拟显示器返回格式为0x1,PixelFormat.RGBA_8888的帧。 (是的,颜色格式有两个重叠的定义。)配置不匹配,因此错误。

将ImageReader创建行更改为使用RGBA_8888格式。

尝试创建位图时,您会遇到另一个问题。 decodeByteArray()适用于压缩数据,例如PNG或JPEG。它不知道如何解释原始像素数据。请使用Bitmap#createBitmap()之类的通话,在Bitmap.Config参数中传递ARGB_8888。

(有关更一般的评论,请参阅this answer。)