Android Camera ViewFinder

Mustafa Kurt
IBTech
Published in
3 min readDec 5, 2022

Selamlar, bu yazımda sizlere Android CameraViewFinder dan bahsedeğim. Şimdiden keyifli okumalar :)

Yıllar içinde Android cihazlar, diğer özelliklerin yanı sıra çeşitli boyutlar, şekiller ve ekranlar içerecek şekilde gelişti. Ancak en başından beri, telefonunuzla fotoğraf çekmek en önemli kullanım durumlarından biri oldu. Günümüzde kamera özellikleri, tüketicilerin telefon satın almalarının en önemli nedenlerinden biri olmaya devam ediyor.

Geliştiriciler olarak Android uygulamarımızda kamera özelliklerinden faydalanmak isteyebiliriz. Bunun için Android Camera frameworkunu kullanıyoruz. Genellikle uygulamak istediğiniz ilk kullanım durumu, ekranda kamera sensörünün çıktısını gösteren Önizleme kullanım durumudur. Fakat burada bazı problemler karşımıza çıkabiliyor. Ekran, kamera sensörü çıkışıyla aynı en boy oranına sahip olduğu ve cihaz doğal portre yönünde kaldığı sürece her şey yolunda olmalıdır.

Ancak pencereyi yeniden boyutlandırdığınızda, cihazınızı açtığınızda veya ekranı ya da yönü değiştirdiğinizde ne olur? Pekala, çoğu durumda önizleme uzatılmış, baş aşağı veya yanlış döndürülmüş görünebilir. Ayrıca, çok pencereli bir ortamdaysanız, uygulamanız çökebilir bile. Bu neden oluyor? CaptureSession’ı oluştururken yaptığınız üstü kapalı varsayımlar nedeniyle .

Tarihsel olarak, uygulamanız tüm yaşam döngüsü boyunca aynı pencerede yaşayabilir, ancak katlanabilir cihazlar gibi yeni form faktörlerinin ve çoklu pencere ve çoklu ekran gibi yeni görüntüleme modlarının kullanılabilirliği ile bunun olacağını varsayamazsınız.

Özellikle, çeşitli form faktörlerini hedefleyen bir uygulama geliştirirken en önemli hususlardan bazılarına bakalım:

Çeşitli form faktörlerini hedefleyen bir uygulama geliştirirken kaçınılması gereken bazı yaygın tuzakları inceleyelim:

  • Uygulamanızın portre şeklinde bir pencerede yaşayacağını düşünmeyin. Sabit yönlendirme isteği Android 13'te hâlâ desteklenmektedir, ancak artık cihaz üreticileri, tercih edilen yönlendirme için bir uygulama isteğini geçersiz kılma seçeneğine sahip olabilir.
  • Uygulamanız için herhangi bir sabit boyut veya en boy oranı varsaymayın . resizableActivity = “false” ayarlasanız bile , uygulamanız yine de büyük ekranlarda (>=600dp) çoklu pencere modunda kullanılabilir.
  • Ekran yönü ile kamera arasında sabit bir ilişki olduğunu varsaymayın . Android Uyumluluk Tanımlama Belgesi , bir kamera görüntü sensörünün “kameranın uzun boyutunun ekranın uzun boyutuyla hizalanacak şekilde YÖNLENDİRİLMESİ GEREKİR” olduğunu belirtir . API düzeyi 32'den itibaren, katlanabilir aygıtlarda yönü sorgulayan kamera istemcileri, aygıt/katlama durumuna bağlı olarak dinamik olarak değişen bir değer alabilir.
  • İç metin boyutunun değişemeyeceğini varsaymayın . Yeni görev çubuğu, uygulamalara ek olarak bildirilir ve hareketle gezinme ile kullanıldığında, görev çubuğu gizlenebilir ve dinamik olarak gösterilebilir.
  • Uygulamanızın kameraya özel erişimi olduğunu varsaymayın. Uygulamanız çoklu pencere durumundayken, diğer uygulamalar kamera ve mikrofon gibi paylaşılan kaynaklara erişim elde edebilir.

Camera ViewFinder

CameraViewfinder , minimum çabayla kamera önizlemelerini hızlı bir şekilde uygulamanıza olanak tanıyan, Jetpack kitaplığından yeni bir eserdir. Kamera beslemesini görüntülemek için dahili olarak bir TextureView veya SurfaceView kullanır ve vizörü doğru şekilde görüntülemek için gerekli dönüşümleri bunlara uygular. Bu, en boy oranlarını, ölçeklerini ve dönüşlerini düzeltmeyi içerir. Mevcut Camera2 kod tabanınızla tamamen uyumludur ve çeşitli cihazlarda sürekli olarak test edilir.

Nasıl kullanılacağını görelim.

Öncelikle, uygulama düzeyindeki build.gradle dosyanıza bağımlılığı ekleyin:

implementationandroidx.camera:camera-viewfinder:1.3.0-alpha01”

Projemizi senkronize ettikten sonra camera view artık view olarak dogrudan kullanabileceğiz. Layout dosyamıza aşağıdaki gibi ekleyebiliriz.

<androidx.camera.viewfinder.CameraViewfinder
android:id=”@+id/view_finder”
app:scaleType=”fitCenter”
app:implementationMode=”performance”
android:layout_width=”match_parent”
android:layout_height=”match_parent”/>

Gördüğünüz gibi, CameraViewfinder , PreviewView üzerinde bulunan kontrollerin aynısına sahiptir, böylece farklı Uygulama modları ve ölçeklendirme türleri seçebilirsiniz . CameraCaptureSession oluşturabilirsiniz, ancak hedef yüzeyler olarak bir TextureView veya SurfaceView sağlamak yerine requestSurfaceAsync() sonucunu kullanın.

CameraViewFinder yeniden boyutlandırılabilir yüzeyler, konfigürasyon değişiklikleri, döndürmeler ve çoklu pencere modlarında kullanıma hazırdır ve birçok katlanabilir cihazda test edilmiştir.

Ancak katlanabilir ve çift ekranlı cihazlar için optimize edilmiş düzenler uygulamak istiyorsanız, kullanıcılarınıza benzersiz deneyimler sağlamak için CameraViewFinder’ı Jetpack WindowManager kitaplığıyla birleştirebilirsiniz.

Örneğin, ekranın ortasında bir menteşe varsa veya cihaz “book” veya “tabletop” modundaysa, tam ekran önizlemesini göstermemeyi seçebilirsiniz. Bu senaryolarda, ekranın bir bölümünde vizörü, diğer tarafında kontrolleri bulundurabilir veya ekranın bir bölümünü son çekilen fotoğrafları göstermek için kullanabilirsiniz.

Kaynaklar

https://github.com/androidx/androidx/blob/androidx-main/camera/integration-tests/viewfindertestapp/src/main/java/androidx/camera/integration/viewfinder/CameraViewfinderFoldableFragment.kt#L583

--

--