Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

ベンダー拡張機能

CameraX には、スマートフォン メーカーが特定のスマートフォン用に実装した効果(ピンぼけ、HDR など)を使用するための API が用意されています。デバイスでベンダー拡張機能をサポートするには、次の条件をすべて満たしている必要があります。

  • デバイスの OEM から、この効果に対するライブラリ サポートが提供されている。
  • OEM ライブラリが現在のデバイスにインストールされている。
  • OEM ライブラリから、デバイスが拡張機能をサポートしていると報告される。
  • デバイスに、ライブラリに必要なバージョンのオペレーティング システムがインストールされている。

拡張機能を選択的に有効にできます。拡張機能がデバイスでサポートされており、かつ物理的に利用できる場合は有効になります。該当しない場合は、グレースフル デグラデーションが行われます。

ベンダーはすべての効果および機能の実装を提供する必要はありません。ベンダー提供の実装がない機能の場合、デフォルトで CameraX の実装が適用されます。デフォルトの実装では機能を利用できないことが報告され、その有効化がスキップされます。

拡張機能のアーキテクチャ

次の図は、CameraX を使用した拡張機能のアーキテクチャを示しています。

図 1. 拡張機能の CameraX アーキテクチャ

拡張機能は CameraX の Camera2 コアとは別のものです。図の赤い矢印は、ユーザーが拡張機能ベースの機能(HDR 画像キャプチャなど)をトリガーしたときのメインとなるデータフローを示しています。

画像キャプチャの効果を有効にする

ベンダー拡張機能を CameraX のユースケースに適用するには、Extender オブジェクトを作成します。これにより、その効果または機能の設定で Builder を構成できます。拡張機能を利用できない場合は enableExtension() を呼び出しても何も実行されないため、拡張機能が利用可能かどうかを照会してください。

画像キャプチャ ユースケースの拡張機能を実装するには、次のコードサンプルに示すように、対応する画像キャプチャ エクステンダーを実装します。

Kotlin

    import androidx.camera.extensions.BokehExtender

    fun onCreate() {
        // Create a Builder same as in normal workflow.
        val builder = ImageCapture.Builder()

        // Create a camera provider
        val cameraProvider : ProcessCameraProvider = ... // Get the provider instance

        // Create an Extender object which can be used to apply extension
        // configurations.
        val bokehImageCapture = BokehImageCaptureExtender.create(builder)

        // Select the camera
        val cameraSelector = CameraSelector.Builder()
                                           .requireLensFacing(CameraX.LensFacing.BACK)
                                           .build()

        // Query if extension is available (optional).
        if (bokehImageCapture.isExtensionAvailable()) {
            // Enable the extension if available.
            bokehImageCapture.enableExtension()
        }

        // Finish constructing configuration with the same flow as when not using
        // extensions.
        val useCase = ImageCapture.Builder().build()
        cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCase)
    }
    

Java

    import androidx.camera.extensions.BokehExtender;

    void onCreate() {
        // Create a Builder same as in normal workflow.
        ImageCapture.Builder builder = new ImageCapture.Builder();

        // Create a camera provider
        ProcessCameraProvider cameraProvider = ...; // Get the provider instance

        // Create an Extender object which can be used to apply extension
        // configurations.
        BokehImageCaptureExtender bokehImageCapture = new
                BokehImageCaptureExtender(builder);

        // Select the camera
        CameraSelector cameraSelector = new CameraSelector.Builder().
                                                          .requireLensFacing(CameraX.LensFacing.BACK)
                                                          .build();

        // Query if extension is available (optional).
        if (bokehImageCapture.isExtensionAvailable()) {
            // Enable the extension if available.
            bokehImageCapture.enableExtension();
        }

        // Finish constructing configuration with the same flow as when not using
        // extensions.
        ImageCapture useCase = new ImageCapture.Builder.build();
        cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCase);
    }

    

効果を無効にする

ベンダー拡張機能を無効にするには、ImageCapture ユースケースまたは Preview ユースケースの新しいインスタンスを作成します。

参考情報

CameraX について詳しくは、以下の参考情報をご確認ください。

Codelab

  • CameraX のスタートガイド
  • コードサンプル

  • CameraX の公式サンプルアプリ