switch back/front camera on fly

后端 未结 5 1011
暖寄归人
暖寄归人 2020-11-30 22:55

If I use only CAMERA_FACING_BACK or CAMERA_FACING_FRONT all works fine.

I have trouble with switch from CAMERA_FACING_BACK to

相关标签:
5条回答
  • 2020-11-30 23:39

    Use this code:

    if (mCamera != null) {
          mCamera.stopPreview();                  
          mCamera.release();
          mCamera = null;
    }
    
    //swap the id of the camera to be used
    if (currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK)
      currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT;
    else 
      currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;         
    
    try {                
           mCamera = Camera.open(currentCameraId);   
    
           mCamera.setDisplayOrientation(90);
    
           mCamera.setPreviewDisplay(surfaceHolder);               
    
           mCamera.startPreview();
    
         } 
    catch (Exception e) { e.printStackTrace(); } 
    
    0 讨论(0)
  • 2020-11-30 23:43

    In onCreate() of my activity I add the following onClick listener to a button overlayed on my Preview SurfaceView (there are numerous example on the web for previewing):

    ImageButton useOtherCamera = (ImageButton) findViewById(R.id.useOtherCamera);
    //if phone has only one camera, hide "switch camera" button
    if(Camera.getNumberOfCameras() == 1){
        useOtherCamera.setVisibility(View.INVISIBLE);
    }
    else {
        useOtherCamera.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        if (inPreview) {
            camera.stopPreview();
        }
        //NB: if you don't release the current camera before switching, you app will crash
        camera.release();
    
        //swap the id of the camera to be used
        if(currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK){
            currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT;
        }
        else {
            currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;
        }
        camera = Camera.open(currentCameraId);
        //Code snippet for this method from somewhere on android developers, i forget where
        setCameraDisplayOrientation(CameraActivity.this, currentCameraId, camera);
        try {
            //this step is critical or preview on new camera will no know where to render to
            camera.setPreviewDisplay(previewHolder);
        } catch (IOException e) {
            e.printStackTrace();
        }
        camera.startPreview();
    }
    

    On my test device the back camera has an ID of 0 and the front has an id of 1. I suggest using Camera.CameraInfo static variables for your camera id's rather than hard-coding values. I am sure that will only cause issues on other devices.

    0 讨论(0)
  • 2020-11-30 23:45

    I removed and re-added SurfaceView in my layout and so it worked.

    public void switchCamera(int cameraType)
    {
        if(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT))
        {
            if(Camera.getNumberOfCameras() > cameraType)
            {
                // Set selected camera
                this.cameraType = cameraType;
            }
            else
            {
                // Set default camera (Rear)
                this.cameraType = Camera.CameraInfo.CAMERA_FACING_BACK;
            }
    
            if(mCamera != null)
            {
                // Destroy previuos Holder
                surfaceDestroyed(holder);
                holder.removeCallback(this);
    
                // Remove and re-Add SurfaceView
                ViewGroup rootLayout = (ViewGroup) surface.getParent();
                rootLayout.removeView(surface);
                surface = new SurfaceView(context);
                holder = surface.getHolder();
                holder.addCallback(this);
                rootLayout.addView(surface, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-30 23:51

    I have to remove the surface preview before adding a new one:

    if (mPreview != null) {
            mPreview.surfaceDestroyed(mPreview.getHolder());
            mPreview.getHolder().removeCallback(mPreview);
            mPreview.destroyDrawingCache();
            FrameLayout preview = (FrameLayout) view.findViewById(R.id.camera_frame);
            preview.removeView(mPreview);
            mPreview.mCamera = null;
            mPreview = null;
    
        }
    
    //then add your preview
    
    0 讨论(0)
  • 2020-11-30 23:56

    I restart Activity with cameraId = 2 and this is working.

    0 讨论(0)
提交回复
热议问题