Ürün Haberleri

Tek Özelliklerin Ötesinde: CameraX 1.5 ile Özellik Kombinasyonlarını Garanti Etme

Okuma süresi 6 dakika
Tahsin Masrur
Yazılım Mühendisi

Modern kamera uygulamaları, güçlü ve çakışan özellikleriyle tanımlanır. Kullanıcılar, genellikle aynı anda olmak üzere, çarpıcı HDR ile video kaydetmeyi, 60 FPS'de akıcı hareketler yakalamayı ve önizleme sabitleme ile son derece akıcı görüntüler elde etmeyi bekler.

Geliştiriciler olarak, gerçekliğin daha karmaşık olduğunu biliyoruz. Belirli bir cihazın belirli bir kombinasyonu gerçekten desteklediğini nasıl garanti edebilirsiniz? Şimdiye kadar birden fazla özelliği etkinleştirmek genellikle riskliydi. Tek tek özelliklerin desteklenip desteklenmediğini kontrol edebilirsiniz ancak bunları birleştirmek tanımlanmamış davranışlara veya daha da kötüsü başarısız bir kamera oturumuna yol açabilir. Bu belirsizlik, geliştiricileri muhafazakar olmaya zorlar ve bu da uygun cihazlardaki kullanıcıların mümkün olan en iyi deneyime erişmesini engeller.

Örneğin, çok az sayıda premium cihaz HDR ve 60 FPS video özelliğini aynı anda güvenilir bir şekilde destekler. Bu nedenle, çoğu uygulama telefonların çoğunda kötü bir kullanıcı deneyimi yaşanmasını önlemek için ikisini aynı anda etkinleştirmekten kaçınır.

Bu sorunu çözmek için CameraX'te Özellik Grubu'nu kullanıma sunuyoruz. Bu yeni API, tahminde bulunma ihtiyacını ortadan kaldırmak için tasarlanmıştır. Artık kamerayı yapılandırmadan önce belirli bir özellik kombinasyonunun desteklenip desteklenmediğini sorgulayabilir veya CameraX'e önceliklerinizi söyleyerek en iyi desteklenen kombinasyonu sizin için etkinleştirmesini sağlayabilirsiniz.

CameraX'i Yeni Kullanmaya Başlayanlar İçin

Yeni Feature Group API'ye geçmeden önce CameraX'in ne olduğunu kısaca hatırlayalım. CameraX, kamera uygulaması geliştirmeyi kolaylaştırmak için oluşturulmuş bir Jetpack destek kitaplığıdır. Android 6.0 (API düzeyi 23) ile geriye dönük uyumluluk sunan bu kitaplık, çoğu Android cihazda çalışan tutarlı ve kullanımı kolay bir API yüzeyi sağlar. CameraX'i yeni kullanmaya başladıysanız başlamak için resmi dokümanları incelemenizi ve codelab'i denemenizi öneririz.

Özellik Grubu API'si ile Neler Geliştirebilirsiniz?

Artık özellik kombinasyonları konusunda risk almanıza gerek kalmaz.Bu sayede, kombinasyonu desteklemeyen cihazlarda hatalardan kaçınarak uygun donanımlarda (ör. Pixel 10 Pro) eşzamanlı HDR ve 60 FPS video gibi mümkün olan en iyi kamera deneyimlerini sunabilirsiniz.

unnamed.png

Pixel 10 Pro'da hem HDR hem de 60 FPS'nin aynı anda etkinleştirilmesi

unnamed (1).png

HDR ve 60 FPS'nin aynı anda çalıştırılamadığı eski bir cihazda 60 FPS seçeneği devre dışı bırakılırken yalnızca HDR etkinleştirilir.

