2015-10-06 5 views
8

Ich versuche eine App zu erstellen, die einige Fotos von einem Dienst mit der camera2 API erstellt.Camera2 API onCaptureComplete() wird aufgerufen, aber der Kamerazustand ist immer noch CONTROL_AE_STATE_PRECAPTURE

Ich kann die App erhalten, Bilder von einem Fragment basierend auf der Camera2Basic sample fein zu machen.

Aber wenn ich versuche, zu einem Dienst zu wechseln, wird das Bild nicht korrekt aufgenommen. Es schreitet niemals über den automatischen Erhaltungszustand hinaus.

Ich beschränkte es auf ein Problem mit einer Vorschau. Ich habe ein Testfragment zusammengestellt, indem ich den Code Camera2Basic genommen und die Vorschau entfernt habe, was zu dem gleichen Problem führt.

Ich habe ein Testfragment zusammengestellt, das das Problem hat, basierend auf dem Camera2Basic Beispiel, wo ich im Grunde nur Code für die Vorschau entfernt habe. Fragment Code hier hochgeladen http://pastebin.ca/3182401.

Ich erhalte die onCaptureCompleted() Rückruf, aber wenn ich die automatische Belichtung Zustand Kamera überprüfen hier, es ist immer noch in der CONTROL_AE_STATE_PRECAPTURE Zustand.

Es macht für mich keinen Sinn, dass die Erfassung abgeschlossen wäre, wenn einer der Kamerazustände noch im Vorlauf ist.

Wer weiß, was hier passieren könnte?

+0

Ist es möglich, dass die Kamera nach der Aufnahme eines Fotos in den Vorspannzustand zurückkehrt, um sich auf das nächste Foto vorzubereiten? – Jani

+0

Sollte nicht der Fall sein. Die Dokumentation besagt, dass der Status CONVERGED oder FLASH_REQUIRED gesperrt werden soll. Dann bleibt es gesperrt, bis ein Bild aufgenommen wird oder die Anwendung eine Anfrage mit android.control.aeLock == true abgibt, gefolgt von einer Anfrage mit android.control.aeLock == false https://developer.android.com/reference/ android/hardware/camera2/CaptureRequest.html # CONTROL_AE_PRECAPTURE_TRIGGER – user2128112

+0

ich bekomme 'CONTROL_AE_STATE' immer null. Irgendeine Idee warum? Ich benutze das gleiche Beispiel. Und an mehreren Geräten versucht. – iMDroid

Antwort

0

Ich denke, es ist ein Fehler in der Logik, wo Sie Ihre mstate als Pre-Capture-Zustand gesetzt

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

Würde case STATE_WAITING_PRECAPTURE gar eingegeben werden?

0

Es wird nicht in der Dokumentation erwähnt, aber onCaptureCompleted wird tatsächlich aufgerufen, wenn die Anfrage gesendet wurde, nicht wenn die Vorzeichnung oder Autofokussequenz beendet wurde. Camera2Basic benötigt eine Vorschau, die ständig ausgeführt wird, da die Vorschau als konstanter Monitor für den Zustand der Kamera fungiert. Ohne sie werden Sie nicht wissen, wann die Vorspannsequenz tatsächlich beendet ist.