Kamera önizleme

Not: Bu sayfa Kamera2 paketiyle ilgilidir. Uygulamanız için Kamera2'nin belirli, alt düzey özellikleri gerekmiyorsa, KameraX'i kullanmanızı öneririz. Hem CameraX hem de Camera2, Android 5.0 (API düzeyi 21) ve sonraki sürümleri destekler.

Kameralar ve kamera önizlemelerinin yönü Android'de her zaman aynı olmuyor cihazlar.

Kamera, cihazın konum belirlemeden bağımsız olarak cihaz üzerinde sabit bir konumda telefon, tablet veya bilgisayar. Cihazın yönü değiştiğinde kamera yönü değişiklikleri.

Sonuç olarak, kamera uygulamaları genellikle kameralar ve videolar arasında cihazın yönü ve kamera önizlemesinin en boy oranı. Bir telefon dikey yöndeyse kamera önizlemesinin daha uzun olduğu varsayılır emin olmanız gerekir. Telefon (ve kamera) yatay olarak döndürüldüğünde, kamera önizlemesinin uzunluk değerinden daha geniş olması beklenir.

Ancak katlanabilir cihaz (ör. katlanabilir cihaz) gibi yeni form faktörleri, bu varsayımları çürütmektedir. cihazlar ve görüntü modları örneğin: çoklu pencere ve çoklu ekran. Katlanabilir cihazlar, ekran boyutunu ve en boy oranını değiştirmeden değiştirir. Yön. Çoklu pencere modu, kamera uygulamalarını ekranın bir kısmıyla kısıtlar. cihaz yönünden bağımsız olarak kamera önizlemesini ölçeklendirin. Çoklu ekran modu, ikincil ekranların kullanılmasını mümkün kılar. birincil ekranla aynı yönde olmalıdır.

Kamera yönü

İlgili içeriği oluşturmak için kullanılan Android Uyumluluğu Tanımı kamera görüntü sensörünün "uzun kameranın görüntü sensörüne boyutu ekranın uzun boyutuyla uyumlu. Yani, Cihaz yatay yönde tutulmalıdır, kameraların resimleri yatay yönde. Bu, cihazın doğal yapısından bağımsız olarak yön; yani yatay birincil cihazlar için de geçerlidir. dikey-birincil cihazlar" olarak ayarlanmıştır.

Kameradan ekrana yerleştirme düzeni, kameranın görüntüleme alanını en üst düzeye çıkarır. kamera uygulamasındaki vizör. Ayrıca görüntü sensörleri, verilerini genelde yatay en boy oranları ve 4:3 en yaygın kullanılan orandır.

Telefon ve kamera sensörü dikey yönde.
Şekil 1. Telefon ve kamera sensörünün tipik ilişkisi Yön.

Kamera sensörünün doğal yönü yataydır. Şekil 1'de sensör (kamera ile aynı yönü gösteren) ekrana göre 270 derece döndürülür. Android Uyumluluk Tanımı.

Sensör dönüşünü uygulamalara göstermek için camera2 API'si bir SENSOR_ORIENTATION sabittir. Çoğu telefon ve tablette cihaz, sensör yönünü bildirir 270 derece ve 90 derecelik açıyı (ör. arkasına doğru bakan kameralar için (cihazın uzun kenarı) hizalayın. bir sensöre dokunun. Dizüstü kameralar genellikle sensör yönü 0 veya 180 derece olmalıdır.

Çünkü kamera görüntüsü sensörleri yönünde (yatay) döndürüldüğünde, görüntü arabelleğinin döndürüldüğü kamera önizlemesinin SENSOR_ORIENTATION tarafından belirtilen derece sayısı cihazın doğal yönünde dik bir şekilde görünür. Ön kameralarda döndürme saat yönünün tersinedir; kameralar için saat yönünde.

Örneğin, Şekil 1'deki ön kamera için resim arabelleği aşağıdaki gibi görünür:

Kamera sensörü resimle birlikte yatay yönde döndürüldü
            yana doğru, sol üstte.

Önizlemenin doğru şekilde ayarlanması için resim saat yönünün tersine 270 derece döndürülmelidir. yön, cihazın yönüyle eşleşiyor:

