Berita Produk

Melampaui Fitur Tunggal: Menjamin Kombinasi Fitur dengan CameraX 1.5

Waktu baca: 6 menit
Tahsin Masrur
Software Engineer

Aplikasi kamera modern ditentukan oleh fitur yang canggih dan tumpang-tindih. Pengguna berharap dapat merekam video dengan HDR yang menakjubkan, mengambil gambar gerakan yang lancar pada 60 FPS, dan mendapatkan rekaman yang sangat halus dengan Stabilisasi Pratinjau—sering kali secara bersamaan.

Sebagai developer, kami tahu bahwa kenyataannya lebih rumit. Bagaimana Anda dapat menjamin bahwa perangkat tertentu benar-benar mendukung kombinasi tertentu? Hingga saat ini, mengaktifkan beberapa fitur sering kali merupakan sebuah perjudian. Anda dapat memeriksa dukungan fitur individual, tetapi menggabungkannya dapat menyebabkan perilaku yang tidak ditentukan atau, lebih buruk lagi, sesi kamera yang gagal. Ketidakpastian ini memaksa developer untuk bersikap konservatif, yang mencegah pengguna di perangkat yang mumpuni mengakses pengalaman terbaik.

Misalnya, sangat sedikit perangkat premium yang mendukung video HDR dan 60 FPS secara bersamaan dengan andal. Oleh karena itu, sebagian besar aplikasi menghindari mengaktifkan keduanya sekaligus untuk mencegah pengalaman pengguna yang buruk di sebagian besar ponsel.

Untuk mengatasi hal ini, kami memperkenalkan Grup Fitur di CameraX - API baru yang dirancang untuk menghilangkan tebakan ini. Kini, Anda dapat membuat kueri apakah kombinasi fitur tertentu didukung sebelum mengonfigurasi kamera, atau cukup beri tahu CameraX prioritas Anda dan biarkan CameraX mengaktifkan kombinasi yang paling didukung untuk Anda.

Untuk Pengguna Baru CameraX

Sebelum membahas Feature Group API baru, mari kita rangkum secara singkat apa itu CameraX. CameraX adalah support library Jetpack, yang dibuat untuk memudahkan Anda mengembangkan aplikasi kamera. CameraX memiliki antarmuka API yang konsisten dan mudah digunakan yang dapat digunakan di sebagian besar perangkat Android, dengan kompatibilitas mundur hingga Android 6.0 (API level 23). Jika Anda baru menggunakan CameraX, sebaiknya lihat dokumentasi resmi dan coba codelab untuk memulai.

Yang Dapat Anda Buat dengan Feature Group API

Anda tidak perlu lagi berjudi pada kombinasi fitur dan dapat dengan yakin memberikan pengalaman kamera terbaik – seperti video HDR dan 60 FPS secara bersamaan di hardware yang mumpuni (misalnya Pixel 10 Pro) – sekaligus menghindari error dengan baik di perangkat yang tidak dapat mendukung kombinasi tersebut.

unnamed.png

Pixel 10 Pro mengaktifkan HDR dan 60 FPS secara bersamaan

unnamed (1).png

Di perangkat lama tempat HDR dan 60 FPS tidak dapat berjalan secara bersamaan, hanya HDR yang diaktifkan, sedangkan opsi 60 FPS dinonaktifkan.

Dengan Feature Group API, Anda dapat:

  • Membuat UI dinamis yang lebih cerdas: Mengaktifkan atau menonaktifkan setelan di UI Anda secara cerdas berdasarkan dukungan hardware real-time. Misalnya, jika pengguna mengaktifkan HDR, Anda dapat langsung mengaktifkan dan menonaktifkan opsi 60 FPS jika kombinasi tersebut tidak didukung di perangkat tersebut. 
unsupported-features-disabled.gif
  • Menyediakan mode "Kualitas Tinggi" yang andal: Mengonfigurasi kamera dengan daftar fitur yang diinginkan yang diprioritaskan. CameraX secara otomatis menemukan dan mengaktifkan kombinasi yang paling didukung untuk perangkat tertentu, sehingga memastikan hasil yang bagus tanpa logika yang kompleks dan khusus untuk perangkat.
  • Mencegah kegagalan sesi kamera: Dengan memverifikasi dukungan sebelumnya, Anda mencegah kamera mencoba mengonfigurasi kombinasi yang tidak didukung, sehingga menghilangkan sumber umum error dan menawarkan pengalaman pengguna yang lancar.

