2016-05-10 71 views
2

私の問題は、別のフラッシュモードを切り替えてからイメージをキャプチャしたい場合です。captureBuilderは選択したフラッシュモードを設定しません。それは、私がカメラを閉じて再び開くときにのみ機能します。Camera2 APIのスイッチフラッシュ

私はhttps://github.com/googlesamples/android-Camera2Basicを出発点として取りました。

私の方法:

private void captureStillPicture() { 
    try { 
    final Activity activity = (Activity) context; 
    if (null == activity || null == mCameraDevice) { 
     return; 
    } 
    // This is the CaptureRequest.Builder that we use to take a picture. 
    CaptureRequest.Builder captureBuilder = 
      mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
    captureBuilder.addTarget(mImageReader.getSurface()); 

    // Use the same AE and AF modes as the preview. 
    captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
      CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 
    setCurrentFlash(captureBuilder); 

    // Orientation 
    int rotation = activity.getWindowManager() 
      .getDefaultDisplay() 
      .getRotation(); 
    captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation)); 

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

       @Override 
       public void onCaptureCompleted(@NonNull CameraCaptureSession session, 
        @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { 
       super.onCaptureCompleted(session, request, result); 
       Toast.makeText(context, "image captured", Toast.LENGTH_SHORT) 
         .show(); 
       unlockFocus(); 
       } 
      }; 

       mCaptureSession.stopRepeating(); 
    mCaptureSession.capture(captureBuilder.build(), captureCallback, null); 
    } catch (CameraAccessException e) { 
    Log.e(this.getClass() 
      .getSimpleName(), e.getMessage(), e); 
    } 

これはsetCurrentFlash方法である:

private void setCurrentFlash(CaptureRequest.Builder requestBuilder) { 
    if (mFlashSupported) { 
    switch (flashMode.name()) { 
     case FLASH_AUTO: 
      requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
       CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 
      break; 
     case FLASH_ON: 
      requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
       CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH); 
      break; 
     case FLASH_OFF: 
      requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); 
      break; 
     default: 
      requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
       CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 
      break; 
    } 
    } 

なぜビルダーをキャプチャする前にフラッシュを正しく設定されていない任意のアイデア?

***** EDIT *****エディTalvalaは更新したい

private void runPrecaptureSequence() { 
    try { 
    // This is how to tell the camera to trigger. 
    setCurrentFlash(previewRequestBuilder); 
    previewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, 
      CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START); 
    // Tell #mCaptureCallback to wait for the precapture sequence to be set. 
    state = STATE_WAITING_PRECAPTURE; 
    captureSession.capture(previewRequestBuilder.build(), mCaptureCallback, backgroundHandler); 
    } catch (CameraAccessException e) { 
    e.printStackTrace(); 
    } 

答えて

4

を示唆したように)(runPrecaptureSequenceを呼び出すときpreviewRequestBuilderにフラッシュを設定することで問題を解決しまし

プレビューリクエストにもフラッシュモードがあります。通常、カメラデバイスは、AE_PRECAPTURE_TRIGGERを使用してプリキャプチャシーケンスをトリガするときに、目的のフラッシュモードを知りたいので、最終的なフラッシュパワーを決定する必要があるプリキャプチャフラッシュをオンにする必要があるかどうかを知ることができます。

イベントの通常の順序は次のとおりです。

  1. 設定プレビューフラッシュモードたいモードにprecaptureトリガが設定された単一プレビュー要求を発行します(ただし、プレビューを保つシャッターボタン
  2. をヒットするユーザーのための
  3. 待ちリクエストがなければ繰り返し)。
  4. AE_STATE_PRECAPTUREはキャプチャでAE状態であることを停止するのを待つが、最終的なキャプチャ要求(同じフラッシュモードを保つ)
  5. は(これは確実に無視し、あなたのImageReaderで

を、最終的なJPEGを取得

  • 問題の結果フォーカスは良いですが、これは一般にプリキャプチャシーケンスを開始する前に/並行して行われます)

  • +0

    私はこの解決方法を試しましたが、まだ問題が発生しています。 FLASH_MODE_ONとCONTROL_AE_MODE_ON_ALWAYS_FLASHの違いは何ですか?前者を使用すると、一部のSamsungデバイスを除くすべてのデバイスで正常に動作します。後者はカメラを再起動するまで適用されません。私は言及したように適切な場所にフラッシュを設定しています。 –

    関連する問題