CameraX kullanım alanı döndürmeleri

Bu konuda, uygulamanızın içinde CameraX kullanım alanlarının nasıl ayarlanacağı veya resimlerden, doğru rotasyon bilgisine sahip ImageAnalysis veya ImageCapture kullanım alanı. Yani:

  • ImageAnalysis kullanım alanının Analyzer, bakın.
  • ImageCapture kullanım alanı, resimleri doğru döndürerek çekmelidir.

Terminoloji

Bu konuda aşağıdaki terminoloji kullanılır, dolayısıyla her terimin ne anlama geldiğini anlamak önemlidir:

Ekran yönü
Bu, cihazın hangi tarafının yukarı konumda olduğunu ifade eder ve şu dört değerden biri: dikey, yatay, ters dikey veya ters kullanabilirsiniz.
Ekran döndürme
Bu, Display.getRotation() ve cihazın saat yönünün tersine döndürülme derecesini gösterir çok önemli bir yer tutar.
Hedef rotasyon
Bu, döndürme için kaç derece geçeceğini gösterir saat yönünde hareket ettirmeniz gerekir.

Hedef rotasyonu belirleme

Aşağıdaki örneklerde bir cihaz için hedef rotasyonun nasıl belirleneceği gösterilmektedir bir bıçak işaretidir.

1. Örnek: Dikey doğal yön

Cihaz örneği: Pixel 3 XL

Doğal yön = Dikey
Geçerli yön = Dikey

Ekran rotasyonu = 0
Hedef rotasyon = 0

Doğal yön = Dikey
Geçerli yön = Yatay

Ekran rotasyonu =
90 Hedef rotasyon = 90

2. Örnek: Yatay doğal yön

Cihaz örneği: Pixel C

Doğal yön = Yatay
Geçerli yön = Yatay

Ekran rotasyonu = 0
Hedef rotasyon = 0

Doğal yön = Yatay
Geçerli yön = Dikey

Ekran rotasyonu = 270
Hedef rotasyon = 270

Resim döndürme

Hangi uçta? Android'de sensör yönü sabit olarak tanımlanır değeri (0, 90, 180, 270) temsil eden değer üst tarafından bir köşeye alınır. Tüm resimlerde gösterildiği gibi, resim rotasyonunda verilerin nasıl olması saat yönünde döndürüldü.

Aşağıdaki örneklerde, resim rotasyonunun kamera sensörünün yönü. Ayrıca hedef rotasyonun ekran döndürme.

1. Örnek: Sensör 90 derece döndürüldü

Cihaz örneği: Pixel 3 XL

Ekran rotasyonu = 0
Ekran yönü = Dikey
Resim döndürme = 90

Ekran rotasyonu =
90 Ekran yönü = Yatay
Resim döndürme = 0

2. Örnek: Sensör 270 derece döndürüldü

Cihaz örneği: Nexus 5X

Ekran rotasyonu = 0
Ekran yönü = Dikey
Resim döndürme = 270

Ekran rotasyonu =
90 Ekran yönü = Yatay
Resim döndürme = 180

3. Örnek: Sensör 0 derece döndürüldü

Cihaz örneği: Pixel C (Tablet)

Ekran rotasyonu = 0
Ekran yönü = Yatay
Resim döndürme = 0

Ekran rotasyonu = 270
Ekran yönü = Dikey
Resim döndürme = 90

Resmin dönüşünü hesaplama

Görüntü Analizi

ImageAnalysis adlı çocuğun Analyzer cihazı, kameradan şu şekilde görüntü alır: ImageProxy sn. Her resim, erişilebilir durumda olan döndürme bilgilerini içerir şu yolla:

val rotation = imageProxy.imageInfo.rotationDegrees

Bu değer, resmin döndürülmesi gereken dereceyi gösterir saat yönünde, ImageAnalysis adlı reklamın hedef rotasyonuyla eşleşecek şekilde ayarlayın. Şu bağlamda: Android uygulamasında, ImageAnalysis adlı reklamverenin hedef rotasyonu genellikle ekranın yönünü değiştirebilirsiniz.

Resim Yakalama

Yakalama olduğunda sinyal vermek için ImageCapture örneğine geri çağırma eklenir hazır. Sonuç, yakalanan görüntü veya bir hata olabilir.

Fotoğraf çekerken sağlanan geri çağırma şunlardan biri olabilir: türler:

  • OnImageCapturedCallback: Bellek içi erişimi olan bir görüntü alır. bir ImageProxy biçiminde dışa aktarabilirsiniz.
  • OnImageSavedCallback: Çekilen görüntü çekildiğinde çağrılır belirtilen konumda başarılı bir şekilde depolandı ImageCapture.OutputFileOptions. Seçenekler bir File, bir OutputStream veya MediaStore bölgesinde bir konum.