Dikey yönlü kamera sensörü ve resim dik konumda.

Arka yüz kamerası aynı yönde bir resim arabelleği üretir aynı fakat SENSOR_ORIENTATION 90 derecedir. Sonuç olarak arabellek saat yönünde 90 derece döndürüldü.

Cihaz döndürme

Cihaz dönüşü, cihazın doğal konumundan döndürülme derecesidir. Yön. Örneğin, yatay yönde bir telefonda, 90 veya 270 derece döndürebilirsiniz.

Kamera sensörü görüntü arabelleği ile için cihaz döndürme (sensör yönü derecelerine ek olarak) kamera önizlemesinin dik durmasına yardımcı olur.

Yön hesaplaması

Kamera önizlemesinin doğru yönü, sensörü dikkate alır cihaz yönünü ve cihaz döndürmeyi gösterir.

Sensör görüntüsü arabelleğinin genel dönüşü şu formülle başlayalım:

rotation = (sensorOrientationDegrees - deviceOrientationDegrees * sign + 360) % 360

Burada sign ön kamera için 1, arka kameralar için -1 şeklindedir.

Ön kameralarda resim arabelleği saat yönünün tersine döndürülür ( sensörün doğal yönü). Arka kameralarda sensör resim arabelleği saat yönünde döndürüldü.

deviceOrientationDegrees * sign + 360 ifadesi, cihaz rotasyonunu dönüştürür arka kameralar için saat yönünün tersine saat yönünün tersine (örneğin, saat yönünün tersine 270 dereceyi 90 dereceye dönüştürme). Modül işlemi, sonucu 360 derecenin altına ölçeklendirir (örneğin, 540 derece veya 180 derece olacak şekilde).

Farklı API'ler, cihaz rotasyonunu farklı şekilde bildirir:

  • Display#getRotation() cihazın saat yönünün tersine dönmesini sağlar (kullanıcının bulunduğu yerden görünür). Bu değer, yukarıdaki formüle olduğu gibi eklenir.
  • OrientationEventListener#onOrientationChanged() cihazın saat yönünde dönüşünü döndürür (kullanıcının bakış açısından). Yukarıdaki formülde kullanılacak değeri yok sayın.

Ön kameralar

Hem yatay yönde hem de sensörde kamera önizlemesi ve sensör
            sağ tarafta.
Şekil 2. Telefonu 90 dereceye çeviren kamera önizlemesi ve sensör yatay yönde.

Şekil 2'de kamera sensörü tarafından üretilen görüntü arabelleğini görebilirsiniz:

Yatay yönlü ve görüntü dik konumda olan kamera sensörü.

Sensörü ayarlamak için arabelleğin saat yönünün tersine 270 derece döndürülmesi gerekir yön (yukarıdaki Kamera yönü konusuna bakın):

Kamera sensörü, görüntü yan olacak şekilde dikey yönde döndürüldü,
            sağ üstte.

Daha sonra, arabellek saat yönünün tersine 90 derece daha döndürülür. cihazın yönünü de hesaba katarak kameranın yönünün doğru olmasını sağlayın. kamera önizlemesi:

Kamera sensörü resimle birlikte yatay yönde döndürüldü
            dik.

Burada, kamera sağa ve yatay yöne çevrilmiş halde gösterilmiştir:

Hem kamera önizlemesi hem de sensör yatay yönde ancak
            sensör ters dönmüş.
Şekil 3. Telefon 270 derece çevrilmiş halde kamera önizlemesi ve sensör (veya -90 derece) yatay yönde ayarlayın.

Resim arabelleğini burada görebilirsiniz:

Kamera sensörü, görüntü ters olacak şekilde yatay yönde döndürüldü
            aşağı tüketim.

Sensöre göre tampon, saat yönünün tersine 270 derece döndürülmelidir yön:

Görüntü yan, dikey yönde olarak derecelendirilen kamera sensörü
            tıklayın.

Daha sonra, arabellek saat yönünün tersine 270 derece daha döndürülür. cihaz döndürme:

Kamera sensörü resimle birlikte yatay yönde döndürüldü
            dik.

Arka kameralar

