Ürün Haberleri

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

Okuma süresi: 6 dk.
Tahsin Masrur adlı kullanıcının profilini görüntüle
Tahsin Masrur Yazılım Mühendisi

Modern kamera uygulamaları, güçlü ve birbiriyle örtüşen özelliklerle tanımlanır. Kullanıcılar, çarpıcı HDR ile video kaydetmeyi, 60 FPS'de akıcı hareket yakalamayı ve Önizleme Sabitleme ile son derece akıcı görüntüler elde etmeyi bekler. Genellikle bunların hepsini aynı anda isterler.

Geliştiriciler olarak, gerçekte durumun 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 bir kumardı. Özelliklerin desteklenip desteklenmediğini tek tek kontrol edebilirsiniz ancak bunları birleştirmek, tanımlanmamış davranışlara veya daha kötüsü başarısız bir kamera oturumuna yol açabilir. Bu belirsizlik, geliştiricileri muhafazakar olmaya zorlar. Bu da yetenekli cihazlardaki kullanıcıların mümkün olan en iyi deneyime erişmesini engeller.

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

Bu sorunu çözmek için CameraX'te Özellik Grubu'nu kullanıma sunuyoruz. Bu yeni API, tahmin yürütme 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 önceliklerinizi CameraX'e bildirerek en iyi desteklenen kombinasyonu sizin için etkinleştirmesini sağlayabilirsiniz.

CameraX'i Yeni Kullanmaya Başlayanlar İçin

Yeni Feature Group API'yi incelemeden önce CameraX'in ne olduğunu kısaca hatırlayalım. CameraX, kamera uygulaması geliştirmeyi kolaylaştırmak için tasarlanmış bir Jetpack destek kitaplığıdır. Android 6.0'a (API düzeyi 23) kadar geriye dönük uyumlulukla çoğu Android cihazda çalışan, tutarlı ve kullanımı kolay bir API yüzeyi sağlar. CameraX'i kullanmaya yeni başladıysanız resmi belgelere göz atmanızı ve codelab'i denemenizi öneririz.

Feature Group API ile neler oluşturabilirsiniz?

Artık özellik kombinasyonlarını deneme yanılma yoluyla bulmanız gerekmez.Uygun donanımlarda (ör. Pixel 10 Pro) eşzamanlı HDR ve 60 FPS video gibi mümkün olan en iyi kamera deneyimlerini güvenle sunarken kombinasyonu desteklemeyen cihazlarda hataları kolayca önleyebilirsiniz.

unnamed.png
Pixel 10 Pro'da hem HDR hem de 60 FPS aynı anda etkinleştirilmiş
unnamed (1).png
HDR ve 60 FPS'nin aynı anda çalıştırılamadığı eski cihazlarda yalnızca HDR etkinleştirilir, 60 FPS seçeneği ise devre dışı bırakılır.

Feature Group API 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ı bir şekilde etkinleştirin veya devre dışı bırakın. Örneğin, kullanıcı HDR'yi etkinleştirirse ve bu kombinasyon cihazda desteklenmiyorsa 60 FPS seçeneğini anında devre dışı bırakıp devre dışı bırakabilirsiniz. 
hdr.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ştirir ve karmaşık, cihaza özel mantık olmadan mükemmel bir sonuç sağlar.
  • Kamera oturumu hatalarını önleme: Desteği önceden doğrulayarak kameranın desteklenmeyen bir kombinasyonu yapılandırmaya çalışmasını önlersiniz. 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 etrafında şekillenir.

  1. GroupableFeature: Bu API, HDR_HLG10, FPS_60, PREVIEW_STABILIZATION ve IMAGE_ULTRA_HDR gibi önceden tanımlanmış bir dizi gruplandırılabilir ö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 parametreyi 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) için idealdir. Belirleyici ve tutarlı bir deneyim sağlamak için bindToLifecycle çağrısı, istenen kombinasyon desteklenmiyorsa özellik isteğini sessizce yok saymak yerine IllegalArgumentException hatası verir. Bu sonucu önceden sorgulamak için CameraInfo#isFeatureGroupSupported API (ayrıntılar aşağıda verilmiştir) kullanılmalıdır.
    • preferredFeatureGroup: Bu seçeneği, istenen ancak isteğe bağlı olan özellikler için kullanın. Örneğin, varsayılan bir "Yüksek Kalite" modu uygulamak istediğinizde bu seçeneğ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. Uygulama kullanıcı arayüzünüzde kullanıcılara yalnızca desteklenen özellik seçeneklerini sunmak için idealdir. Bu yönteme bir SessionConfig iletirsiniz ve kombinasyonun desteklenip desteklenmediğini belirten bir boole değeri döndürür. Gerekli özelliklere sahip bir SessionConfig bağlamak istiyorsanı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şenlerin nasıl kullanılacağına 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 önizleme sabitlemeye öncelik vermesini söylüyoruz. CameraX, tüm olası kombinasyonları kontrol etme ve cihazın desteklediği en iyi kombinasyonu seçme karmaşıklığını ortadan kaldırır.

Ö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üyü siler. Bu sayede, cihaza özel karmaşık kontroller yazmadan mümkün olan en iyi deneyimi elde edersiniz.

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, özellik kombinasyonlarını aşağıdaki öncelik sırasına göre 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. Önizleme Sabitleme
  8. Yukarıdaki özelliklerin hiçbiri

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

Kullanıcı seçimlerine yanıt veren ve kullanıcıların desteklenmeyen bir özellik kombinasyonunu seçmesini engelleyen bir kullanıcı arayüzü oluşturmak için doğrudan destek sorgusu yapabilirsiniz. Aşağıdaki işlev, kullanıcının mevcut seçimleriyle uyumlu olmayan özellikleri 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ı çalışması garanti edilen bir yapılandırmayla yeniden bağlamak için bu mantığı ViewModel 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 ele alınan hem "en iyi çaba" hem de "reaktif kullanıcı arayüzü" senaryolarının eksiksiz bir uygulamasını sunar.

Lütfen unutmayın: Bu bir test uygulamasıdır ve resmi olarak desteklenen bir örnek değildir. Feature Group API için mükemmel bir referans olsa da üretimde kullanıma hazır değildir.

Hemen başlayın

Feature Group API, gelişmiş kamera özellikleriyle çalışırken ortaya çıkan belirsizliği ortadan kaldırır. Özellik desteğini sorgulamak için deterministik bir yöntem sunarak daha güçlü ve güvenilir Kamera uygulamaları oluşturabilirsiniz.

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

Daha fazla bilgi için resmi belgelere göz atın. Üreteceğiniz içerikleri heyecanla bekliyoruz. Geri bildirimlerinizi bizimle paylaşmayı unutmayın. Görüşlerinizi ve yaşadığınız sorunları lütfen aşağıdaki kanallardan bize iletin:

Okumaya devam et