Android Camera2 API切换后端摄像头

问题描述:

我正在用新的camera2 API创建一个自定义摄像头捕捉视频。Android Camera2 API切换后端摄像头

我的代码深受Google here提供的代码的启发。我的相机预览有一个按钮,可以从后置摄像头切换到前置摄像头,然后从前置摄像头切换回后置摄像头 默认情况下,“相机预览”活动与后置相机一起启动。

出于某种原因,当我点击了“开关/交换相机”按钮首次上,它带来的是前置摄像头,因为它应该,但每次我再次点击,开关/交换没有按”不再工作:预览(在前置摄像头上)会稍微变淡,就像发生了某种情况一样,但仍保留在当前选定的(前置)摄像头上。

这里是我的代码:

RecordVideoFragment,在onViewCreated

// Switch camera button 
     switchCameraButton = (ImageButton) view.findViewById(R.id.button_switch_camera); 
     // Listener for Switch cameras button 
     switchCameraButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       switchCameras(); 
      } 
     }); 

这里是switchCameras()功能:

private void switchCameras() { 
     mCameraOpenCloseLock.release(); 
     mCameraDevice.close(); 

     CameraManager mCameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE); 
     try { 
      String mCameraId = mCameraManager.getCameraIdList()[0]; 
      if (mCameraId.equals("0")) { // If currently on FRONT camera (0 = CameraCharacteristics.LENS_FACING_FRONT) 
       mCameraId = "1";   // switch to BACK camera (1 = CameraCharacteristics.LENS_FACING_BACK) 
       switchCameraButton.setImageResource(R.drawable.ic_camera_front); 
      } else { // If currently on BACK camera 
       mCameraId = "0"; // switch to front camera 
       switchCameraButton.setImageResource(R.drawable.ic_camera_back); 
      } 
      try { 
       if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) 
         == PackageManager.PERMISSION_GRANTED) { 
        mCameraManager.openCamera(mCameraId, mStateCallback, null); 
       } else { 
        requestVideoPermissions(); 
       } 
      } catch (CameraAccessException e) { 
       e.printStackTrace(); 
      } 
     } catch (CameraAccessException e) { 
      Toast.makeText(getActivity(), "Cannot access the camera.", Toast.LENGTH_SHORT).show(); 
      getActivity().finish(); 
     } 
    } 

如果你对所发生的事情的任何想法那会救我。几天来我一直在窃听。非常感谢您

你需要做的是引入新的变量是什么:

public static final String CAMERA_FRONT = "1"; 
public static final String CAMERA_BACK = "0"; 

private String cameraId = CAMERA_BACK; 

删除cameraIdlocal variableopenCamera方法。

public void switchCamera() { 
    if (cameraId.equals(CAMERA_FRONT)) { 
     cameraId = CAMERA_BACK; 
     closeCamera(); 
     reopenCamera(); 
     switchCameraButton.setImageResource(R.drawable.ic_camera_front); 

    } else if (cameraId.equals(CAMERA_BACK)) { 
     cameraId = CAMERA_FRONT; 
     closeCamera(); 
     reopenCamera(); 
     switchCameraButton.setImageResource(R.drawable.ic_camera_back); 
    } 
} 

public void reopenCamera() { 
    if (mTextureView.isAvailable()) { 
     openCamera(mTextureView.getWidth(), mTextureView.getHeight()); 
    } else { 
     mTextureView.setSurfaceTextureListener(mSurfaceTextureListener); 
    } 
} 
+0

当我使用这个预览的大小改变...我怎么能防止这个? – Andrea

+0

检查你的纹理视图是否给出了相同的尺寸,因为在reopenCamera方法中,这是再次设置的。 – MrOnyszko

+0

我跟着你的代码,但它不适合我。我在“setUpCameraOutputs”方法'Integer facing = features.get(CameraCharacteristics.LENS_FACING); if(facing!= null && facing == CameraCharacteristics.LENS_FACING_FRONT){ continue; }' 所以我删除了这个条件,但仍然没有working.i后面[this](https://github.com/googlesamples/android-Camera2Basic) –

看着MrOnyszko答案i之后跟着一个稍微不同的方法:

Camera2Basic教程面对方向的透镜被用来设置右照相机,所以我关闭并重新打开之前改变该方向相机。

private void switchCamera() { 
    if (mCameraLensFacingDirection == CameraCharacteristics.LENS_FACING_BACK) { 
     mCameraLensFacingDirection = CameraCharacteristics.LENS_FACING_FRONT; 
     closeCamera(); 
     reopenCamera(); 

    } else if (mCameraLensFacingDirection == CameraCharacteristics.LENS_FACING_FRONT) { 
     mCameraLensFacingDirection = CameraCharacteristics.LENS_FACING_BACK; 
     closeCamera(); 
     reopenCamera(); 
    } 
} 

private void reopenCamera() { 
    if (mTextureView.isAvailable()) { 
     openCamera(mTextureView.getWidth(), mTextureView.getHeight()); 
    } else { 
     mTextureView.setSurfaceTextureListener(mSurfaceTextureListener); 
    } 
} 


private void setUpCameraOutputs(int width, int height) { 
    Activity activity = getActivity(); 
    CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); 
    try { 
     for (String cameraId : manager.getCameraIdList()) { 
      CameraCharacteristics characteristics 
        = manager.getCameraCharacteristics(cameraId); 

      Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING); 
      if (facing != null && facing != mCameraLensFacingDirection) { 
       continue; 
      } 
      ...