2015-10-06 725 views
8

我正嘗試使用camera2 API創建一個應用程序,該應用程序從服務中獲取一些照片。Camera2 API onCaptureComplete()被調用,但相機狀態仍然是CONTROL_AE_STATE_PRECAPTURE

我可以從基於Camera2Basic sample的片段中獲取應用程序拍攝的照片。

但是,當我嘗試移動到服務的圖像不能正確完成捕獲。它永遠不會超過自動曝光預捕獲狀態。

我把它縮小到沒有預覽的問題。我已經把Camera2Basic代碼放在一起,並刪除預覽,導致相同的問題。

我把基於Camera2Basic示例的測試片段放在一起,其中我基本上只是刪除了預覽代碼。這裏上傳的代碼片段http://pastebin.ca/3182401

我得到onCaptureCompleted()回調,但是當我在這裏檢查相機的自動曝光狀態,它仍然在CONTROL_AE_STATE_PRECAPTURE狀態。

如果其中一個攝像頭狀態仍處於預捕,捕獲將會完成對我來說沒有任何意義。

任何人都知道這裏可能會發生什麼?

+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'始終爲空。任何想法爲什麼?我使用相同的樣本。並嘗試在多個設備上。 – iMDroid

回答

0

我認爲這是在你的邏輯瑕疵,你設置你的mState預捕獲狀態

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甚至在所有進入?

0

在文檔中沒有提到它,但onCaptureCompleted實際上是在發送請求時調用的,而不是在預捕獲或自動聚焦序列完成時調用。 Camera2Basic依靠不斷預覽運行,因爲預覽將作爲相機狀態的常量監視器。沒有它,你不會知道什麼時候precapture序列實際完成。

相關問題