0

次のレイアウトのアプリがあります

  • 表面ホルダー
  • サーフェスビュー
  • カメラプレビュー
  • ビュー (愚かなメガネ)

私がやりたいのは、これの写真/スナップショットを撮り、それを調べることだけです。ばかげているようです/複雑です

最初に 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);
    }
4

1 に答える 1