代码之家  ›  专栏  ›  技术社区  ›  Twing90

与surfaceview合影

  •  1
  • Twing90  · 技术社区  · 6 年前

    我试着创建一个应用程序,让我在SurfaceView中看到我用前摄像头看到的东西。我试图实现一个按钮,让我采取的活动截图,因为在相机我有一个面具。当我执行屏幕截图时,我只能捕获我的面具的屏幕截图,它位于surfaceView的上方。 我不知道我做错了什么。 有人能帮我吗? 我的目的是创建一个应用程序,让我可以在我的脸上戴着面具拍一张自己的照片。 她就是我虚拟设备的例子。 enter image description here

     public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Handler.Callback {
    
        static final String TAG = "CamTest";
        static final int MY_PERMISSIONS_REQUEST_CAMERA = 1242;
        private static final int MSG_CAMERA_OPENED = 1;
        private static final int MSG_SURFACE_READY = 2;
        private final Handler mHandler = new Handler(this);
        SurfaceView mSurfaceView;
        SurfaceHolder mSurfaceHolder;
        CameraManager mCameraManager;
        String[] mCameraIDsList;
        CameraDevice.StateCallback mCameraStateCB;
        CameraDevice mCameraDevice;
        CameraCaptureSession mCaptureSession;
        boolean mSurfaceCreated = true;
        boolean mIsCameraConfigured = false;
        private Surface mCameraSurface = null;
        Button btt_scatta;
        Bitmap immagine_screen;
        ImageView img_view_screen;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            //Richiedo il Fullscreen
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
            setContentView(R.layout.activity_main);
    
            //Get root view from Activity
            final View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
    
            btt_scatta = (Button) findViewById(R.id.btt_scatta);
            img_view_screen = (ImageView) findViewById(R.id.img_view_screen);
            img_view_screen.setVisibility(View.GONE);
    
            this.mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);
            this.mSurfaceHolder = this.mSurfaceView.getHolder();
            this.mSurfaceHolder.addCallback(this);
            this.mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
    
            try {
                mCameraIDsList = this.mCameraManager.getCameraIdList();
                for (String id : mCameraIDsList) {
                    Log.v(TAG, "CameraID: " + id);
                }
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
    
            mCameraStateCB = new CameraDevice.StateCallback() {
                @Override
                public void onOpened(CameraDevice camera) {
                    Toast.makeText(getApplicationContext(), "onOpened", Toast.LENGTH_SHORT).show();
    
                    mCameraDevice = camera;
                    mHandler.sendEmptyMessage(MSG_CAMERA_OPENED);
                }
    
                @Override
                public void onDisconnected(CameraDevice camera) {
                    Toast.makeText(getApplicationContext(), "onDisconnected", Toast.LENGTH_SHORT).show();
                }
    
                @Override
                public void onError(CameraDevice camera, int error) {
                    Toast.makeText(getApplicationContext(), "onError", Toast.LENGTH_SHORT).show();
                }
            };
    
            btt_scatta.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    btt_scatta.setVisibility(View.GONE);
                    immagine_screen = getScreenShot(rootView);
                    store(immagine_screen,"screenshot Honor");
                    img_view_screen.setVisibility(View.VISIBLE);
                    img_view_screen.setImageBitmap(immagine_screen);
                }
            });
        }
    
        @Override
        protected void onStart() {
            super.onStart();
    
            //requesting permission
            int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
            if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
    
                } else {
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA);
                    Toast.makeText(getApplicationContext(), "request permission", Toast.LENGTH_SHORT).show();
                }
            } else {
                Toast.makeText(getApplicationContext(), "PERMISSION_ALREADY_GRANTED", Toast.LENGTH_SHORT).show();
                try {
                    mCameraManager.openCamera(mCameraIDsList[1], mCameraStateCB, new Handler());
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            try {
                if (mCaptureSession != null) {
                    mCaptureSession.stopRepeating();
                    mCaptureSession.close();
                    mCaptureSession = null;
                }
    
                mIsCameraConfigured = false;
            } catch (final CameraAccessException e) {
                // Doesn't matter, cloising device anyway
                e.printStackTrace();
            } catch (final IllegalStateException e2) {
                // Doesn't matter, cloising device anyway
                e2.printStackTrace();
            } finally {
                if (mCameraDevice != null) {
                    mCameraDevice.close();
                    mCameraDevice = null;
                    mCaptureSession = null;
                }
            }
        }
    
        @Override
        public boolean handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_CAMERA_OPENED:
                case MSG_SURFACE_READY:
                    // if both surface is created and camera device is opened
                    // - ready to set up preview and other things
                    if (mSurfaceCreated && (mCameraDevice != null)
                            && !mIsCameraConfigured) {
                        configureCamera();
                    }
                    break;
            }
    
            return true;
        }
    
        private void configureCamera() {
            // prepare list of surfaces to be used in capture requests
            List<Surface> sfl = new ArrayList<Surface>();
    
            sfl.add(mCameraSurface); // surface for viewfinder preview
    
            // configure camera with all the surfaces to be ever used
            try {
                mCameraDevice.createCaptureSession(sfl,
                        new CaptureSessionListener(), null);
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
    
            mIsCameraConfigured = true;
        }
    
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
            switch (requestCode) {
                case MY_PERMISSIONS_REQUEST_CAMERA:
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)
                        try {
                            mCameraManager.openCamera(mCameraIDsList[1], mCameraStateCB, new Handler());
                        } catch (CameraAccessException e) {
                            e.printStackTrace();
                        }
                    break;
            }
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            mCameraSurface = holder.getSurface();
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            mCameraSurface = holder.getSurface();
            mSurfaceCreated = true;
            mHandler.sendEmptyMessage(MSG_SURFACE_READY);
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            mSurfaceCreated = false;
        }
    
        private class CaptureSessionListener extends
                CameraCaptureSession.StateCallback {
            @Override
            public void onConfigureFailed(final CameraCaptureSession session) {
                Log.d(TAG, "CaptureSessionConfigure failed");
            }
    
            @Override
            public void onConfigured(final CameraCaptureSession session) {
                Log.d(TAG, "CaptureSessionConfigure onConfigured");
                mCaptureSession = session;
    
                try {
                    CaptureRequest.Builder previewRequestBuilder = mCameraDevice
                            .createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                    previewRequestBuilder.addTarget(mCameraSurface);
                    mCaptureSession.setRepeatingRequest(previewRequestBuilder.build(),
                            null, null);
                } catch (CameraAccessException e) {
                    Log.d(TAG, "setting up preview failed");
                    e.printStackTrace();
                }
            }
        }
    
        //Capture the root view
        public static Bitmap getScreenShot(View view) {
            View screenView = view.getRootView();
            screenView.setDrawingCacheEnabled(true);
            Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
            screenView.setDrawingCacheEnabled(false);
            return bitmap;
        }
    
        //Store the Bitmap into the phone
        public static void store(Bitmap bm, String fileName){
            final String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Screenshots";
            File dir = new File(dirPath);
            if(!dir.exists())
                dir.mkdirs();
            File file = new File(dirPath, fileName);
            try {
                FileOutputStream fOut = new FileOutputStream(file);
                bm.compress(Bitmap.CompressFormat.PNG, 85, fOut);
                fOut.flush();
                fOut.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    我认为一个好的解决办法是用相机拍一张照片,然后在我的面具下放进一个图像视图,然后拍一张截图。但问题是和surfaceView合影:我不知道该怎么做。

    0 回复  |  直到 6 年前