Kamera önizleme

Not: Bu sayfada Camera2 paketi ele alınmaktadır. 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ın ve kamera önizlemelerinin Android'de her zaman aynı yönde olması gerekmez cihazlar.

Kamera, cihazın telefon, tablet veya bilgisayar olması fark etmeksizin cihazda sabit bir konumdadır. Cihaz yönü değiştiğinde kamera yönü de değişir.

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 konuma döndürüldüğünde kamera önizlemesinin genişliğinin yüksekliğinden daha fazla olması beklenir.

Ancak katlanabilir cihaz (ör. katlanabilir cihaz) gibi yeni form faktörleri, bu varsayımları çürütmektedir. cihaz, ve görüntüleme modları, çoklu pencere ve çoklu ekran. Katlanabilir cihazlar, yönü değiştirmeden ekran boyutunu ve en boy oranını değiştirir. Çoklu pencere modu, kamera uygulamalarını ekranın bir bölümüne kısıtlayarak kamera önizlemesini cihaz yöneliminden bağımsız olarak ölçeklendirir. Ç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ü

Android Uyumluluk Tanımı, kamera görüntü sensörünün "kameranın uzun boyutunun ekranın uzun boyutuyla hizalanacak şekilde yönlendirilmesi ZORUNLUDUR" şeklinde belirtir. 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, Android Uyumluluk Tanımı'na uymak için ön kameranın (ekranla aynı yönde bakan kamera) sensörü telefona göre 270 derece döndürülmüştür.

Sensör dönüşünü uygulamalara göstermek için camera2 API'si bir SENSOR_ORIENTATION sabittir. Çoğu telefon ve tablette cihaz, ön kameralar için 270 derece, arka kameralar için ise 90 derece (cihazın arkasından bakış açısı) sensör yönelimi bildirir. Bu sayede sensörün uzun kenarı cihazın uzun kenarıyla hizalanır. Dizüstü kameralar genellikle sensör yönü 0 veya 180 derece olmalıdır.

Kamera görüntü sensörleri verilerini (görüntü arabelleği) sensörün doğal yöneliminde (yatay) yayınladığından, kamera önizlemesinin cihazın doğal yöneliminde dik görünmesi için görüntü arabelleğinin SENSOR_ORIENTATION tarafından belirtilen derece sayısı kadar döndürülmesi gerekir. Ön kameralarda saat yönünün tersine, arka kameralarda ise saat yönünde döner.

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

Kamera sensörü, resim yatay şekilde sol üstte olacak şekilde yatay yöne döndürülmüş.

Önizlemenin yönü cihaz yönüyle eşleşecek şekilde resim 270 derece saat yönünün tersine döndürülmelidir:

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

Arka kamera, aynı yöne sahip 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ın dönme açısı, cihazın doğal yöneliminden kaç derece döndürüldüğüdür. Örneğin, yatay yönde olan bir telefonun cihaz döndürme açısı, döndürme yönüne bağlı olarak 90 veya 270 derecedir.

Kamera sensörü görüntü tamponu 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 kameralar için 1, arka kameralar için -1 değerini alır.

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

deviceOrientationDegrees * sign + 360 ifadesi, arkaya bakan kameralar için cihaz dönüşünü saat yönünün tersinden saat yönünde dönüştürür (örneğin, 270 derece saat yönünün tersini 90 derece saat yönünde dönüştürür). Modülüs işlemi, sonucu 360 dereceden az olacak şekilde ölçeklendirir (örneğin, 540 derecelik bir dönüşümü 180 dereceye ölçeklendirir).

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

  • Display#getRotation(), cihazın saat yönünün tersine dönmesini sağlar (kullanıcı açısından). Bu değer, yukarıdaki formülde olduğu gibi kullanılır.
  • 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önde kamera sensörü ve dikey görüntü.

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.

Ardından, cihazın dönüşünü hesaba katmak için arabellek saat yönünün tersine 90 derece daha döndürülür. Bu işlem, 2. resimde kamera önizlemesinin doğru yönde gösterilmesini sağlar:

Kamera sensörü, resim dikken yatay yönde döndürülmüş.

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ü, resim baş aşağı olacak şekilde yatay yöne döndürülmüş.

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ü, resim dikken yatay yönde döndürülmüş.

Arka kameralar