Özellik Grubu API'si ile şunları yapabilirsiniz:

  • Daha akıllı ve dinamik kullanıcı arayüzleri oluşturun: Kullanıcı arayüzünüzdeki ayarları anlık donanım desteğine göre akıllıca etkinleştirin veya devre dışı bırakın. Örneğin, bir kullanıcı HDR'yi etkinleştirirse bu kombinasyon cihazda desteklenmiyorsa 60 FPS seçeneğini anında devre dışı bırakabilirsiniz. 
unsupported-features-disabled.gif
  • Güvenilir bir "Yüksek Kalite" modu sunma: Kamerayı, istenen özelliklerin önceliklendirilmiş bir listesiyle yapılandırın. CameraX, belirli bir cihaz için en iyi desteklenen kombinasyonu otomatik olarak bulup etkinleştirerek karmaşık ve cihaza özel mantık olmadan mükemmel sonuçlar elde etmenizi sağlar.
  • Kamera oturumu hatalarını önleme: Desteği önceden doğrulayarak kameranın desteklenmeyen bir kombinasyonu yapılandırmaya çalışmasını önler, böylece yaygın bir kilitlenme kaynağını ortadan kaldırır ve sorunsuz bir kullanıcı deneyimi sunarsınız.

İşleyiş şekli: Temel bileşenler

Yeni API, SessionConfig ve CameraInfo'ya yapılan önemli eklemeler üzerine kuruludur.

  1. GroupableFeature: Bu API, HDR_HLG10, FPS_60, PREVIEW_STABILIZATION ve IMAGE_ULTRA_HDR gibi önceden tanımlanmış bir grup özellik sunar. Hesaplama sınırlamaları nedeniyle, yalnızca belirli bir özellik grubu bu API'nin sağladığı yüksek güvenilirlik derecesiyle gruplandırılabilir. Bu listeyi genişletmek için aktif olarak çalışıyoruz ve gelecekteki sürümlerde daha fazla özellik için destek sunacağız.
     
  2. Yeni SessionConfig Parametreleri: Kamera oturumu başlatmak için kullanılan bu sınıf artık iki yeni parametre kabul ediyor:
    • requiredFeatureGroup: Yapılandırmanın başarılı olması için desteklenmesi gereken özelliklerde kullanılır. Kullanıcının açıkça etkinleştirdiği özellikler (ör. "HDR" anahtarını açma/kapatma) için idealdir. Belirli ve tutarlı bir deneyim sağlamak için bindToLifecycle çağrısı, istenen kombinasyon desteklenmiyorsa özellik isteğini sessizce yoksaymak yerine IllegalArgumentException hatası verir. Bu sonucu önceden sorgulamak için CameraInfo#isFeatureGroupSupported API'si (ayrıntılar aşağıda) kullanılmalıdır.
    • preferredFeatureGroup: İstenen ancak isteğe bağlı özellikler için kullanın. Örneğin, varsayılan "Yüksek Kalite" modu uygulamak istediğinizde bu özelliği kullanabilirsiniz. İstediğiniz özelliklerin önceliklerinize göre sıralanmış bir listesini sağlarsınız ve CameraX, cihazın desteklediği en yüksek öncelikli kombinasyonu otomatik olarak etkinleştirir.
  3. CameraInfo#isFeatureGroupSupported(): Bu, bir özellik grubunun desteklenip desteklenmediğini açıkça kontrol etmek için kullanılan temel sorgu yöntemidir. Uygulamanızın kullanıcı arayüzünde kullanıcılara yalnızca desteklenen özellik seçeneklerini sunmak için uygundur. Bu işleme bir SessionConfig iletirsiniz ve kombinasyonun desteklenip desteklenmediğini belirten bir boole değeri döndürülür. Gerekli özelliklere sahip bir SessionConfig bağlamayı planlıyorsanız desteklendiğinden emin olmak için önce bu API'yi kullanmanız gerekir. 

Pratikte Uygulama

Daha iyi bir kamera deneyimi oluşturmak için bu bileşenleri nasıl kullanacağımıza bakalım.