Biçimi ne olursa olsun (ImageProxy, File, OutputStream, MediaStore Uri), döndürme derecesini Çekilen görüntünün ImageCapture adlı saatin yönüyle eşleşmesi için saat yönünde döndürülmesi Android uygulaması bağlamında genellikle ekranın yönüyle eşleşiyor.

Yakalanan görüntünün döndürme işlemi aşağıdakilerden biri kullanılarak yapılabilir: yöntemler:

ImageProxy

val rotation = imageProxy.imageInfo.rotationDegrees

File

val exif = Exif.createFromFile(file)
val rotation = exif.rotation

OutputStream

val byteArray = outputStream.toByteArray()
val exif = Exif.createFromInputStream(ByteArrayInputStream(byteArray))
val rotation = exif.rotation

MediaStore uri

val inputStream = contentResolver.openInputStream(outputFileResults.savedUri)
val exif = Exif.createFromInputStream(inputStream)
val rotation = exif.rotation

Resmin dönüşünü doğrulama

ImageAnalysis ve ImageCapture kullanım alanları ImageProxy kamera. ImageProxy, resmi sarmalar ve hakkında bilgiler içerir. Bu rotasyon bilgileri resmin kullanımla eşleşmesi için döndürülmesi gereken dereceyi gösterir durumun hedef rotasyonunu belirler.

Bir resmin rotasyon doğrulama akışı

ImageCapture/ImageAnalysis hedef döndürme yönergeleri

Çoğu cihaz dikey yönde veya ters yatay yönde varsayılan olarak bazı Android uygulamaları bu yönleri desteklemez. Uygulama olup olmadığı kullanım alanlarının hedef rotasyonunun güncellendi.

Aşağıda, kullanım alanlarının hedef rotasyonunun nasıl senkronize tutulacağını tanımlayan iki tablo yer almaktadır değişiklik yapabilirsiniz. İlki, proje yaşam döngüsü boyunca dört farklı yön var. ikincisi yalnızca cihazın döndürdüğü yönleri işliyor olarak ayarlayacağım.

Uygulamanızda hangi yönergeleri uygulayacağınızı seçmek için:

  1. Uygulamanızın kamerasının (Activity) kilitli, yönlü veya yön yapılandırma değişikliklerini geçersiz kılıp kılmadığını kontrol edin.

  2. Uygulamanızın kamerasının (Activity) dört cihazı da kullanıp kullanamayacağına karar verin yönler (dikey, ters dikey, yatay ve ters yatay), veya yalnızca çalıştırıldığı cihazın desteklediği yönlere varsayılan olarak.

Dört yönü de destekleyin

Bu tabloda, cihazın aşağıdaki durumlarda uyulması gereken ters portreye döndürülmez. Aynı uygulama, yatay olarak döndürmeyin.

Senaryo Kurallar Tek pencere modu Birden fazla pencereli bölünmüş ekran modu
Kilidi açılmış yön Her bir kullanım alanını ayarlayın Activity oluşturulduğu zaman; örneğin Activity adlı kullanıcının onCreate() geri araması.
OrientationEventListener hesabını kullan onOrientationChanged() Geri çağırmanın içinde, kullanım alanlarının hedef rotasyonunu güncelleyin. Bu işlem, sistemin bir yön değişikliğinden sonra bile Activity öğesini yeniden oluşturmak döndürüldüğünde ortaya çıkar. Ekran ters çevrildiğinde de ayarlanır dikey yöne döndüğünde ve cihaz ters dikey yönde varsayılandır. Ayrıca, Activity öğesinin cihaz döndüğünde yeniden oluşturulur (örneğin, 90 derece). Bu işlemin gerçekleştirileceği yer: Uygulama ekranın yarısını kapladığında küçük form faktörlü cihazlarda ve daha büyük cihazlarda uygulama ekranın üçte ikisini kapladığında
İsteğe bağlı: Activity için screenOrientation ayarlayın fullSensor mülkü için AndroidManifest içinde dosyası olarak kaydedebilirsiniz. Bu şekilde, cihaz ters çevrildiğinde kullanıcı arayüzü dik konumda olur ve Activity öğesinin, Search Ads 360 tarafından yeniden oluşturulmasına olanak cihaz 90 derece döndürüldüğünde sisteme geçiş yapılır. Dikey yöne doğru döndürmeyen cihazlarda varsayılandır. Ekran şuradayken çoklu pencere modu desteklenmez: Ters dikey yönde.
Kilitli yön Kullanım alanlarını Activity ilk olarak oluşturulur. Örneğin, Activity onCreate() geri arama.
OrientationEventListener hesabını kullan onOrientationChanged() Geri çağırmanın içinde, Önizleme dışındaki kullanım alanlarının hedef rotasyonunu güncelleyin. Ayrıca, Activity öğesinin cihaz döndüğünde yeniden oluşturulur (örneğin, 90 derece). Bu işlemin gerçekleştirileceği yer: Uygulama ekranın yarısını kapladığında küçük form faktörlü cihazlarda ve daha büyük cihazlarda uygulama ekranın üçte ikisini kapladığında
Yön yapılandırmaları geçersiz kılındı Kullanım alanlarını Activity ilk olarak oluşturulur. Örneğin, Activity onCreate() geri arama.
OrientationEventListener hesabını kullan onOrientationChanged() Geri çağırmanın içinde, kullanım alanlarının hedef rotasyonunu güncelleyin. Ayrıca, Activity öğesinin cihaz döndüğünde yeniden oluşturulur (örneğin, 90 derece). Bu işlemin gerçekleştirileceği yer: Uygulama ekranın yarısını kapladığında küçük form faktörlü cihazlarda ve daha büyük cihazlarda uygulama ekranın üçte ikisini kapladığında
İsteğe bağlı: Etkinliğin screenOrientation özelliğini şurada fullSensor olarak ayarlayın: AndroidManifest dosyasına göz atın. Cihaz ters dikey durumdayken kullanıcı arayüzünün dik konumda olmasını sağlar. Dikey yöne doğru döndürmeyen cihazlarda varsayılandır. Ekran şuradayken çoklu pencere modu desteklenmez: Ters dikey yönde.