Arkaya bakan kameraların sensör yönü 90 derecedir (örn., arka tarafından görüntülenir). Kamera önizlemesinin yönünü değiştirirken sensör görüntüsü arabelleği, sensör dönüş miktarı kadar saat yönünde döndürülür yerine (ön kameralarda olduğu gibi saat yönünün tersine) döndürerek arabellek, cihaz döndürme miktarı kadar saat yönünün tersine döndürülür.

Hem kamera önizlemesi hem de sensör yatay yönde ancak
            sensör ters dönmüş.
Şekil 4. Arka kamerası yatay yönde olan telefon (270 veya -90 derece oldu).

Şekil 4'te kamera sensöründen gelen görüntü arabelleğini aşağıda görebilirsiniz:

Kamera sensörü, görüntü ters olacak şekilde yatay yönde döndürüldü
            aşağı tüketim.

Arabellek, sensörü ayarlamak için saat yönünde 90 derece döndürülmelidir yön:

Görüntü yan, dikey yönde olarak derecelendirilen kamera sensörü
            tıklayın.

Daha sonra arabellek, cihazı hesaba katmak için saat yönünün tersine 270 derece döndürülür rotasyon:

Kamera sensörü resimle birlikte yatay yönde döndürüldü
            dik.

En boy oranı

Ekran en boy oranı, cihaz yönü değiştiğinde ancak aynı zamanda katlanabilir ürünler, pencereler çoklu pencerede yeniden boyutlandırıldığında katlanabilir ve açılır ortamlarda ve uygulamaların ikincil ekranlarda ne zaman açıldığını gösterir.

Kamera sensörü görüntü tamponu, kullanıcı arayüzü olarak vizör kullanıcı arayüzü öğesinin yönü ve en boy oranı yönü dinamik olarak değiştirir (cihaz değişmeden veya değişmeden) Yön.

Yeni form faktörlerinde veya çoklu pencereli ya da çoklu görüntülü ortamlarda, Uygulama, kamera önizlemesinin cihazla aynı yöne sahip olduğunu varsayar (dikey veya yatay) önizlemenizin yönü yanlış veya ölçeklendirilmiş olabilir veya her ikisini birden kontrol edebilirsiniz.

Dikey kamera önizlemesi açılmış katlanmamış katlanabilir cihaz
            yanar.
Şekil 5. Katlanabilir cihazların dikey görünümden yatay görünüme geçişi en boy oranı ancak kamera sensörü dikey yönde kalıyor.

Şekil 5'te uygulama yanlışlıkla cihazın 90 derece döndürüldüğünü varsaymıştır derece saat yönünün tersine; Dolayısıyla uygulama, önizlemeyi aynı miktarda döndürdü.

Kamera önizleme dik ancak basılmış olan katlanmamış katlanabilir cihaz
            yanlış ölçeklendirmeden kaynaklanır.
Şekil 6. Katlanabilir cihazların dikey görünümden yatay görünüme geçişi en boy oranı ancak kamera sensörü dikey yönde kalıyor.

Şekil 6'da, uygulama görüntü arabelleğinin en boy oranını kamera önizleme kullanıcı arayüzünün yeni boyutlarına uyacak şekilde uygun şekilde ölçeklendirilmesini sağlamak öğesine dokunun.

Sabit yönlü kamera uygulamaları katlanabilir cihazlarda genellikle dizüstü bilgisayar gibi diğer büyük ekranlı cihazlar:

Dizüstü bilgisayarda kamera önizlemesi dik, uygulamanın kullanıcı arayüzü yan duruyor.
Şekil 7. Dizüstü bilgisayarda sabit yönlü dikey uygulama.

Şekil 7'de, uygulama yönü durduğu için kamera uygulamasının kullanıcı arayüzü yan yatmıştır. sadece dikey modda kullanılabilir. Vizör görüntüsü doğru yönde göre değişir.

İçe doğru dikey mod

Çoklu pencere modunu desteklemeyen kamera uygulamaları (resizeableActivity="false") ve yönlerine kısıtlama getirmek (screenOrientation="portrait") veya screenOrientation="landscape") büyük ekranlı cihazlarda dikey yönde yerleştirilebilir kamera önizlemesi.