Cara Kerjanya: Komponen Inti

API baru ini berpusat pada penambahan kunci ke SessionConfig dan CameraInfo.

  1. GroupableFeature: API ini memperkenalkan serangkaian fitur yang dapat dikelompokkan yang telah ditentukan, seperti HDR_HLG10FPS_60PREVIEW_STABILIZATION, dan IMAGE_ULTRA_HDR. Karena keterbatasan komputasi, hanya serangkaian fitur tertentu yang dapat dikelompokkan dengan tingkat keandalan tinggi yang disediakan API ini. Kami aktif berupaya memperluas daftar ini dan akan memperkenalkan dukungan untuk lebih banyak fitur dalam rilis mendatang.
  2. Parameter SessionConfig Baru: Class ini, yang digunakan untuk memulai sesi kamera, kini menerima dua parameter baru:
    • requiredFeatureGroup: Gunakan parameter ini untuk fitur yang harus didukung agar konfigurasi berhasil - ideal untuk fitur yang diaktifkan secara eksplisit oleh pengguna, seperti mengalihkan tombol 'HDR'. Untuk memastikan pengalaman yang deterministik dan konsisten, panggilan bindToLifecycle akan menampilkan IllegalArgumentException jika kombinasi yang diminta tidak didukung, bukan mengabaikan permintaan fitur secara diam-diam. CameraInfo#isFeatureGroupSupported API (detail di bawah) harus digunakan untuk membuat kueri hasil ini sebelumnya.
    • preferredFeatureGroup: Gunakan parameter ini untuk fitur yang diinginkan tetapi opsional, misalnya saat Anda ingin menerapkan mode "Kualitas Tinggi" default. Anda memberikan daftar fitur yang diinginkan yang diurutkan sesuai dengan prioritas Anda, dan CameraX secara otomatis mengaktifkan kombinasi prioritas tertinggi yang didukung perangkat.
  3. CameraInfo#isFeatureGroupSupported(): Ini adalah metode kueri inti untuk memeriksa secara eksplisit apakah grup fitur didukung, yang sangat cocok untuk hanya memberikan opsi fitur yang didukung kepada pengguna di UI aplikasi Anda. Anda meneruskan SessionConfig, dan metode ini menampilkan boolean yang menunjukkan apakah kombinasi tersebut didukung. Jika Anda ingin mengikat SessionConfig dengan fitur yang diperlukan, Anda harus menggunakan API ini terlebih dahulu untuk memastikan bahwa API tersebut didukung. 

Implementasi dalam Praktik

Mari kita lihat cara menggunakan komponen ini untuk membangun pengalaman kamera yang lebih baik.

Skenario 1: Mode Kualitas Tinggi "Upaya Terbaik"

Jika ingin mengaktifkan fitur terbaik secara default, Anda dapat memberikan daftar yang diprioritaskan ke preferredFeatureGroup. Dalam contoh ini, kita memberi tahu CameraX untuk memprioritaskan HDR, lalu 60 FPS, dan terakhir Stabilisasi Pratinjau. CameraX menangani kompleksitas pemeriksaan semua kemungkinan kombinasi dan memilih kombinasi terbaik yang didukung perangkat.

Misalnya, jika perangkat dapat menangani HDR dan 60 FPS bersama-sama, tetapi tidak dengan Stabilisasi Pratinjau, CameraX akan mengaktifkan dua yang pertama dan menghapus yang ketiga. Dengan cara ini, Anda mendapatkan pengalaman terbaik tanpa menulis pemeriksaan yang kompleks dan khusus untuk perangkat.

cameraProvider.bindToLifecycle(

    lifecycleOwner,

    cameraSelector,

    SessionConfig(

        useCases = listOf(preview, videoCapture),

        // The order of features in this list determines their priority. 

        // CameraX will enable the best-supported combination based on these

        // priorities: HDR_HLG10 > FPS_60 > Preview Stabilization.  

        preferredFeatureGroup =

           listOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION),

    ).apply {

        // (Optional) Get a callback with the enabled features

        // to update your UI. 

        setFeatureSelectionListener { selectedFeatures ->

            updateUiIndicators(selectedFeatures)

        }

    }

)

