Ekstensi vendor

CameraX menyediakan API untuk mengakses efek khusus berikut:

  • Otomatis: otomatis menyesuaikan gambar akhir berdasarkan pemandangan di sekitarnya.
  • Bokeh: membuat gambar latar depan lebih tajam saat foto diambil dalam mode potret.
  • Retouch Wajah: warna kulit dan efek wajah lainnya saat mengambil gambar diam.
  • HDR (Rentang Dinamis Tinggi): mengambil foto dengan setelan AE yang berbeda.
  • Mode Malam: mengambil gambar diam yang bagus dalam kondisi minim cahaya, biasanya di malam hari.

yang telah diterapkan di perangkat Android yang digunakan (Ponsel, Tablet, atau lainnya) Untuk mendukung ekstensi vendor tersebut, perangkat harus memenuhi persyaratan berikut:

  • Efek memiliki dukungan library dari ROM perangkat.
  • Library ROM diinstal di perangkat saat ini.
  • Perangkat memiliki versi sistem operasi yang diperlukan oleh library.

Anda dapat mengaktifkan ekstensi secara preferensial: jika ekstensi didukung oleh dan secara fisik ada di perangkat, ekstensi akan diaktifkan; jika tidak, ekstensi akan didegradasi halus.

Vendor tidak diharuskan menyediakan implementasi untuk setiap efek dan fitur. Kapabilitas yang tidak disertai implementasi vendor akan ditetapkan secara default ke implementasi CameraX. Implementasi default ini melaporkan bahwa kapabilitas tidak tersedia, sehingga langkah untuk mengaktifkannya dapat dilewati.

Arsitektur ekstensi

Gambar berikut menampilkan arsitektur untuk ekstensi dengan CameraX.

Gambar 1. Arsitektur CameraX untuk ekstensi

Ekstensi terpisah dari inti Camera2 CameraX. Dalam diagram, panah berwarna merah menunjukkan alur data utama saat pengguna memicu fitur berbasis ekstensi, seperti pengambilan gambar HDR.

Mengaktifkan efek untuk pratinjau dan pengambilan gambar

Sebelum menggunakan API ekstensi, ambil instance ExtensionsManager menggunakan metode ExtensionsManager#getInstance(Context). Ini akan memungkinkan Anda mengkueri informasi ketersediaan ekstensi. Lalu, ambil CameraSelector yang mengaktifkan ekstensi. Mode ekstensi akan diterapkan pada kasus penggunaan pratinjau dan pengambilan gambar saat memanggil metode bindToLifecycle() dengan ekstensi CameraSelector yang diaktifkan.

Untuk mengimplementasikan ekstensi pada kasus penggunaan pratinjau dan pengambilan gambar, lihat contoh kode berikut:

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
            )
        }
    }
}

Java

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));
}

Menonaktifkan efek

Untuk menonaktifkan ekstensi vendor, putuskan ikatan semua kasus penggunaan dan ikat ulang kasus penggunaan pratinjau dan pengambilan gambar dengan pemilih kamera normal. Misalnya, ikat ulang ke kamera belakang menggunakan CameraSelector.DEFAULT_BACK_CAMERA.

Dependensi

API Ekstensi CameraX diterapkan di library camera-extensions. Ekstensi bergantung pada modul inti 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")
    ...
}

Penghapusan API lama

Dengan API Ekstensi baru yang dirilis pada 1.0.0-alpha26, API Ekstensi lama yang dirilis pada bulan Agustus 2019 kini tidak digunakan lagi. Dimulai dari versi 1.0.0-alpha28, API Ekstensi lama telah dihapus dari library. Aplikasi yang menggunakan API Ekstensi baru kini harus mendapatkan CameraSelector yang mendukung ekstensi dan menggunakannya untuk mengikat kasus penggunaan.

Aplikasi yang menggunakan API Ekstensi lama harus dimigrasikan ke API Ekstensi baru untuk memastikan kompatibilitas dengan rilis CameraX mendatang.

Referensi lainnya

Untuk mempelajari CameraX lebih lanjut, lihat referensi tambahan berikut.

Codelab

  • Mulai Menggunakan CameraX
  • Contoh kode

  • Contoh aplikasi CameraX resmi