Yalnızca dikey modda kullanılan dikey mod sinemaskoplar (içe aktarmalı) uygulamalar ekran en boy oranı yatay olsa bile yönlendirilir. Yalnızca yatay uygulamalar yatay yönde olsa da sinemaskop efektiyle ekranın en boy oranı dikey. Kamera resmi hizalanması için döndürüldü uygulamanın kullanıcı arayüzüyle, kamera önizlemesinin en boy oranına uyacak şekilde kırpılmış ve sonra önizlemeyi dolduracak şekilde ölçeklendirilir.

Kamera görüntüsünün en boy oranı olduğunda içe doğru dikey mod tetiklenir Sensör ile uygulamanın birincil etkinliğinin en boy oranı eşleşmiyor.

Dizüstü bilgisayarda uygun dikey yönde kamera önizlemesi ve uygulama kullanıcı arayüzü.
            Geniş önizleme resmi, dikey konuma sığacak şekilde ölçeklendirilir ve kırpılır
            Yön.
Şekil 8. Sabit yönlü dikey uygulama iç içe yerleştirilmiş dikey modda açık dizüstü bilgisayar.

Şekil 8'de yalnızca dikey kamera uygulaması, kullanıcı arayüzünü gösterecek şekilde döndürüldü. dizüstü bilgisayar ekranında dik durması gerekir. Uygulama, fark nedeniyle sinemaskop efektiyle %30'luk bir artışa dikkat edin. Kamera önizleme resmi, uygulamanın kullanıcı arayüzü döndürmesini dengelemek üzere döndürüldü ( dikey modda olacak şekilde) kırpılmış ve ölçeklenerek dikey yönde olduğundan görüş alanını küçültür.

Döndürün, kırpın, ölçeklendirin

Bir ekranda yalnızca dikey kamera uygulaması için içe doğru dikey mod çağrılıyor şuna dikkat edin:

Dizüstü bilgisayarda kamera önizlemesi dik, uygulamanın kullanıcı arayüzü yan duruyor.
Şekil 9. Dizüstü bilgisayarda sabit yönlü dikey uygulama.

Uygulama dikey yönde sinemaskopludur:

Uygulama dikey yöne döndürüldü ve sinemaskoplu hale getirildi. Resim:
            yukarıdan sağa doğru kaydırın.

Kamera görüntüsü 90 derece dönerek yeniden yönünün ayarlanması uygulama:

Sensör görüntüsü dik olacak şekilde 90 derece döndürüldü.

Resim, kamera önizlemesinin en boy oranına kadar kırpılır ve ardından önizlemeyi doldurun (görüş alanı küçültülür):

Kırpılmış kamera resmi, kamera önizlemesini dolduracak şekilde ölçeklendirildi.

Katlanabilir cihazlarda kamera sensörünün yönü dikey olabilir Ekranın en boy oranı yatayken:

Kamera önizlemesi ve uygulama kullanıcı arayüzü, geniş ve açılmış bir ekranın yan tarafına çevrildi.
Şekil 10. Yalnızca dikey kamera uygulamasının bulunduğu katlanmamış cihaz kamera sensörü ve ekranın farklı en boy oranları.

Kamera önizlemesi, sensör yönünü ayarlamak için döndürüldüğünden, Resim vizörde doğru şekilde ayarlı, ancak yalnızca dikey modda yan yanadır.

Inset dikey mod, yalnızca uygulamanın sinemaskop moduna dikey yönde ayarlanmasını gerektirir uygulamanın ve kamera önizlemesinin yönünü doğru şekilde ayarlamak için:

Kamera önizlemeli dikey yönde sinemaskoplu uygulama
            katlanabilir cihaz üzerinde tam dik durması gerekir.

API

Android 12 (API düzeyi 31) sürümünden itibaren uygulamalar, dikey dikey ayarı açıkça kontrol edebilir. modlarında SCALER_ROTATE_AND_CROP CaptureRequest mülkü sınıfını kullanır.

Varsayılan değer: SCALER_ROTATE_AND_CROP_AUTO Bu, sistemin içe doğru dikey modu çağırmasını sağlar. SCALER_ROTATE_AND_CROP_90 yukarıda açıklandığı gibi, içe doğru dikey modun davranışıdır.