Yalnızca cihaz tarafından desteklenen yönleri destekleme

Yalnızca cihazın varsayılan olarak desteklediği yönleri destekleme ters dikey/ters yatay).

Senaryo Kurallar Birden fazla pencereli bölünmüş ekran modu
Kilidi açılmış yön Her bir kullanım alanını ayarlayın Activity oluşturulduğu zaman; örneğin Activity adlı kullanıcının onCreate() geri araması.
DisplayListener hesabını kullan onDisplayChanged() İç mekan kullanım alanlarının hedef rotasyonunu güncelleyin. Örneğin, cihaz 180 derece döndürüldü. Ayrıca, Activity öğesinin cihaz döndüğünde yeniden oluşturulur (örneğin, 90 derece). Bu işlemin gerçekleştirileceği yer: Uygulama ekranın yarısını kapladığında küçük form faktörlü cihazlarda ve daha büyük cihazlarda uygulama ekranın üçte ikisini kapladığında
Kilitli yön Kullanım alanlarını Activity ilk olarak oluşturulur. Örneğin, Activity onCreate() geri arama.
OrientationEventListener hesabını kullan onOrientationChanged() Geri çağırmanın içinde, kullanım alanlarının hedef rotasyonunu güncelleyin. Ayrıca, Activity öğesinin cihaz döndüğünde yeniden oluşturulur (örneğin, 90 derece). Bu işlemin gerçekleştirileceği yer: Uygulama ekranın yarısını kapladığında küçük form faktörlü cihazlarda ve daha büyük cihazlarda uygulama ekranın üçte ikisini kapladığında cihazlar.
Yön yapılandırmaları geçersiz kılındı Kullanım alanlarını Activity ilk olarak oluşturulur. Örneğin, Activity onCreate() geri arama.
DisplayListener hesabını kullan onDisplayChanged() İç mekan kullanım alanlarının hedef rotasyonunu güncelleyin. Örneğin, cihaz 180 derece döndürüldü. Ayrıca, Activity öğesinin cihaz döndüğünde yeniden oluşturulur (örneğin, 90 derece). Bu işlemin gerçekleştirileceği yer: Uygulama ekranın yarısını kapladığında küçük form faktörlü cihazlarda ve daha büyük cihazlarda uygulama ekranın üçte ikisini kapladığında

Kilidi açık yön

Activity, ekran yönü kilitsiz olan bir yöne sahip (ör. dikey veya yatay), cihazın fiziksel yönüyle uyumlu bazı cihazların desteklemediği ters dikey/yatay varsayılan olarak. Cihazı dört yönde de dönmeye zorlamak için Activity adlı çocuğun screenOrientation mülkü fullSensor adlı kullanıcıya.

Çoklu pencere modunda, ters dikey/yatay görünümü desteklemeyen bir cihaz varsayılan olarak ters dikey/yatay düzende döndürülmez, screenOrientation özelliği fullSensor olarak ayarlandı.

<!-- The Activity has an unlocked orientation, but might not rotate to reverse
portrait/landscape in single-window mode if the device doesn't support it by
default. -->
<activity android:name=".UnlockedOrientationActivity" />

<!-- The Activity has an unlocked orientation, and will rotate to all four
orientations in single-window mode. -->
<activity
   android:name=".UnlockedOrientationActivity"
   android:screenOrientation="fullSensor" />

Kilitli yön

