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 formatlı 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örlerde ROTATION_0 genellikle yataydır.
  • Sonuç: Önizleme 90 derece hatalı 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, sensör sabit kalırken kare veya yatay olabilir (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ım için 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 cihazların kapak ekranından iç ekrana geçişi gibi farklı durumlar arasında 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ünde 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 dokunma işlemini (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 gerçekleştiren 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ştiriciler (köşeleri yuvarlama, animasyonlar) uygulayabilirsiniz.
  • Yeniden boyutlandırma ve en boy oranı: CameraXViewfinder, ortayı kırpma ve ortaya sığdırma mantığını dahili olarak işleyerek uygulama penceresi standart olmayan en boy oranlarına (ör. bölünmüş ekran veya masaüstü pencere modu) göre yeniden boyutlandırıldığında önizlemenin genişlememesini sağlar.

Görüntüleme sayısı

Görüntüleme tabanlı uygulamalarda PreviewView veya ViewFinderView simgesini kullanın. SurfaceView veya TextureView öğelerini 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ü düzeninizi 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 ve dikey kullanıcı arayüzü) belirleyin.
  • Doğal yönlendirmeyi 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üşmelerde bağlantının düşmesi şeklinde görülü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şletmeyin: Önizleme ve pencere en boy oranları farklıysa kamera arabelleğini hiçbir zaman 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 kareyi doldurur.
  • Ortaya sığdır (alternatif): Tam görüş alanının gösterilmesi önemliyse (örneğin, bir dokümanı tararken) önizlemeyi pencerenin içinde letterbox formatında gösterin.
  • Ortaya sığdır (alternatif): Tam görüş alanının gösterilmesi önemliyse (örneğin, bir dokümanı tararken) önizlemeyi pencerenin içinde letterbox formatında gösterin.

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

Katlanabilir cihazlar sadece bükülebilen telefonlar değildir. 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, zaman atlamalı fotoğraf çekmesine ve uzun pozlamalı 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çıp çevirerek küçük kapak ekranını ana arka kamera için canlı vizör olarak kullanmasına olanak tanı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 özneleri, dış ekranda kendilerini görebilir ve pozlarını ayarlayabilir. Siz de iç ekranda çekimi kadrajlayabilirsiniz.
  • Arka ekran modunun (tüm uygulamayı taşır) aksine, çift ekran modu kapak ekranında ikincil bir sunu penceresi oluşturur.
Şekil 5. Çift ekran modunda bir kamera uygulaması.