Bazı cihazlar bazı SCALER_ROTATE_AND_CROP değerlerini desteklemez. Liste almak için değerleri girin, referans CameraCharacteristics#SCALER_AVAILABLE_ROTATE_AND_CROP_MODES.

KameraX

Jetpack CameraX kitaplığı sensör yönünü ve çerçeveyi barındıran bir kamera vizörü oluşturmayı çok basit bir görevdir.

PreviewView düzen öğesi kamera önizlemesi oluşturur ve sensör yönünü otomatik olarak ayarlar. cihaz döndürme ve ölçeklendirme. PreviewView, otomatik fotoğraf makinesi resmi FILL_CENTER ölçek türü, resmi ortalayan ancak boyutlarla eşleşecek şekilde kırpabilen ölçek türü PreviewView. Kamera resmini sinemaskop yapmak için ölçek türünü şuna ayarlayın: FIT_CENTER.

PreviewView ile kamera önizlemesi oluşturmayla ilgili temel bilgileri öğrenmek için bkz. Önizleme uygulama.

Eksiksiz bir örnek uygulama için CameraXBasic kod deposunu ziyaret edin.

KameraVizörü

Önizleme kullanım alanına benzer şekilde, KameraVizörü kitaplığı, kamera önizlemesinin oluşturulmasını kolaylaştıran bir dizi araç sunar. CameraX Core'a bağlı olmadığı için kameranızı kullanarak sorunsuz bir şekilde entegre edebilirsiniz. mevcut Kamera2 kod tabanı.

Bunun yerine Surface doğrudan isterseniz CameraViewfinder widget'ını kullanabilirsiniz.

CameraViewfinder, dahili olarak bir TextureView veya SurfaceView kullanıyor görüntüler ve gerekli dönüşümleri bunlara uygular. vizörü doğru şekilde görüntülemenizi sağlar. Bu işlem, öğelerin en boy oranını, ölçeğini ve döndürmesini düzeltmeyi içerir.

CameraViewfinder nesnesinden yüzey isteğinde bulunmak için şunları yapmanız gerekir: ViewfinderSurfaceRequest oluşturun.

Bu istek, yüzey çözünürlüğü ve kamera cihazı ile ilgili koşullar içeriyor. CameraCharacteristics tarafından sağlanan bilgiler.

requestSurfaceAsync() aranıyor isteği yüzey sağlayıcıya (TextureView veya ) gönderir. SurfaceView ve Surface/ListenableFuture alır.

markSurfaceSafeToRelease() aranıyor yüzey sağlayıcıya, yüzeyin gerekli olmadığını ve ilgili yüzeyin gerekli olmadığını bildirirse kaynaklar serbest bırakılabilir.

Kotlin


fun startCamera(){
    val previewResolution = Size(width, height)
    val viewfinderSurfaceRequest =
        ViewfinderSurfaceRequest(previewResolution, characteristics)
    val surfaceListenableFuture =
        cameraViewfinder.requestSurfaceAsync(viewfinderSurfaceRequest)

    Futures.addCallback(surfaceListenableFuture, object : FutureCallback<Surface> {
        override fun onSuccess(surface: Surface) {
            /* create a CaptureSession using this surface as usual */
        }
        override fun onFailure(t: Throwable) { /* something went wrong */}
    }, ContextCompat.getMainExecutor(context))
}

Java


    void startCamera(){
        Size previewResolution = new Size(width, height);
        ViewfinderSurfaceRequest viewfinderSurfaceRequest =
                new ViewfinderSurfaceRequest(previewResolution, characteristics);
        ListenableFuture<Surface> surfaceListenableFuture =
                cameraViewfinder.requestSurfaceAsync(viewfinderSurfaceRequest);

        Futures.addCallback(surfaceListenableFuture, new FutureCallback<Surface>() {
            @Override
            public void onSuccess(Surface result) {
                /* create a CaptureSession using this surface as usual */
            }
            @Override public void onFailure(Throwable t) { /* something went wrong */}
        },  ContextCompat.getMainExecutor(context));
    }

SurfaceView

SurfaceView bir önizlemenin düzgün çalışmaması durumunda kamera önizlemesi işlem gerektirmesi ve animasyonlu olmamalıdır.

