2016-05-10 4 views
2

Моя проблема в том, что я переключаюсь между различными флэшмодами, а затем хочу захватить изображение, мой captureBuilder не будет устанавливать выбранный flash-режим. Он работает только тогда, когда я закрываю и снова открываю камеру.Переключить flash в Camera2 API

Я взял https://github.com/googlesamples/android-Camera2Basic в качестве отправной точки.

мой метод:

private void captureStillPicture() { 
    try { 
    final Activity activity = (Activity) context; 
    if (null == activity || null == mCameraDevice) { 
     return; 
    } 
    // This is the CaptureRequest.Builder that we use to take a picture. 
    CaptureRequest.Builder captureBuilder = 
      mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
    captureBuilder.addTarget(mImageReader.getSurface()); 

    // Use the same AE and AF modes as the preview. 
    captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
      CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 
    setCurrentFlash(captureBuilder); 

    // Orientation 
    int rotation = activity.getWindowManager() 
      .getDefaultDisplay() 
      .getRotation(); 
    captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation)); 

    CameraCaptureSession.CaptureCallback captureCallback = 
      new CameraCaptureSession.CaptureCallback() { 

       @Override 
       public void onCaptureCompleted(@NonNull CameraCaptureSession session, 
        @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { 
       super.onCaptureCompleted(session, request, result); 
       Toast.makeText(context, "image captured", Toast.LENGTH_SHORT) 
         .show(); 
       unlockFocus(); 
       } 
      }; 

       mCaptureSession.stopRepeating(); 
    mCaptureSession.capture(captureBuilder.build(), captureCallback, null); 
    } catch (CameraAccessException e) { 
    Log.e(this.getClass() 
      .getSimpleName(), e.getMessage(), e); 
    } 

Это метод setCurrentFlash:

private void setCurrentFlash(CaptureRequest.Builder requestBuilder) { 
    if (mFlashSupported) { 
    switch (flashMode.name()) { 
     case FLASH_AUTO: 
      requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
       CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 
      break; 
     case FLASH_ON: 
      requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
       CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH); 
      break; 
     case FLASH_OFF: 
      requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); 
      break; 
     default: 
      requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
       CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 
      break; 
    } 
    } 

Любые идеи, почему строитель не установить вспышку правильно перед съемкой?

***** EDIT *****

решаемая проблема, установив вспышку previewRequestBuilder при вызове runPrecaptureSequence(), как Eddy Talvala предложил

private void runPrecaptureSequence() { 
    try { 
    // This is how to tell the camera to trigger. 
    setCurrentFlash(previewRequestBuilder); 
    previewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, 
      CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START); 
    // Tell #mCaptureCallback to wait for the precapture sequence to be set. 
    state = STATE_WAITING_PRECAPTURE; 
    captureSession.capture(previewRequestBuilder.build(), mCaptureCallback, backgroundHandler); 
    } catch (CameraAccessException e) { 
    e.printStackTrace(); 
    } 

ответ

4

Вы хотите обновить флэш-режим в запросе предварительного просмотра; обычно устройство камеры хочет узнать ваш желаемый режим вспышки, когда вы запускаете последовательность предварительного захвата (с помощью AE_PRECAPTURE_TRIGGER), чтобы он знал, должен ли он включить флэш-память предварительного захвата, что необходимо для определения конечной мощности вспышки.

Обычная последовательность событий:

  1. Установить предварительный режим вспышки в нужный режим
  2. Подождите пользователь нажал кнопку спуска затвора
  3. Выпуск один запрос предварительного просмотра с шнеллером Предварительная съемка (но держать предварительный просмотр запрос на повтор в противном случае).
  4. Подождите AE_STATE_PRECAPTURE перестать быть состоянием AE в вашем захвате результаты
  5. Issue запрос окончательного захвата (сохранить тот же режим вспышки)
  6. Получить окончательное JPEG в вашем ImageReader

(Это игнорирует обеспечение фокус хороший, что обычно делается до/параллельно с началом последовательности предварительного захвата)

+0

Я пробовал это решение, но все еще испытываю проблему. В чем разница между FLASH_MODE_ON и CONTROL_AE_MODE_ON_ALWAYS_FLASH. Когда я использую первый, он отлично работает на всех устройствах, за исключением некоторых устройств Samsung. Последний не применяется, пока я не перезапущу камеру? Я устанавливаю вспышку в правильных местах, как упоминалось. –

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