2015-10-06 2 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' всегда null. Любая идея почему? Я использую тот же образец. И попробовал на нескольких устройствах. – 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 постоянно работает в режиме предварительного просмотра, потому что предварительный просмотр действует как постоянный монитор для состояния камеры. Без этого вы не узнаете, когда завершающая последовательность действительно заканчивается.

Смежные вопросы