SurfaceView, kamera sensörü görüntü arabelleğini eşleşecek şekilde otomatik olarak döndürür Ekran yönü (hem sensör yönünü hem de cihazı hesaba katarak) sağlayabilir. Ancak resim arabelleği, SurfaceView aralığına sığacak şekilde ölçeklendirilir boyutları nasıl oluşturacağınızı düşünün.

Resim arabelleğinin en boy oranının, en boy oranıyla eşleştiğinden emin olmalısınız. İçeriği ölçeklendirerek elde edebileceğiniz SurfaceView oranı bileşeninin SurfaceView içindeki onMeasure() yöntem:

(computeRelativeRotation() kaynak kodu Aşağıdaki Göreli rotasyon.)

Kotlin

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
    val width = MeasureSpec.getSize(widthMeasureSpec)
    val height = MeasureSpec.getSize(heightMeasureSpec)

    val relativeRotation = computeRelativeRotation(characteristics, surfaceRotationDegrees)

    if (previewWidth > 0f && previewHeight > 0f) {
        /* Scale factor required to scale the preview to its original size on the x-axis. */
        val scaleX =
            if (relativeRotation % 180 == 0) {
                width.toFloat() / previewWidth
            } else {
                width.toFloat() / previewHeight
            }
        /* Scale factor required to scale the preview to its original size on the y-axis. */
        val scaleY =
            if (relativeRotation % 180 == 0) {
                height.toFloat() / previewHeight
            } else {
                height.toFloat() / previewWidth
            }

        /* Scale factor required to fit the preview to the SurfaceView size. */
        val finalScale = min(scaleX, scaleY)

        setScaleX(1 / scaleX * finalScale)
        setScaleY(1 / scaleY * finalScale)
    }
    setMeasuredDimension(width, height)
}

Java

@Override
void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);

    int relativeRotation = computeRelativeRotation(characteristics, surfaceRotationDegrees);

    if (previewWidth > 0f && previewHeight > 0f) {

        /* Scale factor required to scale the preview to its original size on the x-axis. */
        float scaleX = (relativeRotation % 180 == 0)
                       ? (float) width / previewWidth
                       : (float) width / previewHeight;

        /* Scale factor required to scale the preview to its original size on the y-axis. */
        float scaleY = (relativeRotation % 180 == 0)
                       ? (float) height / previewHeight
                       : (float) height / previewWidth;

        /* Scale factor required to fit the preview to the SurfaceView size. */
        float finalScale = Math.min(scaleX, scaleY);

        setScaleX(1 / scaleX * finalScale);
        setScaleY(1 / scaleY * finalScale);
    }
    setMeasuredDimension(width, height);
}

Kamera önizlemesi olarak SurfaceView uygulama hakkında daha fazla bilgi için bkz. Kamera yönleri.

Doku Görünümü

TextureView şundan daha düşük performans gösteriyor: SurfaceView (ve daha fazla iş) ama TextureView maksimum verim almanızı sağlar kontrol edebilirsiniz.

TextureView, sensör görüntüsü arabelleğini sensör yönüne göre döndürür ancak cihaz döndürme veya önizleme ölçeklendirmesi işlemlerini yapmaz.

Ölçeklendirme ve döndürme, Matris dönüşümü. Nasıl yapıldığını öğrenmek için bir TextureView öğesinin doğru şekilde ölçeklenmesini ve döndürülmesini sağlamak için Kamera uygulamanızda yeniden boyutlandırılabilir yüzeyleri destekleme

Göreli döndürme

Kamera sensörünün bağıl dönüşü, bir hareketi yapmak için gereken dönüş kamera sensörü çıkışını cihazın yönüyle aynı hizaya getirin.

Göreli rotasyon SurfaceView ve TextureView gibi bileşenler tarafından kullanılır kullanarak önizleme resmine ilişkin x ve y ölçeklendirme faktörlerini belirler. Ayrıca şu amaçlarla da kullanılır: sensör görüntüsü arabelleğinin dönüşünü belirtin.

İlgili içeriği oluşturmak için kullanılan CameraCharacteristics ve Surface sınıf, kamera sensörünün göreli dönüşü:

Kotlin

