Birden fazla form faktöründe kamerayı destekleme

Android uygulamaları, yalnızca dikey modda tutulan telefonlardan daha fazla form faktöründe çalışır. Pencereli görüntüleme, bağlı ekranlar ve katlanabilir cihazların kullanıma sunulmasıyla birlikte kamera uygulamanızın dinamik pencere boyutlarına, farklı en boy oranlarına ve harici donanımlara uyum sağlaması gerekiyor.

Şekil 1. Farklı ekranlardaki kamera uygulaması örneği.

Telefon mantığı neden bozulur?

Kamera uygulamaları genellikle çok biçimli ortamlarda kritik hatalara neden olan varsayımlarda bulunur.

Doğal yön

  • Varsayım: Cihazın doğal yönü ROTATION_0 her zaman dikey olmalıdır.
  • Gerçek: Tabletlerde, bazı katlanabilir cihazların iç ekranında ve masaüstü monitörlerinde ROTATION_0 genellikle yataydır.
  • Sonuç: Önizleme 90 derece hatalı şekilde döndürülüyor
Şekil 2. Doğru döndürme uygulanmadan önce ve uygulandıktan sonraki kamera vizörü.

Sensör hizalama

  • Varsayım: Kamera sensörünün uzun kenarı, ekranın uzun kenarıyla aynı hizadadır.
  • Gerçeklik: Yeniden boyutlandırılabilir bir pencere kare veya yatay olabilir ancak sensör sabit kalır (genellikle 4:3).
  • Sonuç: Gerilmiş veya başka şekilde bozulmuş resimler
Şekil 3. Doğru ölçeklendirme faktörü uygulanmadan önce ve uygulandıktan sonraki kamera vizörü.

Ekran yoğunluğu ve boyutu

  • Varsayım: Ekranın yoğunluğu ve boyutu çalışma zamanında değişmez.
  • Gerçek: Masaüstü ortamlarında kullanıcılar pencereleri serbestçe yeniden boyutlandırır.
  • Sonuç: Her sürükleme etkinliğinde kamera oturumunun yeniden başlatılması kullanıcı deneyimini kesintiye uğratır ve kilitlenmelere neden olabilir.

1. çözüm: Sistem amaçlarını kullanın

