2016-12-11 19 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(); 
    } 
} 

私はこの問題を解決できますか?

ありがとうございます。

答えて

0

あなたが要求ビルダーのフラッシュモードを更新した後、あなたが

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

または同等の呼び出しを確認する必要があります。要求ビルダーは要求を作成するだけです。必要な新しい値を設定した後も依頼をカメラに送信する必要があります。

関連する問題