Tek Özelliklerin Ötesinde: CameraX 1.5 ile Özellik Kombinasyonlarını Garanti Etme
Okuma süresi: 6 dk.
Modern kamera uygulamaları, güçlü ve çakışan özelliklerle 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çek 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 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 aynı anda HDR ve 60 FPS video desteği sunar. 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, tahmin etme 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 sizin için en iyi desteklenen kombinasyonu 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 Oluşturabilirsiniz?
Artık özellik kombinasyonları konusunda risk almanıza gerek yok.Bu kombinasyonu desteklemeyen cihazlarda hatalardan kaçınırken, 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 sunabilirsiniz.
Ö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.
- 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.
- GroupableFeature: Bu API, HDR_HLG10, FPS_60, PREVIEW_STABILIZATION ve IMAGE_ULTRA_HDR gibi önceden tanımlanmış bir dizi gruplanabilir özelliği kullanıma sunar. Hesaplama sınırlamaları nedeniyle, yalnızca belirli bir özellik grubu bu API'nin sağladığı yüksek güvenilirlikle gruplandırılabilir. Bu listeyi genişletmek için çalışmalarımızı sürdürüyoruz ve gelecekteki sürümlerde daha fazla özellik için destek sunacağız.
- 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. Belirleyici ve tutarlı bir deneyim sağlamak içinbindToLifecycleçağrısı, istenen kombinasyon desteklenmiyorsa özellik isteğini sessizce yoksaymak yerineIllegalArgumentExceptionoluşturur. Bu sonucu önceden sorgulamak içinCameraInfo#isFeatureGroupSupportedAPI'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 bir "Yüksek Kalite" modu uygulamak istediğinizde bu özelliği kullanabilirsiniz. İstediğiniz özellikleri önceliklerinize göre sıralayarak listelersiniz. CameraX, cihazın desteklediği en yüksek öncelikli kombinasyonu otomatik olarak etkinleştirir.
- 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
SessionConfigiletirsiniz ve kombinasyonun desteklenip desteklenmediğini belirten bir Boole değeri döndürülür. Gerekli özelliklere sahip birSessionConfigbağ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 destekleyebiliyor ancak önizleme sabitleme ile destekleyemiyorsa 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 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, 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:
- HDR + 60 FPS + Önizleme Sabitleme
- HDR + 60 FPS
- HDR + Önizleme Sabitleme
- HDR
- 60 FPS + Önizleme Sabitleme
- 60 FPS
- Sabitleme önizlemesi
- Yukarıdaki özelliklerin hiçbiri
2. senaryo: Tepkisel bir 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 tepki 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 bir test uygulamasıdır ve resmi olarak desteklenen bir örnek değildir. Bu doküman, Feature Group API için harika bir referans olsa da üretimde kullanılmak üzere düzenlenmemiştir.
Başlangıç Adımları
Feature Group API, gelişmiş kamera özellikleriyle çalışırken belirsizliği ortadan kaldırır. Özellik desteği için deterministik bir sorgulama yöntemi 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 tamamen 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. Üreteceğiniz içerikleri heyecanla bekliyor ve geri bildirimlerinizi bekliyoruz. Görüşlerinizi ve yaşadığınız sorunları lütfen aşağıdaki kanallardan bize iletin:
-
Ürün HaberleriGoogle Play'de, büyümenizi sağlamanıza, yeni iş modellerine uyum sağlamanıza ve kullanıcılarınıza tam olarak bulundukları yerde ulaşmanıza yardımcı olmak için abonelik platformumuzu sürekli olarak genişletiyoruz.
Sheenam Mittal • Okuma süresi: 4 dakika -
Ürün HaberleriGeçen yıl Android Studio, tüm yapay zeka modellerine açıldı. Bugün, kodlama aracınızı seçme desteğini sunarak bir sonraki adımı atıyoruz.
Matthew Warner • Okuma süresi: 3 dk. -
Ürün HaberleriGooglebook, ortak bir Android temeli üzerine inşa edilmiş yeni bir dizüstü bilgisayar kategorisini tanıtıyor. HP, Dell, Lenovo, Acer ve Asus gibi iş ortaklarının yüksek performanslı donanımları, mobil kolaylığı masaüstü gücüyle birleştirir.
Fahd Imtiaz, Loryn Hairston • Okuma süresi: 4 dakika
Android geliştirmeyle ilgili en son analizleri haftalık olarak gelen kutunuza alın.