2016-12-11 3 views
0

카메라 2 API를 사용하는 Google Camera2Basic 예제를 기반으로하는 응용 프로그램을 개발하고 있습니다. 플래시 모드를 전환 할 수있는 버튼을 추가하고 싶습니다.Android Camera2 - 플래시 모드 전환

다른 플래시 모드로 전환하려면 단추를 클릭 할 때 문제가 발생합니다. captureBuilder은 올바른 플래시 모드를 설정하지 않습니다. 처음으로 카메라를 열 때만 작동합니다.

setFlash있어서

private void setFlash(CaptureRequest.Builder requestBuilder) { 
    if (mFlashSupported) { 
     switch (mFlashMode) { 
      case FLASH_AUTO: 
       requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 
       requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF); 
       break; 
      case FLASH_ON: 
       rrequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH); 
       requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE); 
       break; 
      case FLASH_OFF: 
       requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); 
       requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF); 
       break; 
     } 
    } 
} 

createCameraPreviewSession있어서

private void createCameraPreviewSession() { 
    try { 
     ... 

     mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), 
       new CameraCaptureSession.StateCallback() { 

        @Override 
        public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { 
         if (null == mCameraDevice) { 
          return; 
         } 

         mCaptureSession = cameraCaptureSession; 
         try { 
          mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 
          setFlash(mPreviewRequestBuilder); 

          mPreviewRequest = mPreviewRequestBuilder.build(); 
          mCaptureSession.setRepeatingRequest(mPreviewRequest, 
            mCaptureCallback, mBackgroundHandler); 
         } catch (CameraAccessException e) { 
          ... 
         } 
        } 

        @Override 
        public void onConfigureFailed(
          @NonNull CameraCaptureSession cameraCaptureSession) { 
         ... 
        } 
       }, null 
     ); 
    } catch (CameraAccessException e) { 
     ... 
    } 
} 

captureStillPicture있어서

private void captureStillPicture() { 
    try { 
     final CaptureRequest.Builder captureBuilder = 
       mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
     captureBuilder.addTarget(mImageReader.getSurface()); 

     captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
       CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 
     setFlash(captureBuilder); 

     CameraCaptureSession.CaptureCallback CaptureCallback 
       = new CameraCaptureSession.CaptureCallback() { 

      @Override 
      public void onCaptureCompleted(@NonNull CameraCaptureSession session, 
              @NonNull CaptureRequest request, 
              @NonNull TotalCaptureResult result) { 
       unlockFocus(); 
      } 
     }; 

     mCaptureSession.stopRepeating(); 
     mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

unlockFocus 방법 :

private void unlockFocus() { 
    try { 
     mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, 
       CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); 
     mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, 
       mBackgroundHandler); 
     // After this, the camera will go back to the normal state of preview. 
     setFlash(mPreviewRequestBuilder); 
     mState = STATE_PREVIEW; 
     mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, 
       mBackgroundHandler); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

가 어떻게이 문제를 해결할 수

?

감사합니다. 당신이 요청 빌더의 플래시 모드를 업데이트 한 후

mPreviewRequest = mPreviewRequestBuilder.build(); 
mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, 
      mBackgroundHandler); 

또는 이에 상응하는 전화

답변

0

당신은 확인해야합니다. 요청 작성자는 요청을 생성합니다. 원하는 새 값을 설정 한 후에도 요청 빌더를 보내야합니다.