Изменение настроек вспышки Android Camera 2 во время выполнения

По сути, я пытаюсь изменить CONTROL_AE_MODE, нажав кнопку в приложении. Пользователь может использовать АВТОМАТИЧЕСКУЮ вспышку (ON_AUTO_FLASH), включить, если она включена (ON_ALWAYS_FLASH), или ВЫКЛ (CONTROL_AE_MODE_OFF).

В этом примере: https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java

Строка 818, они устанавливают flash один раз:

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

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

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

                @Override
                public void onCaptureCompleted(@NonNull CameraCaptureSession session,
                                               @NonNull CaptureRequest request,
                                               @NonNull TotalCaptureResult result) {
                    showToast("Saved: " + mFile);
                    Log.d(TAG, mFile.toString());
                    unlockFocus();
                }
            };

            mCaptureSession.stopRepeating();
            mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null);

А затем создает CaptureSession в строке 840.

Есть ли способ изменить CONTROL_AE_MODE после предварительного просмотра?

Я попытался переделать сеанс, который вроде как сработал:

if(flashMode == CameraView.CAMERA_FLASH_ON){
            Log.e("CAMERA 2", "FLASH ON");
            mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
        }else if(flashMode == CameraView.CAMERA_FLASH_OFF){
            Log.e("CAMERA 2", "FLASH OFF");
            mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
        }else if(flashMode == CameraView.CAMERA_FLASH_AUTO){
            Log.e("CAMERA 2", "FLASH AUTO");
            mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
        }
        mFlashMode = flashMode;
        if (mCameraCaptureSession != null) {
            mCameraCaptureSession.close();
            mCameraCaptureSession = null;
       }
  createCameraPreviewSession();

По какой-то причине CONTROL_AE_MODE_OFF сделал бы весь предварительный просмотр черным. Я попытался найти в документах методы для обновления, но ничего не нашел.

Любые учебники или документы очень ценятся.


person dotfury    schedule 25.02.2016    source источник
comment
Вы исправили эту проблему? CONTROL_AE_MODE_OFF у меня тоже становится черным.   -  person emen    schedule 25.08.2016
comment
может у вас есть пример? или просто скажите мне, где именно я должен включить эти строки кода? на stillCapture() или onConfigurate() или unlockFocus() медходе? потому что я не могу найти ничего, что могло бы заставить мой код работать...   -  person Aleksey Timoshchenko    schedule 10.11.2016


Ответы (3)


Я не знаю, почему ваш предварительный просмотр становится черным, но вам не нужно закрывать сеанс захвата вручную. Из документации метода .close():

Использование createCaptureSession(List , CameraCaptureSession.StateCallback, Handler) напрямую без закрытия является рекомендуемым подходом для быстрого переключения на новый сеанс, поскольку неизмененные целевые выходные данные могут быть повторно использованы более эффективно.

Таким образом, вы можете повторно использовать существующий CaptureRequest.Builder, установить измененное значение, создать новый PreviewRequest и просто начать новый сеанс с этим новым запросом, например:

try {
    // Change some capture settings
    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
    // Build new request (we can't just edit existing one, as it is immutable)
    mPreviewRequest = mPreviewRequestBuilder.build();
    // Set new repeating request with our changed one
    mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
    e.printStackTrace();
}

Это будет намного быстрее (почти без видимого зависания предварительного просмотра).

person Robyer    schedule 19.04.2016
comment
может у вас есть пример? или просто скажите мне, где именно я должен включить эти строки кода? на stillCapture() или onConfigurate() или unlockFocus() медходе? потому что я не могу найти ничего, что могло бы заставить мой код работать... - person Aleksey Timoshchenko; 10.11.2016

Как упоминал @cyborg86pl, при переключении режимов вспышки вы не должны переключать CONTROL_AE_MODE . Вместо этого вы можете переключаться между FLASH_MODE. Вот рабочий пример для моего случая:

  when (currentFlashState) {
        FlashState.AUTO -> {
          previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH)
        }
        FlashState.ON -> {
          previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON)
          previewRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH)
        }
        FlashState.OFF -> {
          previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON)
          previewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
        }
      }
 previewRequest = previewRequestBuilder.build()
 captureSession.setRepeatingRequest(previewRequest, captureCallback, backgroundHandler)
person iskae    schedule 15.01.2019

Вам нужно отключить вспышку, а не автоматическую экспозицию (AE), поэтому вы хотите использовать CONTROL_AE_MODE_ON, а не CONTROL_AE_MODE_OFF.

Как указано в документации:

CONTROL_AE_MODE_ON

Процедура автоэкспозиции камеры активна, управление вспышкой отсутствует.

person cyborg86pl    schedule 27.01.2017