Extensions API

CameraX는 다음과 같은 특수 효과에 액세스할 수 있는 Extensions API를 제공합니다.

  • 자동: 주변 풍경에 따라 자동으로 최종 이미지를 조정합니다.
  • 빛망울 효과: 인물 사진 모드로 사진을 찍을 때 앞에 있는 사람을 더 선명하게 촬영합니다.
  • 얼굴 보정: 정지 이미지 촬영 시 피부색 및 기타 얼굴 효과를 보정합니다.
  • HDR(High Dynamic Range): 다양한 AE 설정으로 사진을 촬영합니다.
  • 야간: 조명이 어두운 곳(주로 야간)에서 멋진 정지 이미지를 촬영합니다.

이 기능은 Android 기기(스마트폰, 태블릿 등)에 구현되어 있습니다. 기기가 이러한 공급업체 확장 프로그램을 지원하려면 다음 요구사항을 충족해야 합니다.

  • 효과가 기기 ROM에서 라이브러리를 지원합니다.
  • ROM 라이브러리가 현재 기기에 설치되어 있습니다.
  • 기기에는 라이브러리에 필요한 운영체제 버전이 있습니다.

확장 프로그램을 우선적으로 사용 설정할 수 있습니다. 확장 프로그램이 기기에 의해 지원되고 물리적으로 기기에 있다면 확장 프로그램이 사용 설정됩니다. 그런 경우가 아니라면 단계적으로 성능이 저하됩니다.

공급업체에서는 모든 효과와 기능에 관한 구현을 제공할 필요가 없습니다. 공급업체에서 제공하는 구현이 없는 모든 기능은 CameraX 구현으로 기본 설정됩니다. 기본 구현에서는 기능을 사용할 수 없다고 보고하고 사용 설정을 건너뜁니다.

확장 프로그램 아키텍처

다음 이미지는 CameraX와 함께 확장 프로그램의 아키텍처를 보여줍니다.

그림 1. CameraX 확장 프로그램 아키텍처

확장 프로그램은 CameraX의 Camera2 코어와 별개입니다. 다이어그램에서 빨간색 화살표는 사용자가 HDR 이미지 캡처와 같은 확장 프로그램 기반 기능을 트리거할 때 기본 데이터 흐름을 나타냅니다.

이미지 캡처 및 미리보기 효과 사용

확장 프로그램 API를 사용하기 전에 ExtensionsManager#getInstance(Context) 메서드를 사용하여 ExtensionsManager 인스턴스를 검색하세요. 그러면 확장 프로그램 가용성 정보를 쿼리할 수 있습니다. 그런 다음 확장 프로그램 지원 CameraSelector를 검색합니다. 확장 프로그램 모드는 CameraSelector 확장 프로그램이 사용 설정된 상태로 bindToLifecycle() 메서드를 호출할 때 이미지 캡처 및 미리보기 사용 사례에 적용됩니다.

이미지 캡처 및 미리보기 사용 사례의 확장 프로그램을 구현하려면 다음 코드 샘플을 참고하세요.

Kotlin

import androidx.camera.extensions.ExtensionMode
import androidx.camera.extensions.ExtensionsManager

fun onCreate() {
    // Create a camera provider
    val cameraProvider : ProcessCameraProvider = ... // Get the provider instance

    lifecycleScope.launch {
        // Create an extensions manager
        val extensionsManager = ExtensionsManager.getInstance(lifecycleOwner).await()

        // Select the camera
        val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

        // Query if extension is available.
        if (extensionsManager.isExtensionAvailable(
                cameraProvider,
                cameraSelector,
                ExtensionMode.BOKEH
            )
        ) {
            // Unbind all use cases before enabling different extension modes.
            cameraProvider.unbindAll()

            // Retrieve extension enabled camera selector
            val bokehCameraSelector = extensionsManager.getExtensionEnabledCameraSelector(
                cameraProvider,
                cameraSelector,
                ExtensionMode.BOKEH
            )

            // Bind image capture and preview use cases with the extension enabled camera selector.
            val imageCapture = ImageCapture.Builder().build()
            val preview = Preview.Builder().build()
            cameraProvider.bindToLifecycle(
                lifecycleOwner,
                bokehCameraSelector,
                imageCapture,
                preview
            )
        }
    }
}

