2016-08-18 351 views
4

我正在用新的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(); 
     } 
    } 

如果你對所發生的事情的任何想法那會救我。幾天來我一直在竊聽。非常感謝您

回答

10

你需要做的是引入新的變量是什麼:

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

1

看着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; 
      } 
      ...