1. senaryo: "En İyi Çaba" Yüksek Kalite Modu

Varsayılan olarak mümkün olan en iyi özellikleri etkinleştirmek istiyorsanız preferredFeatureGroup için önceliklendirilmiş bir liste sağlayabilirsiniz. Bu örnekte, CameraX'e önce HDR'ye, ardından 60 FPS'ye ve son olarak da önizleme sabitlemeye öncelik vermesini söylüyoruz. CameraX, olası tüm kombinasyonları kontrol etme ve cihazın desteklediği en iyi kombinasyonu seçme karmaşıklığını yönetir.

Örneğin, bir cihaz HDR ve 60 FPS'yi birlikte işleyebiliyor ancak önizleme sabitleme ile işleyemiyorsa CameraX, ilk ikisini etkinleştirir ve üçüncüsünü kullanmaz. Bu sayede, karmaşık ve cihaza özel kontroller yazmadan mümkün olan en iyi deneyimi elde edebilirsiniz.

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)

        }

    }

)

Bu kod snippet'i için CameraX, aşağıdaki öncelik sırasına göre özellik kombinasyonlarını etkinleştirmeye çalışır ve cihazın tam olarak desteklediği ilk kombinasyonu seçer:

  1. HDR + 60 FPS + Önizleme Sabitleme
  2. HDR + 60 FPS
  3. HDR + Önizleme Sabitleme
  4. HDR
  5. 60 FPS + Önizleme Sabitleme
  6. 60 FPS
  7. Sabitlemeyi önizleme
  8. Yukarıdaki özelliklerin hiçbiri

Senaryo 2: Reaktif kullanıcı arayüzü oluşturma

Kullanıcı seçimlerine yanıt veren ve kullanıcıların desteklenmeyen özellik kombinasyonlarını seçmesini engelleyen bir kullanıcı arayüzü oluşturmak için doğrudan destek sorgusu gönderebilirsiniz. Aşağıdaki işlev, kullanıcının mevcut seçimleriyle hangi özelliklerin uyumsuz olduğunu kontrol ederek ilgili kullanıcı arayüzü öğelerini devre dışı bırakmanıza olanak tanır.

/**

 * 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

}

Ardından, kullanıcı girişine yanıt vermek ve kamerayı kesin olarak çalışacak bir yapılandırmayla yeniden bağlamak için bu mantığı ViewModel'inize veya kullanıcı arayüzü denetleyicinize bağlayabilirsiniz.

// 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,

        )

    )

}

Bu kavramları çalışan bir uygulamada görmek için dahili test uygulamamızı inceleyebilirsiniz. Bu uygulama, yukarıda bahsedilen hem "en iyi çaba" hem de "reaktif kullanıcı arayüzü" senaryolarının eksiksiz bir uygulamasını sunar.

Lütfen unutmayın: Bu, resmi olarak desteklenen bir örnek değil, test uygulamasıdır. Özellik Grubu API'si için harika bir referans olsa da üretimde kullanılmak üzere iyileştirilmemiştir.

Başlangıç Adımları

Feature Group API, gelişmiş kamera özellikleriyle çalışırken yaşanan belirsizliği ortadan kaldırır. Özellik desteği için sorgu oluşturmanın kesin bir yolunu sunarak daha güçlü ve güvenilir kamera uygulamalarını güvenle oluşturabilirsiniz.

API, CameraX 1.5'te deneysel olarak kullanılabilir. 1.6 sürümünde ise tam olarak kararlı hale gelmesi planlanmaktadır. Ayrıca, daha fazla destek ve iyileştirme de yolda.

Daha fazla bilgi için resmi belgelere göz atın. Neler üreteceğinizi görmek için sabırsızlanıyoruz ve geri bildirimlerinizi bekliyoruz. Lütfen aşağıdaki kanalları kullanarak düşüncelerinizi paylaşın ve sorunları bildirin:

Okumaya devam edin