자바

import androidx.camera.extensions.ExtensionMode;
import androidx.camera.extensions.ExtensionsManager;

void onCreate() {
    // Create a camera provider
    ProcessCameraProvider cameraProvider = ... // Get the provider instance

    // Call the getInstance function to retrieve a ListenableFuture object
    ListenableFuture future = ExtensionsManager.getInstance(lifecycleOwner);

    // Obtain the ExtensionsManager instance from the returned ListenableFuture object
    future.addListener(() -> {
        try {
            ExtensionsManager extensionsManager = future.get();

            // Select the camera
            CameraSelector cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;

            // Query if extension is available.
            if (extensionsManager
                .isExtensionAvailable(cameraProvider, cameraSelector, ExtensionMode.BOKEH)) {
                // Unbind all use cases before enabling different extension modes.
                cameraProvider.unbindAll();

                // Retrieve extension enabled camera selector
                CameraSelector bokehCameraSelector = extensionsManager
                    .getExtensionEnabledCameraSelector(cameraProvider, cameraSelector, ExtensionMode.BOKEH);

                // Bind image capture and preview use cases with the extension enabled camera selector.
                ImageCapture imageCapture = new ImageCapture.Builder().build();
                Preview preview = new Preview.Builder().build();
                cameraProvider.bindToLifecycle(lifecycleOwner, bokehCameraSelector, imageCapture, preview);
            }
        } catch (ExecutionException | InterruptedException e) {
            // This should not happen unless the future is cancelled or the thread is interrupted by
            // applications.
        }
    }, ContextCompact.getMainExecutor(context));
}

효과 사용 중지

공급업체 확장 프로그램을 사용 중지하려면 모든 사용 사례를 바인딩 해제하고 이미지 캡처 및 미리보기 사용 사례를 일반 카메라 선택기로 다시 바인딩합니다. 예를 들어 CameraSelector.DEFAULT_BACK_CAMERA를 사용하여 후면 카메라에 다시 바인딩합니다.

종속 항목

CameraX Extensions API는 camera-extensions 라이브러리에 구현됩니다. 확장 프로그램은 CameraX 핵심 모듈(core, camera2, lifecycle)에 따라 다릅니다.

Groovy

dependencies {
  def camerax_version = "1.1.0-alpha08"
  implementation "androidx.camera:camera-core:${camerax_version}"
  implementation "androidx.camera:camera-camera2:${camerax_version}"
  implementation "androidx.camera:camera-lifecycle:${camerax_version}"
  //the CameraX Extensions library
  implementation "androidx.camera:camera-extensions:1.0.0-alpha28"
    ...
}

Kotlin

dependencies {
  val camerax_version = "1.1.0-alpha08"
  implementation("androidx.camera:camera-core:${camerax_version}")
  implementation("androidx.camera:camera-camera2:${camerax_version}")
  implementation("androidx.camera:camera-lifecycle:${camerax_version}")
  // the CameraX Extensions library
  implementation("androidx.camera:camera-extensions:1.0.0-alpha28")
    ...
}

기존 API 삭제

1.0.0-alpha26에 새 Extensions API가 출시되었으므로 2019년 8월에 출시된 기존 Extensions API는 이제 지원 중단됩니다. 1.0.0-alpha28 버전부터 기존 Extensions API가 라이브러리에서 삭제되었습니다. 새로운 Extensions API를 사용하는 애플리케이션은 이제 사용 설정된 확장 프로그램으로 CameraSelector를 획득하고 이를 사용하여 사용 사례를 결합해야 합니다.

기존 Extensions API를 사용하는 애플리케이션은 향후 출시될 CameraX와 호환성을 보장하기 위해 새로운 Extensions API로 이전해야 합니다.

추가 리소스

CameraX에 관해 자세히 알아보려면 다음 추가 리소스를 참고하세요.

Codelab

  • CameraX 시작하기
  • 코드 샘플

  • 공식 CameraX 샘플 앱