Bir ekranın yönü aynı kalırken kilitleniyor (ör. dikey veya yatay) olanak tanır. Bu işlem, Activity için screenOrientation belirtilerek yapılabilir özelliğini AndroidManifest.xml dosyasındaki beyanında bulabilirsiniz.

Ekran yönü kilitlendiyse sistem, ekranı imha etmez ve Cihaz döndürülürken Activity öğesini yeniden oluşturabilirsiniz.

<!-- The Activity keeps a portrait orientation even as the device rotates. -->
<activity
   android:name=".LockedOrientationActivity"
   android:screenOrientation="portrait" />

Yön yapılandırması değişiklikleri geçersiz kılındı

Activity yön yapılandırması değişikliklerini geçersiz kıldığında sistem Cihazın fiziksel yönü değiştiğinde resmi yok edip yeniden oluşturmaz. Yine de sistem, kullanıcı arayüzünü cihazın fiziksel yönüyle eşleşecek şekilde günceller.

<!-- The Activity's UI might not rotate in reverse portrait/landscape if the
device doesn't support it by default. -->
<activity
   android:name=".OrientationConfigChangesOverriddenActivity"
   android:configChanges="orientation|screenSize" />

<!-- The Activity's UI will rotate to all 4 orientations in single-window
mode. -->
<activity
   android:name=".OrientationConfigChangesOverriddenActivity"
   android:configChanges="orientation|screenSize"
   android:screenOrientation="fullSensor" />

Kamera kullanım alanları kurulumu

Yukarıda açıklanan senaryolarda kamera kullanım alanları, İlk olarak Activity oluşturuldu.

Yönü kilitsiz olan bir Activity için bu kurulum yapılır cihaz her döndürüldüğünde; sistem, öğeyi imha edip yeniden Yön değişiklikleriyle ilgili Activity. Bu nedenle, belirli bir hedefin değeri için varsayılan olarak her defasında ekranın yönüyle eşleşecek şekilde hedef döndürmeyi ayarlar.

Yönü kilitli veya yönü geçersiz olan Activity yön yapılandırması değiştiğinde bu kurulum, Activity oluşturulmalıdır.

class CameraActivity : AppCompatActivity() {
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)

       val cameraProcessFuture = ProcessCameraProvider.getInstance(this)
       cameraProcessFuture.addListener(Runnable {
          val cameraProvider = cameraProcessFuture.get()

          // By default, the use cases set their target rotation to match the
          // display’s rotation.
          val preview = buildPreview()
          val imageAnalysis = buildImageAnalysis()
          val imageCapture = buildImageCapture()

          cameraProvider.bindToLifecycle(
              this, cameraSelector, preview, imageAnalysis, imageCapture)
       }, mainExecutor)
   }
}

OrientationEventListener kurulumu

OrientationEventListener kullanmak, hedefi sürekli olarak güncellemenize olanak tanır cihaz yönünün değişmesine bağlı olarak kamera kullanım alanlarının dönmesini de sağlayabilir.

class CameraActivity : AppCompatActivity() {

    private val orientationEventListener by lazy {
        object : OrientationEventListener(this) {
            override fun onOrientationChanged(orientation: Int) {
                if (orientation == ORIENTATION_UNKNOWN) {
                    return
                }

                val rotation = when (orientation) {
                     in 45 until 135 -> Surface.ROTATION_270
                     in 135 until 225 -> Surface.ROTATION_180
                     in 225 until 315 -> Surface.ROTATION_90
                     else -> Surface.ROTATION_0
                 }

                 imageAnalysis.targetRotation = rotation
                 imageCapture.targetRotation = rotation
            }
        }
    }

    override fun onStart() {
        super.onStart()
        orientationEventListener.enable()
    }

    override fun onStop() {
        super.onStop()
        orientationEventListener.disable()
    }
}

DisplayListener kurulumu

DisplayListener kullanmak, kameranın hedef dönüşünü güncellemenize olanak tanır kullanım alanları (örneğin, sistemin mevcut paketinizi kaldırmadığı ve cihaz 180 derece döndürüldükten sonra Activity öğesini yeniden oluşturun.

class CameraActivity : AppCompatActivity() {

    private val displayListener = object : DisplayManager.DisplayListener {
        override fun onDisplayChanged(displayId: Int) {
            if (rootView.display.displayId == displayId) {
                val rotation = rootView.display.rotation
                imageAnalysis.targetRotation = rotation
                imageCapture.targetRotation = rotation
            }
        }

        override fun onDisplayAdded(displayId: Int) {
        }

        override fun onDisplayRemoved(displayId: Int) {
        }
    }

    override fun onStart() {
        super.onStart()
        val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
        displayManager.registerDisplayListener(displayListener, null)
    }

    override fun onStop() {
        super.onStop()
        val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
        displayManager.unregisterDisplayListener(displayListener)
    }
}