2015-02-06 342 views
3

我使用的是camera2 google示例,效果很好。在後置攝像頭和前置攝像頭之間切換

但我怎麼可以切換前後的一個按鈕之間的相機?

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); 

      // We don't use a front facing camera in this sample. Para trocar, colocar != no lugar de ==. 
      if (characteristics.get(CameraCharacteristics.LENS_FACING) 
        == CameraCharacteristics.LENS_FACING_FRONT) { 
       continue; 
      } 

      StreamConfigurationMap map = characteristics.get(
        CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 

      // For still image captures, we use the largest available size. 
      Size largest = Collections.max(
        Arrays.asList(map.getOutputSizes(ImageFormat.JPEG)), 
        new CompareSizesByArea()); 
      mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), 
        ImageFormat.JPEG, /*maxImages*/2); 
      mImageReader.setOnImageAvailableListener(
        mOnImageAvailableListener, mBackgroundHandler); 

      // Danger, W.R.! Attempting to use too large a preview size could exceed the camera 
      // bus' bandwidth limitation, resulting in gorgeous previews but the storage of 
      // garbage capture data. 
      mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), 
        width, height, largest); 

      // We fit the aspect ratio of TextureView to the size of preview we picked. 
      int orientation = getResources().getConfiguration().orientation; 
      if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
       mTextureView.setAspectRatio(
         mPreviewSize.getWidth(), mPreviewSize.getHeight()); 
      } else { 
       mTextureView.setAspectRatio(
         mPreviewSize.getHeight(), mPreviewSize.getWidth()); 
      } 

      mCameraId = cameraId; 
      return; 
     } 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } catch (NullPointerException e) { 
     // Currently an NPE is thrown when the Camera2API is used but not supported on the 
     // device this code runs. 
     new ErrorDialog().show(getFragmentManager(), "dialog"); 
    } 
} 

`

回答

5
@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.btn_switch_camera: 

      closeCamera(); 
      if (mCameraId.equals("0")) { 
       mCameraId = "1"; 
      } else { 
       mCameraId = "0"; 
      } 
      CameraManager cameraManager = (CameraManager) Camera2Demo.this.getSystemService(Context.CAMERA_SERVICE); 
      try { 
       cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mHandler); 
      } catch (CameraAccessException e) { 
       e.printStackTrace(); 
      } 

      break; 
    } 
} 

和功能 「closeCamera()」 在這裏

private void closeCamera() { 
    mSession.close(); 
    mSession = null; 
    mCameraDevice.close(); 
    mCameraDevice = null; 
} 
+0

的OP再也沒有回來,但我demo'd這個確切的代碼和它的工作。這正是我所需要的。 – 2015-12-16 19:35:58

+0

如果前置相機和後置相機具有不同的尺寸/寬高比,此方法將使用前置攝像頭的寬高比。你有解決方案嗎? – gbhall 2016-01-24 08:04:45

+0

非常感謝您使用此解決方案。此代碼運行良好,旋轉前置攝像頭並再次旋轉後置攝像頭。但是,當單擊保存圖片按鈕時,在使用前置攝像頭時不會保存圖片。後置攝像頭拍攝圖片正在工作 – Steve 2016-11-16 11:12:34

相關問題