Uygulamanızın fotoğraf veya video çekmesi gerekiyorsa ancak özel bir kamera arayüzü gerekmiyorsa farklı form faktörlerini ele almanın en iyi yolu cihazın önceden yüklenmiş sistem kamerasını başlatmaktır (bkz. Kamera intent'leri).

Sistem amaçlarını kullanmak, tüm yakalama deneyimini cihazın orijinal ekipman üreticisi (OEM) tarafından geliştirilen kamera uygulamasına devreder. Bu, aşağıdakiler de dahil olmak üzere form faktörü desteğinin karmaşıklığını etkili bir şekilde dış kaynaklara aktarır:

  • Yerleşik yeniden boyutlandırma ve döndürme desteği: Katlanabilir cihazlarda veya tabletlerdeki varsayılan kamera uygulaması, üretici tarafından özellikle bu cihazın geometrisini işlemek için geliştirilmiştir. Uygulama, cihaz katlandığında, döndürüldüğünde veya çoklu pencere moduna alındığında düzgün çalışacak şekilde tasarlanmıştır.
  • Gelişmiş donanım özelliklerine erişim: OEM kamera uygulamaları, donanıma göre ayarlanmış algoritmalara (gece modu, HDR, belirli lens geçişi) özel erişime sahiptir. Bu algoritmaları manuel olarak kopyalamak zordur veya imkansızdır.

2. çözüm: Jetpack CameraX'i kullanın

CameraX, kamera uygulaması geliştirmeyi kolaylaştırmak için oluşturulmuş bir Jetpack kitaplığıdır. CameraX, yaşam döngüsüne duyarlı ve yüzeye yöneliktir. Bir cihaz katlandığında, döndürüldüğünde veya yeniden boyutlandırıldığında sensör yönünün ve yüzey boyutlarının manuel olarak yeniden hesaplanmasını gerektiren Camera2'nin aksine CameraX, çok pencereli yeniden boyutlandırma sırasında veya bir uygulama bağlı bir ekrana taşındığında kamera oturumlarının yeniden yapılandırılmasını otomatik olarak gerçekleştirir. Böylece önizleme akışının takılmadan veya gerilmeden uyarlanması sağlanır.

PreviewView gibi bileşenler, katlanabilir cihazın kapak ekranından iç ekrana geçişi gibi farklı durumlar için en-boy oranını ve ölçek türlerini akıllıca yönetir. Böylece, cihaza özel uç durumların karmaşık bir koleksiyonu yerine tek ve tutarlı bir uygulama ile çeşitli donanımları destekleyebilirsiniz.

Oluştur

Jetpack Compose ile özel androidx.camera:camera-compose kitaplığını kullanın. Kitaplık, Compose yaşam döngüsü içindeki yeniden boyutlandırma, döndürme ve en boy oranlarının karmaşık geometrisini işlemek için özel olarak tasarlanmış CameraXViewfinder composable'ını sağlar.

CameraXViewfinder bileşeni, kamera uygulamalarındaki en yaygın hata kaynaklarını ortadan kaldırır:

  • Otomatik koordinat dönüşümü: Kamera uygulaması oluşturmanın en zor kısımlarından biri, kullanıcının dokunmasını (ekrandaki x, y koordinatları) odak ve ölçüm için kamera sensörünün koordinat sistemiyle (0-1, 0-1 döndürülmüş) eşlemektir. CameraXViewfinder, pencere yeniden boyutlandırıldığında veya cihaz katlandığında bile matematik işlemlerini otomatik olarak yapan bir CoordinateTransformer sunar.
  • Doğru düzen davranışı: SurfaceView veya TextureView'den farklı olarak CameraXViewfinder, Compose'un z-sıralamasıyla doğru şekilde çalışır. Kullanıcı arayüzü öğelerini (odak halkaları, kontroller) yerleştirebilir veya değiştiricileri (köşeleri yuvarlama, animasyonlar) oluşturma yapıtları olmadan uygulayabilirsiniz.
  • Yeniden boyutlandırma ve en boy oranı: CameraXViewfinder, merkezi kırpma ve merkeze sığdırma mantığını dahili olarak işleyerek uygulama penceresi standart olmayan en boy oranlarında (ör. bölünmüş ekran veya pencereli görüntüleme modu) yeniden boyutlandırıldığında önizlemenin genişlemesini önler.

Görüntüleme sayısı

Görüntüleme tabanlı uygulamalarda PreviewView veya ViewFinderView simgesini kullanın. SurfaceView veya TextureView öğesini doğrudan kullanıyorsanız en-boy oranını hesaplamanız ve doğru dönüşüm matrisini kendiniz uygulamanız gerekir.

3. çözüm: Yönü ve yeniden boyutlandırmayı dinamik olarak işleme

Platform API'lerini doğrudan kullanırken cihaz döndürme, etkinlik yeniden başlatma ve en boy oranını göz önünde bulundurun.

Cihaz döndürmeyi durdurma

Kullanıcı arayüzü yerleşiminizi belirlemek için yalnızca Display#getRotation() veya fiziksel sensör yönlendirmesine güvenmeyin.

  • Pencere metriklerini kullanma: WindowManager#getCurrentWindowMetrics() kullanarak uygulama pencerenizin genişliğini ve yüksekliğini karşılaştırarak düzeninizi (yatay veya dikey kullanıcı arayüzü) belirleyin.
  • Doğal yönü yoksayma: Uygulamanız, yatay bir monitörde dikey şekilli bir pencerede olabilir. Cihaz yönü, kullanıcı arayüzü sınırlarınızla alakalı değildir.

Etkinliklerin yeniden başlatılmasını önleme

Varsayılan Android davranışı, yapılandırma değişikliklerinde (ör. pencere boyutu değiştirme) uygulamanızın etkinliğini bozar. Kamera uygulamalarında bu durum, ekranda titreme veya görüntülü görüşme sırasında bağlantının düşmesi şeklinde görünür.

En boy oranı ve kırpma

Katlanabilir cihazlarda ve masaüstü pencerelerinde sık karşılaşılan bir sorun, önizlemenin gerilmesidir. Bu durumda, 4:3 kamera feed'i 16:9 veya 1:1 pencereye zorlanır.

  • Genişletme: Önizleme ve pencere en boy oranları farklıysa kamera arabelleğini görünüm sınırlarıyla tam olarak eşleşmeye zorlamayın.
  • Ortadan kırpma (önerilen): Önizlemeyi pencerenin en kısa boyutunu dolduracak şekilde ölçeklendirin ve fazlalığı kırpın. Bu sayede özne bozulmadan kalır ve çerçeveyi doldurur.
  • Ortaya sığdır (alternatif): Tam görüş alanının gösterilmesi önemliyse (ör. belge tarama) önizlemeyi pencerenin içinde letterbox olarak gösterin.

Bonus: Katlanabilir cihazlara yönelik deneyimler için destek

Katlanabilir cihazlar, yalnızca bükülebilen telefonlar değildir. Ayrıca, kullanıcıların fotoğraf ve video çekme şeklini temelden iyileştirebilecek benzersiz donanım durumları sunar. Katlanabilir ekranı çözülmesi gereken bir sorun olarak ele almak yerine, katlanabilir olmayan cihazlarda mümkün olmayan özellikler oluşturmak için kullanın.

Masaüstü modu (ellerinizi kullanmadan çekim yapma)

Masaüstü modu, kullanıcıların cihazı yarıya katlayıp bir yüzeye yerleştirerek uzun süreli görüntülü görüşmeler yapmasına, hızlandırılmış çekimler ve uzun pozlama gece fotoğrafları çekmesine olanak tanır.

Şekil 5. Masaüstü modunda bir iletişim uygulaması: Kamera vizörü menteşenin üst kısmında, kontroller ise alt kısmında yer alıyor.

Arka ekran modu (yüksek kaliteli selfie'ler)

  • Katlanabilir cihazlarda arka kameralar genellikle kullanıcıya dönük kameralardan daha yüksek kalitelidir. Arka ekran modu, kullanıcının cihazı açmasına ve çevirmesine olanak tanır. Bu modda, küçük kapak ekranı ana arka kamera için canlı vizör olarak kullanılır.
  • Arka ekran modu, ek ekipman taşımanıza gerek kalmadan 50 MP ve üzeri çözünürlükte selfie'ler, ultra geniş grup çekimleri ve yüksek kaliteli vlog'lar çekmenizi sağlar.

Dual Screen modu (konu önizlemesi)

  • Çift ekran modu, kamera önizlemesini hem iç hem de dış ekranda aynı anda göstermenizi sağlar. Bu özellik, insan fotoğrafları çekmek için idealdir: Fotoğrafını çektiğiniz kişiler, dış ekranda kendilerini görebilir ve siz iç ekranda kadrajı ayarlarken pozlarını düzeltebilir.
  • Arka ekran modunun (tüm uygulamayı taşıyan) aksine, çift ekran modunda kapak ekranında ikincil bir sunu penceresi oluşturulur.
Şekil 5. Çift ekran modunda bir kamera uygulaması.