Arkaya bakan kameraların sensör yönü 90 derecedir (örn., arka tarafından görüntülenir). Kamera önizlemesi yönlendirilirken sensör görüntü arabelleği, sensör dönme miktarı kadar saat yönünde döndürülür (ön kameralarda olduğu gibi saat yönünün tersine değil) ve ardından görüntü arabelleği, cihaz dönme miktarı kadar saat yönünün tersine döndürülür.

Kamera önizlemesi ve sensör yatay yönde ancak sensör baş aşağı.
Ş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ği gösterilmektedir:

Kamera sensörü, resim baş aşağı olacak şekilde yatay yöne döndürülmüş.

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

Görüntü yan yatmış, 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ü, resim dikken yatay yönde döndürülmüş.

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 çok pencereli ya da çok ekranlı ortamlarda uygulamanız, kamera önizlemesinin cihazla aynı yönde (dikey veya yatay) olduğunu varsayar. Bu durumda önizlemeniz yanlış yönde veya yanlış ölçekte olabilir ya da her ikisi de olabilir.

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 cihaz dikey en boy oranındayken yatay en boy oranına geçiyor ancak kamera sensörü dikey yönde kalıyor.

6. resimde, uygulama, kamera önizleme kullanıcı arayüzü öğesinin yeni boyutlarına sığacak şekilde uygun şekilde ölçeklendirilmesini sağlamak için resim arabelleğinin en boy oranını ayarlamadı.

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önde dikey uygulama.

Şekil 7'de, uygulamanın yönü yalnızca dikey olarak kısıtlandığı için kamera uygulamasının kullanıcı arayüzü yan yanadır. Vizör resmi, kamera sensörüne göre doğru yöndedir.

Dikey modda içe yerleştirilmiş resim

Çoklu pencere modunu desteklemeyen (resizeableActivity="false") ve yönlerini kısıtlayan (screenOrientation="portrait" veya screenOrientation="landscape") kamera uygulamaları, kamera önizlemesini düzgün şekilde yönlendirmek için büyük ekranlı cihazlarda içe yerleştirilmiş dikey modda yerleştirilebilir.

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 görüntüsü, uygulama kullanıcı arayüzüyle hizalanacak şekilde döndürülür, kamera önizlemesinin en boy oranıyla eşleşecek şekilde kırpılır ve ardından ö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. Dizüstü bilgisayarda, dikey modda sabit yönlü dikey uygulama.

Şekil 8'de, yalnızca dikey kamera uygulaması, kullanıcı arayüzünü dizüstü bilgisayar ekranında dik olarak gösterecek şekilde döndürülmüştür. Uygulama, fark nedeniyle sinemaskop efektiyle %30'luk bir artışa dikkat edin. Kamera önizleme resmi, uygulamanın kullanıcı arayüzü dönüşümünü (yerleştirilmiş dikey mod nedeniyle) telafi etmek için döndürülmüş ve resim, dikey yönde sığacak şekilde kırpılıp ölçeklendirilerek görüş alanı azaltılmıştı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 sinemaskop modunda:

Uygulama dikey yöne döndürülmüş ve sinemaskop biçimindedir. 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 göre kırpılır ve ardından önizlemeyi dolduracak şekilde ölçeklendirilir (görüş alanı azaltılır):

Kamera önizlemesini dolduracak şekilde ölçeklendirilmiş kırpılmış kamera görüntüsü.

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

Geniş, katlanmamış ekranda kamera önizlemesi ve uygulama kullanıcı arayüzü yan yana döndürülmüş.
Şekil 10. Yalnızca dikey kamera uygulamasına sahip ve kamera sensörü ile ekranın farklı en boy oranlarına sahip katlanmış cihaz.

Kamera önizlemesi, sensör yönüne göre ayarlanacak şekilde döndürüldüğünden görüntü vizörde doğru yöndedir ancak yalnızca dikey uygulama yan yanadır.

Uygulamayı ve kamera önizlemesini doğru yönde göstermek için dikey modda uygulamanın yalnızca dikey yönde kenarlıklandırılması gerekir:

Katlanabilir cihazda kamera önizlemesi dikey olarak gösterilirken dikey modda, kenarlıklı uygulama.

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'dir. Bu değer, sistemin içe yerleştirilmiş dikey modu çağırmasını sağlar. SCALER_ROTATE_AND_CROP_90, yukarıda açıklandığı şekilde, yatay dikey modun davranışıdır.

