2015-10-06 16 views
8

Sto tentando di creare un'applicazione che scatta alcune foto da un servizio utilizzando l'API camera2.Camera2 API onCaptureComplete() viene chiamato ma lo stato della videocamera è ancora CONTROL_AE_STATE_PRECAPTURE

Posso ottenere l'immagine per scattare foto da un frammento basato sullo Camera2Basic sample.

Ma quando provo a passare a un servizio, l'immagine non termina correttamente l'acquisizione. Non progredisce mai oltre lo stato di pre-esposizione dell'autoesposizione.

L'ho ristretto ad alcuni problemi con non avere un'anteprima. Ho assemblato un frammento di prova prendendo il codice Camera2Basic e rimuovendo l'anteprima, il che si traduce nello stesso problema.

Ho messo insieme un frammento di test che presenta il problema, basato sull'esempio di Camera2Basic in cui ho praticamente rimosso il codice per l'anteprima. Codice del frammento caricato qui http://pastebin.ca/3182401.

sto ottenendo il callback onCaptureCompleted() ma quando posso controllare lo stato della macchina fotografica esposizione automatica qui, è ancora in CONTROL_AE_STATE_PRECAPTURE Stato.

Non ha senso per me che l'acquisizione sia completata se uno degli stati della videocamera è ancora in precapture.

Qualcuno sa cosa potrebbe accadere qui?

+0

È possibile che dopo aver scattato una foto, la fotocamera ritorni allo stato precapato per preparare la foto successiva? – Jani

+0

Non dovrebbe essere il caso. La documentazione dice che dovrebbe bloccare lo stato CONVERGED o FLASH_REQUIRED. Quindi rimane bloccato finché non viene scattata una foto o l'applicazione invia una richiesta con android.control.aeLock == true, seguito da una richiesta con android.control.aeLock == false https://developer.android.com/reference/ android/hardware/camera2/CaptureRequest.html # CONTROL_AE_PRECAPTURE_TRIGGER – user2128112

+0

sto ottenendo sempre "CONTROL_AE_STATE'. Qualche idea del perché? sto usando lo stesso campione. E provato su più dispositivi. – iMDroid

risposta

0

Penso che ci sia un difetto nella logica in cui si imposta il mState come stato di cattura pre

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; 
      } 
     } 
    } 

Sarebbe tra maiuscole STATE_WAITING_PRECAPTURE anche essere inserito a tutti?

0

Non è menzionato nei documenti, ma onCaptureCompleted viene effettivamente chiamato quando la richiesta è stata inviata, non quando precapture o sequenza di messa a fuoco automatica è finita. Camera2Basic si basa costantemente sull'anteprima, poiché l'anteprima funge da monitor costante per lo stato della videocamera. Senza di esso, non saprai quando la sequenza di precapture finisce effettivamente.