/**
 * Computes rotation required to transform the camera sensor output orientation to the
 * device's current orientation in degrees.
 *
 * @param characteristics The CameraCharacteristics to query for the sensor orientation.
 * @param surfaceRotationDegrees The current device orientation as a Surface constant.
 * @return Relative rotation of the camera sensor output.
 */
public fun computeRelativeRotation(
    characteristics: CameraCharacteristics,
    surfaceRotationDegrees: Int
): Int {
    val sensorOrientationDegrees =
        characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)!!

    // Reverse device orientation for back-facing cameras.
    val sign = if (characteristics.get(CameraCharacteristics.LENS_FACING) ==
        CameraCharacteristics.LENS_FACING_FRONT
    ) 1 else -1

    // Calculate desired orientation relative to camera orientation to make
    // the image upright relative to the device orientation.
    return (sensorOrientationDegrees - surfaceRotationDegrees * sign + 360) % 360
}

Java

/**
 * Computes rotation required to transform the camera sensor output orientation to the
 * device's current orientation in degrees.
 *
 * @param characteristics The CameraCharacteristics to query for the sensor orientation.
 * @param surfaceRotationDegrees The current device orientation as a Surface constant.
 * @return Relative rotation of the camera sensor output.
 */
public int computeRelativeRotation(
    CameraCharacteristics characteristics,
    int surfaceRotationDegrees
){
    Integer sensorOrientationDegrees =
        characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);

    // Reverse device orientation for back-facing cameras.
    int sign = characteristics.get(CameraCharacteristics.LENS_FACING) ==
        CameraCharacteristics.LENS_FACING_FRONT ? 1 : -1;

    // Calculate desired orientation relative to camera orientation to make
    // the image upright relative to the device orientation.
    return (sensorOrientationDegrees - surfaceRotationDegrees * sign + 360) % 360;
}

Aralık metrikleri

Kameranın boyutlarını belirlemek için ekran boyutu kullanılmamalıdır vizör kamera uygulaması ekranın bir kısmında çalışıyor olabilir. çoklu pencere modunda veya ChromeOS'te serbest modda kullanılabilir.

WindowManager#getCurrentWindowMetrics() (API düzeyi 30'da eklenir), ekranın boyutu. Jetpack WindowManager kitaplığı yöntemleri WindowMetricsCalculator#computeCurrentWindowMetrics() ve WindowInfoTracker#currentWindowMetrics() API düzeyi 14'e geriye dönük uyumlulukla benzer bir destek sağlar.

180 derece döndürme

Bir cihazın 180 derece döndürülmesi (örneğin, doğal yönden doğal yönü ters çevirse de) onConfigurationChanged() geri arama. Bu nedenle kamera önizlemesi ters dönebilir.

180 derecelik bir dönüşü algılamak için DisplayListener ve bir çağrı ile cihazın dönüşünü kontrol edin. Display#getRotation() onDisplayChanged() geri arama.

Özel kaynaklar

Android 10'dan önce, çoklu pencerede yalnızca en üstte görünen etkinlik ortam RESUMED durumundaydı. Kullanıcılar açısından kafa karıştırıcıydı. sistem, hangi etkinliğin devam ettirildiğine dair hiçbir gösterge sağlamadı.

Android 10 (API düzeyi 29), tüm görünür etkinliklerin olduğu çoklu devam ettirmeyi kullanıma sundu RESUMED durumunda. Görünür etkinlikler yine de PAUSED içine girebilir Bu durumda, örneğin, şeffaf bir etkinlik bu etkinliğin bu etkinlik, pencere içinde pencere modundaki gibi odaklanılamıyorsa (bkz. Pencere içinde pencere desteği).

kamera, mikrofon ya da başka herhangi bir özel veya API düzeyi 29 veya üst kısmındaki tekli kaynağı, çoklu devam ettirmeyi desteklemelidir. Örneğin, Örneğin, devam ettirilen üç etkinlik kamerayı kullanmak istediğinde bunlardan yalnızca biri bu özel kaynağa erişin. Her etkinlik bir onDisconnected() daha yüksek bir öncelik düzeyiyle kameraya önleme amaçlı erişim konusunda bilgi almak için geri çağırma etkinliği'ne dokunun.

Daha fazla bilgi için bkz. Çoklu devam ettirme.

Ek kaynaklar