Untuk cuplikan kode ini, CameraX akan mencoba mengaktifkan kombinasi fitur dalam urutan prioritas berikut, dengan memilih yang pertama yang didukung sepenuhnya oleh perangkat:

  1. HDR + 60 FPS + Stabilisasi Pratinjau
  2. HDR + 60 FPS
  3. HDR + Stabilisasi Pratinjau
  4. HDR
  5. 60 FPS + Stabilisasi Pratinjau
  6. 60 FPS
  7. Stabilisasi Pratinjau
  8. Tidak ada fitur di atas

Skenario 2: Membangun UI Reaktif

Untuk membuat UI yang merespons pilihan pengguna dan mencegah pengguna memilih kombinasi fitur yang tidak didukung, Anda dapat membuat kueri untuk dukungan secara langsung. Fungsi di bawah ini memeriksa fitur mana yang tidak kompatibel dengan pilihan saat ini pengguna, sehingga Anda dapat menonaktifkan elemen UI yang sesuai.

/**

 * Returns a list of features that are NOT supported in combination

 * with the currently selected features.

 */

fun getUnsupportedFeatures(

    currentFeatures: Set<GroupableFeature>

): Set<GroupableFeature> {

    val unsupportedFeatures = mutableSetOf<GroupableFeature>()

    val appFeatureOptions = setOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION)


    // Iterate over every available feature option in your app. 

    appFeatureOptions.forEach { featureOption ->

        // Skip features the user has already selected. 

        if (currentFeatures.contains(featureOption)) return@forEach


        // Check if adding this new feature is supported. 

        val isSupported = cameraInfo.isFeatureGroupSupported(

            SessionConfig(

                useCases = useCases,

                // Check the new feature on top of existing ones.

                requiredFeatureGroup = currentFeatures + featureOption

            )

        )


        if (!isSupported) {

            unsupportedFeatures.add(featureOption)

        }

    }


    return unsupportedFeatures

}

Kemudian, Anda dapat menghubungkan logika ini ke ViewModel atau pengontrol UI untuk bereaksi terhadap input pengguna dan mengikat ulang kamera dengan konfigurasi yang dijamin berfungsi.

// Invoked when user turns some feature on/off.

fun onFeatureChange(currentFeatures: Set<GroupableFeature>) {

    // Identify features that are unsupported with the current selection.

    val unsupportedFeatures = getUnsupportedFeatures(currentFeatures)



    // Update app UI so that users can't enable them.

    updateDisabledFeatures(unsupportedFeatures)



    // Since the UI now only allows selecting supported feature combinations, 

    // `currentFeatures` is always valid. This allows setting

    // `requiredFeatureGroup` directly, without needing to re-check for

    // support or set a feature selection listener.  

    cameraProvider.bindToLifecycle(

        lifecycleOwner,

        cameraSelector,

        SessionConfig(

            useCases = listOf(preview, videoCapture),

            requiredFeatureGroup = currentFeatures,

        )

    )

}

Untuk melihat konsep ini dalam aplikasi yang berfungsi, Anda dapat menjelajahi aplikasi pengujian internal kami. Aplikasi ini menyediakan implementasi lengkap dari skenario "upaya terbaik" dan "UI reaktif" yang dibahas di atas.

Perhatikan: Ini adalah aplikasi pengujian dan bukan contoh yang didukung secara resmi. Meskipun merupakan referensi yang bagus untuk Feature Group API, aplikasi ini belum dioptimalkan untuk penggunaan produksi.

Mulai Sekarang Juga

Feature Group API menghilangkan ambiguitas dalam menggunakan kemampuan kamera lanjutan. Dengan menyediakan cara deterministik untuk membuat kueri dukungan fitur, Anda dapat membangun aplikasi kamera yang lebih canggih dan andal dengan percaya diri.

API ini tersedia sebagai eksperimental di CameraX 1.5 dan dijadwalkan akan menjadi sepenuhnya stabil dalam rilis 1.6, dengan lebih banyak dukungan dan peningkatan yang akan datang.

Untuk mempelajari lebih lanjut, lihat dokumentasi resmi. Kami tidak sabar ingin melihat karya Anda, dan kami menantikan masukan Anda. Sampaikan pendapat Anda dan laporkan masalah melalui saluran berikut:

Ditulis oleh:

Lanjutkan membaca