Tüm cihazlar tüm SCALER_ROTATE_AND_CROP değerlerini desteklemez. Desteklenen değerlerin listesini görmek için CameraCharacteristics#SCALER_AVAILABLE_ROTATE_AND_CROP_MODES sayfasına bakın.

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 sayfa düzeni öğesi, sensör yönü, cihaz döndürme ve ölçeklendirme için otomatik olarak ayarlanarak kamera önizlemesi oluşturur. PreviewView, FILL_CENTER ölçek türünü uygulayarak kamera görüntüsünün en boy oranını korur. Bu ölçek türü, resmi ortalar ancak PreviewView'ün boyutlarına uyacak şekilde kırpabilir. 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.

Tam bir örnek uygulama için GitHub'daki CameraXBasic deposuna bakın.

CameraViewfinder

Ö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ığından mevcut Camera2 kod tabanınıza sorunsuz bir şekilde entegre edebilirsiniz.

Doğrudan Surface yerine, Camera2 için kamera feed'ini görüntülemek üzere 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, en boy oranlarını, ölçeklerini ve döndürmelerini düzeltmeyi içerir.

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

Bu istek, CameraCharacteristics'ten gelen yüzey çözünürlüğü ve kamera cihazı bilgileriyle ilgili koşulları içerir.

requestSurfaceAsync() çağrısı, isteği TextureView veya SurfaceView olan yüzey sağlayıcısına gönderir ve Surface ListenableFuture alır.

markSurfaceSafeToRelease() çağrısı, yüzey sağlayıcıya yüzeye ihtiyaç olmadığını ve ilgili kaynakların serbest bırakılabileceğini bildirir.

KotlinJava
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))
}
    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, hem sensör yönünü hem de cihaz dönüşünü hesaba katarak kamera sensör görüntü arabelleğini ekran yönüne uyacak şekilde otomatik olarak döndürür. Ancak resim arabelleği, en boy oranı dikkate alınmadan SurfaceViewboyutlarına sığacak şekilde ölçeklenir.

Resim arabelleğinin en boy oranının SurfaceView öğesinin en boy oranıyla eşleştiğinden emin olmanız gerekir. Bunu, bileşenin onMeasure() yönteminde SurfaceView öğesinin içeriğini ölçeklendirerek yapabilirsiniz:

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

KotlinJava
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)
}
@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);
}

SurfaceView öğesini kamera önizlemesi olarak uygulama hakkında daha fazla bilgi için Kamera yönleri bölümüne bakın.

Doku Görünümü

TextureView, SurfaceView'a kıyasla daha düşük performans gösterir ve daha fazla iş gerektirir ancak kamera önizlemesi üzerinde maksimum kontrol sağlar.

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

Ölçeklendirme ve döndürme, Matris dönüşümünde kodlanabilir. TextureView öğelerini nasıl doğru şekilde ölçeklendireceğinizi ve döndüreceğinizi öğrenmek için Kamera uygulamanızda ölçeklenebilir yüzeyleri destekleme başlıklı makaleyi inceleyin.

Göreli rotasyon

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üşü:

KotlinJava
/**
 * 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
}
/**
 * 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 sunar.

180 derece döndürme

Cihazın 180 derece döndürülmesi (ör. doğal yöndeyken ters doğal yönde döndürülmesi) onConfigurationChanged() geri çağırma işlevini tetiklemez. Bu nedenle, kamera önizlemesi baş aşağı olabilir.

180 derece dönmeyi algılamak için bir DisplayListener uygulayın ve onDisplayChanged() geri çağırma işlevinde Display#getRotation() çağrısı yaparak cihazın dönme durumunu kontrol edin.

Özel kaynaklar

Android 10'dan önce, yalnızca çok pencereli ortamda en üstte görünen etkinlik 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, örneğin etkinliğin üzerinde şeffaf bir etkinlik varsa veya etkinlik, pencere içinde pencere modunda olduğu gibi odaklanılabilir durumda değilse PAUSED durumuna girebilir (Pencere içinde pencere desteği bölümüne bakın).

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, devam ettirilen üç etkinlik kamerayı kullanmak istiyorsa bu özel kaynağa yalnızca biri erişebilir. Her etkinlik, daha yüksek öncelikli bir etkinlik tarafından kameraya öncelikli erişim sağlandığından haberdar olmak için bir onDisconnected() geri çağırma işlevi uygulamalıdır.

Daha fazla bilgi için Çoklu devam ettirme başlıklı makaleyi inceleyin.

Ek kaynaklar