2015-10-06 16 views
8

カメラ2 APIを使用してサービスから写真を撮るアプリケーションを作成しようとしています。Camera2 API onCaptureComplete()は呼び出されましたが、カメラの状態はまだCONTROL_AE_STATE_PRECAPTUREです。

私は、Camera2Basic sampleに基づくフラグメントから写真を細かく撮ることができます。

しかし、私がサービスに移動しようとすると、イメージは正しくキャプチャを終了しません。それは、自動露出予兆状態を過ぎて進行することはありません。

プレビューしていないと何か問題にまで絞りました。私は、Camera2Basicコードを取ってプレビューを取り除くことで、テストの断片をまとめました。その結果、同じ問題が発生します。

私は基本的にプレビューのコードを削除したCamera2Basicサンプルに基づいて、問題があるテストフラグメントをまとめました。ここにアップロードされたフラグメントコードhttp://pastebin.ca/3182401

私はonCaptureCompleted()コールバックを取得していますが、私はここでカメラの自動露出の状態を確認するとき、それはCONTROL_AE_STATE_PRECAPTURE状態のままです。

カメラの状態のうちの1つでもまだ捕捉されていない場合、キャプチャが完了するとは思われません。

ここで何が起こっているのですか?

+0

写真を撮った後、次の写真の準備をするためにカメラは予備捕捉状態に戻ることは可能でしょうか? – Jani

+0

そうではありません。ドキュメントには、CONVERGEDまたはFLASH_REQUIRED状態でロックする必要があることが記載されています。その後、画像が撮影されるか、アプリケーションがandroid.control.aeLock == trueを指定してリクエストを送信し、android.control.aeLock == falseを指定してリクエストを送信します。 https://developer.android.com/reference/ android/hardware/camera2/CaptureRequest.html#CONTROL_AE_PRECAPTURE_TRIGGER – user2128112

+0

「CONTROL_AE_STATE」は常にnullになります。どんな考え?私は同じサンプルを使用しています。複数のデバイスで試しました。 – iMDroid

答えて

0

私は前の状態

private void process(CaptureResult result) { 
     switch (mState) { 
      case STATE_PREVIEW: { 
       // We have nothing to do when the camera preview is working normally. 
       break; 
      } 
      case STATE_WAITING_LOCK: { 
       Integer afState = result.get(CaptureResult.CONTROL_AF_STATE); 
       if (afState == null) { 
        captureStillPicture(); 
       } else if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState || 
         CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) { 
        // CONTROL_AE_STATE can be null on some devices 
        Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); 
        if (aeState == null || 
          aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) { 
         mState = STATE_PICTURE_TAKEN; 
         captureStillPicture(); 
        } else { 
         runPrecaptureSequence(); 
        } 
       } 
       break; 
      } 
      case STATE_WAITING_PRECAPTURE: { 
       // CONTROL_AE_STATE can be null on some devices 
       Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); 
       if (aeState == null || 
         aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE || 
         aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) { 
        mState = STATE_WAITING_NON_PRECAPTURE; 
       } 
       break; 
      } 
      case STATE_WAITING_NON_PRECAPTURE: { 
       // CONTROL_AE_STATE can be null on some devices 
       Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); 
       if (aeState == null || aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) { 
        mState = STATE_PICTURE_TAKEN; 
        captureStillPicture(); 
       } 
       break; 
      } 
     } 
    } 

が全く入力されても、STATE_WAITING_PRECAPTUREを小文字だろキャプチャとして、あなたのmStateを設定し、あなたのロジックに欠陥があると思いますか?

0

ドキュメントには記載されていませんが、要求が送信されたときにonCaptureCompletedが実際に呼び出されます。プリキャプチャまたはオートフォーカスシーケンスが終了したときではありません。 Camera2Basicは、プレビューがカメラの状態の常時モニタとして機能するため、常に実行されるプレビューに依存します。それがなければ、プリキャプチャーシーケンスがいつ実際に終了するかはわかりません。

関連する問題