Yapılandırma seçenekleri

Her CameraX kullanım alanını, kullanımın farklı yönlerini kontrol edecek şekilde yapılandırırsınız üzerine konuşacağız.

Örneğin, görüntü yakalama için hedef en boy oranı ayarlayabilirsiniz. bir de flaş modu var. Aşağıdaki kodda bir örnek gösterilmektedir:

Kotlin

val imageCapture = ImageCapture.Builder()
    .setFlashMode(...)
    .setTargetAspectRatio(...)
    .build()

Java

ImageCapture imageCapture =
    new ImageCapture.Builder()
        .setFlashMode(...)
        .setTargetAspectRatio(...)
        .build();

Bazı kullanım alanlarında, yapılandırma seçeneklerine ek olarak API'ler dinamik olarak Kullanım alanı oluşturulduktan sonra ayarları değiştirmeye çalışıyor. Daha fazla bilgi için özel kullanım alanlarına özel yapılandırma ile ilgili daha fazla bilgi edinmek için önizleme, Analiz etme images ve Resim yakalama.

CameraXConfig

Kolaylık sağlaması açısından CameraX'te dahili operatörler gibi varsayılan yapılandırmalar bulunur. uygun olan yeni ve işleyiciler hakkında daha fazla bilgi edinebilirsiniz. Ancak, uygulamanın özel gereksinimleri varsa veya bunları özelleştirmeyi tercih ediyorsa yapılandırmalar, CameraXConfig arayüz bu amaca yönelik.

CameraXConfig ile bir uygulama şunları yapabilir:

Kullanım Modeli

Aşağıdaki prosedürde CameraXConfig özelliğinin nasıl kullanılacağı açıklanmaktadır:

  1. Özelleştirilmiş yapılandırmalarınızla bir CameraXConfig nesnesi oluşturun.
  2. Şunu uygulayın: CameraXConfig.Provider Application uygulamasındaki arayüz ve CameraXConfig nesnenizi şurada döndürün: getCameraXConfig()
  3. Application sınıfınızı AndroidManifest.xml dosyanıza şu şekilde ekleyin: burada açıklanmıştır.

Örneğin, aşağıdaki kod örneğinde CameraX günlük kaydı hata ile yalnızca mesajlar:

Kotlin

class CameraApplication : Application(), CameraXConfig.Provider {
   override fun getCameraXConfig(): CameraXConfig {
       return CameraXConfig.Builder.fromConfig(Camera2Config.defaultConfig())
           .setMinimumLoggingLevel(Log.ERROR).build()
   }
}

Uygulamanızın şunları yapması gerekiyorsa CameraXConfig nesnesinin yerel bir kopyasını saklayın kameraX yapılandırmasını öğrenemez.

Kamera sınırlayıcı

İlk çağrı sırasında ProcessCameraProvider.getInstance() CameraX, olanak tanır. KameraX'in, donanım bileşenleriyle iletişim kurması gerektiğinden bu kameralar çok fazla zaman alabilir. Özellikle de masaüstünde, düşük teknolojiye sahip cihazlar. Uygulamanız yalnızca cihazdaki belirli kameraları kullanıyorsa kamera X'i diğer kameraları yoksayacak şekilde ayarlayabilirsiniz, Bu, uygulamanızın kullandığı kameraların başlatma gecikmesini azaltabilir.

CameraSelector geçerse - CameraXConfig.Builder.setAvailableCamerasLimiter() kamerayı filtreler. CameraX, kamera yokmuş gibi davranır. Örneğin, Örneğin, aşağıdaki kod, uygulamayı yalnızca cihazın varsayılan arka kamera:

Kotlin

class MainApplication : Application(), CameraXConfig.Provider {
   override fun getCameraXConfig(): CameraXConfig {
       return CameraXConfig.Builder.fromConfig(Camera2Config.defaultConfig())
              .setAvailableCamerasLimiter(CameraSelector.DEFAULT_BACK_CAMERA)
              .build()
   }
}

Mesaj dizileri

CameraX'in oluşturulduğu platform API'lerinin çoğu, engelleme gerektirir donanımla işlemler arası iletişim (IPC) kalan süreyi ifade eder. Bu nedenle CameraX, bu API'leri yalnızca ana iş parçacığının engellenmemesi ve kullanıcı arayüzünün sıvı halde kalır. CameraX bu arka plan ileti dizilerini dahili olarak yönetir, böylece bu şeffaf görünür. Ancak, bazı uygulamalar için ileti dizisi. CameraXConfig, uygulamaların arka plan ileti dizilerini ayarlamasına izin verir ve kampanya ekipleri gibi CameraXConfig.Builder.setCameraExecutor() ve CameraXConfig.Builder.setSchedulerHandler().

Kamera Yürütücü

Kamera yürütücü, tüm dahili Kamera platformu API çağrıları için de kullanılır. . CameraX, dahili bir Bu görevleri gerçekleştirmek için Executor. Ancak, uygulamanız iş parçacıkları üzerinde daha sıkı denetim gerektiriyorsa CameraXConfig.Builder.setCameraExecutor()

Planlayıcı İşleyici

Planlayıcı işleyici, dahili görevleri sabit aralıklarla planlamak için kullanılır. örneğin kamerayı kullanılamıyorsa yeniden açmayı deneyin. Bu işleyici şunları yapar: görevleri yürütmez ve yalnızca kamera yürütücüye gönderir. Aynı zamanda bazen yeni bir API gerektiren eski API platformlarında Geri aramalar için Handler. Böyle durumlarda geri çağırmalar yine yalnızca doğrudan kamera yürütücüye gönderilir. KameraX dahili bir raporu tahsis eder Bu görevleri gerçekleştirmek için HandlerThread, ancak CameraXConfig.Builder.setSchedulerHandler() ile geçersiz kılabilirsiniz.

Günlük kaydı

CameraX günlüğü, uygulamaların logcat mesajlarını filtrelemesine olanak tanır. ve üretim kodunuzda ayrıntılı mesajlardan kaçınmak için alıştırma yapın. CameraX desteği en ayrıntılıdan en şiddetliye doğru dört günlük kaydı düzeyi:

  • Log.DEBUG (varsayılan)
  • Log.INFO
  • Log.WARN
  • Log.ERROR

Android Günlüğü dokümanlarına bakın sayfasını ziyaret edin. Tekliflerinizi otomatikleştirmek ve optimize etmek için CameraXConfig.Builder.setMinimumLoggingLevel(int) kullanarak uygulamanız için uygun günlük kaydı düzeyini ayarlayabilirsiniz.

Otomatik seçim

CameraX, otomatik olarak cihaza özgü işlevleri çalışır. Örneğin, CameraX, makine öğreniminin bir çözünürlük belirtmezseniz veya çözünürlüğü desteklenmediğini doğrulayın. Tüm bunlar kitaplık tarafından işlenir ve cihaza özel kod yazmanız gerekir.

CameraX'in amacı bir kamera oturumunu başarıyla başlatmaktır. Bunun anlamı şudur: CameraX, cihaz kapasitesine dayalı olarak çözünürlük ve en boy oranlarından ödün verir. Güvenlik ihlali şu nedenlerle gerçekleşebilir:

  • Cihaz, istenen çözünürlüğü desteklemiyor.
  • Cihazda, düzgün şekilde çalışmasını sağlamalısınız.
  • Bazı cihazlarda belirli biçimler yalnızca belirli özelliklerde kullanılabilir oranları vardır.
  • Cihazda "en yakın mod16" tercihi var JPEG veya video için kullanır. Daha fazla bilgi için bkz. SCALER_STREAM_CONFIGURATION_MAP.

CameraX, oturumu oluşturup yönetse de her zaman resim boyutlarını kodunuzda döndürdüğünüzden emin olun ve buna göre ayarlamalar yapın.

Döndürme

Varsayılan olarak kamera dönüşü, varsayılan ekranın dönüşüne uyacak şekilde ayarlanır oluşturmaya karar verdi. Bu varsayılan durumda CameraX ve uygulamanın Google Görüntülü Reklam Ağı'nda görmeyi beklediğinizle eşleşmesini önizle. Çoklu ekranı desteklemek için rotasyonu özel bir değere ayarlayabilirsiniz. kullanım alanını yapılandırırken mevcut ekran yönünü aktararak cihazlar nesneleri veya dinamik olarak nesneleri oluşturulur.

Uygulamanız, yapılandırma ayarlarını kullanarak hedef rotasyonu ayarlayabilir. Bu durumda kullanım alanı API'lerindeki yöntemleri (ör. ImageAnalysis.setTargetRotation()), çalışması mümkün olacaktır. Bu adımı, uygulamadaki cihaz dikey moda kilitlendi. Dolayısıyla Ancak fotoğrafın veya analiz kullanım alanının bunları dikkate alması gerekir. geçerli dönmesini sağlar. Örneğin, rotasyon farkındalığı o zaman yüzler, yüz algılama için doğru şekilde yönlendirilmiş veya fotoğraflar yatay olarak ayarlanmış veya dikey.

Çekilen görüntülere ait veriler, döndürme bilgileri olmadan saklanabilir. EXIF verileri galeri uygulamalarının resmi gösterebilmesi için döndürme bilgileri içerir doğru yönde ayarlayın.

Önizleme verilerini doğru yönde görüntülemek için meta verileri kullanabilirsiniz çıkış kaynağı Preview.PreviewOutput() oluşturmak için de kullanılabilir.

Aşağıdaki kod örneğinde, bir yön etkinliğinde döndürmenin nasıl ayarlanacağı gösterilmektedir:

Kotlin

override fun onCreate() {
    val imageCapture = ImageCapture.Builder().build()

    val orientationEventListener = object : OrientationEventListener(this as Context) {
        override fun onOrientationChanged(orientation : Int) {
            // Monitors orientation values to determine the target rotation value
            val rotation : Int = when (orientation) {
                in 45..134 -> Surface.ROTATION_270
                in 135..224 -> Surface.ROTATION_180
                in 225..314 -> Surface.ROTATION_90
                else -> Surface.ROTATION_0
            }

            imageCapture.targetRotation = rotation
        }
    }
    orientationEventListener.enable()
}

Java

@Override
public void onCreate() {
    ImageCapture imageCapture = new ImageCapture.Builder().build();

    OrientationEventListener orientationEventListener = new OrientationEventListener((Context)this) {
       @Override
       public void onOrientationChanged(int orientation) {
           int rotation;

           // Monitors orientation values to determine the target rotation value
           if (orientation >= 45 && orientation < 135) {
               rotation = Surface.ROTATION_270;
           } else if (orientation >= 135 && orientation < 225) {
               rotation = Surface.ROTATION_180;
           } else if (orientation >= 225 && orientation < 315) {
               rotation = Surface.ROTATION_90;
           } else {
               rotation = Surface.ROTATION_0;
           }

           imageCapture.setTargetRotation(rotation);
       }
    };

    orientationEventListener.enable();
}

Ayarlanan rotasyona bağlı olarak her kullanım alanı resim verilerini döndürür doğrudan veya döndürülmemiş resmin tüketicilerine rotasyon meta verisi sağlar dışı verilerdir.

  • Önizleme: Meta veri çıkışı, hedefin rotasyonunun bilinen bir hata ise Preview.getTargetRotation().
  • ImageAnalysis: Meta veri çıkışı, resim arabelleğinin koordinatların belirlenmesine yardımcı olur.
  • ImageCapture: Resim EXIF meta verileri, arabelleği veya arabelleği ve meta veriler, rotasyon ayarına göre değiştirilir. Değiştirilen değer HAL uygulamasına bağlıdır.

Kırpma dikdörtgeni

Varsayılan olarak kırpma dikdörtgeni tam arabellek alanıdır. Özelleştirmek için ViewPort ve UseCaseGroup. Kullanımı gruplandırarak Böylece, CameraX tüm cihazların kırpma alanını ve görüntü alanını Gruptaki kullanım alanları, kamera sensöründe aynı alanı işaret eder.

Aşağıdaki kod snippet'inde bu iki sınıfın nasıl kullanılacağı gösterilmektedir:

Kotlin

val viewPort =  ViewPort.Builder(Rational(width, height), display.rotation).build()
val useCaseGroup = UseCaseGroup.Builder()
    .addUseCase(preview)
    .addUseCase(imageAnalysis)
    .addUseCase(imageCapture)
    .setViewPort(viewPort)
    .build()
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCaseGroup)

Java

ViewPort viewPort = new ViewPort.Builder(
         new Rational(width, height),
         getDisplay().getRotation()).build();
UseCaseGroup useCaseGroup = new UseCaseGroup.Builder()
    .addUseCase(preview)
    .addUseCase(imageAnalysis)
    .addUseCase(imageCapture)
    .setViewPort(viewPort)
    .build();
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCaseGroup);

ViewPort, son kullanıcıların görebildiği arabellek kaynağını tanımlar. KameraX ise özelliklerine göre mümkün olan en büyük kırpma alanını kullanım alanı ekleyin. WYSIWYG etkisi elde etmek için genellikle önizleme kullanım alanına göre değiştirebilirsiniz. Görüntü alanını almanın basit bir yolu PreviewView kullanmak için.

Aşağıdaki kod snippet'lerinde ViewPort nesnesinin nasıl alınacağı gösterilmektedir:

Kotlin

val viewport = findViewById<PreviewView>(R.id.preview_view).viewPort

Java

ViewPort viewPort = ((PreviewView)findViewById(R.id.preview_view)).getViewPort();

Yukarıdaki örnekte, uygulamanın ImageAnalysis ve Son kullanıcının PreviewView ürününde gördüğüyle ImageCapture eşleşir ve PreviewView adlı uygulamanın ölçek türü varsayılan olarak FILL_CENTER olarak ayarlandı. Uygulandıktan sonra kırpma bölgesini ve döndürmeyi çıkış arabelleğine, yani tüm kullanım alanlarından muhtemelen farklı çözünürlüklerde olsa da aynıdır. Daha fazla dönüştürme bilgilerinin nasıl uygulanacağı hakkında bilgi için dönüştürme çıktı çıkar.

Kamera seçimi

KameraX otomatik olarak uygulamanızın en iyi kamera cihazını seçer kullanım alanlarını ifade eder. Cihazdan farklı bir cihaz kullanmak isterseniz birkaç seçenek vardır:

Aşağıdaki kod örneğinde, CameraSelector yönergesinin nasıl oluşturulacağı gösterilmektedir cihaz seçimini etkiler:

Kotlin

fun selectExternalOrBestCamera(provider: ProcessCameraProvider):CameraSelector? {
   val cam2Infos = provider.availableCameraInfos.map {
       Camera2CameraInfo.from(it)
   }.sortedByDescending {
       // HARDWARE_LEVEL is Int type, with the order of:
       // LEGACY < LIMITED < FULL < LEVEL_3 < EXTERNAL
       it.getCameraCharacteristic(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)
   }

   return when {
       cam2Infos.isNotEmpty() -> {
           CameraSelector.Builder()
               .addCameraFilter {
                   it.filter { camInfo ->
                       // cam2Infos[0] is either EXTERNAL or best built-in camera
                       val thisCamId = Camera2CameraInfo.from(camInfo).cameraId
                       thisCamId == cam2Infos[0].cameraId
                   }
               }.build()
       }
       else -> null
    }
}

// create a CameraSelector for the USB camera (or highest level internal camera)
val selector = selectExternalOrBestCamera(processCameraProvider)
processCameraProvider.bindToLifecycle(this, selector, preview, analysis)

Aynı anda birden fazla kamera seçme

CameraX 1.3 sürümünden itibaren, aynı anda birden fazla kamera da seçebilirsiniz. Örneğin, fotoğraf çekmek veya video kaydetmek için ön ve arka kameraya bağlayabilirsiniz. bakış açısıyla özetleme şansı da tanır.

Eşzamanlı Kamera özelliği kullanılırken cihaz iki kamerayı kullanabilir kamerayla kullanabilir veya arkadaki iki kamerayı aynı anda anlamına gelir. Aşağıdaki kod bloğunda, aşağıdaki durumlarda iki kameranın nasıl bindToLifecycle çağrılıyor ve döndürülen nesneden her iki Kamera nesnesinin nasıl alınacağı ConcurrentCamera nesne algılandı.

Kotlin

// Build ConcurrentCameraConfig
val primary = ConcurrentCamera.SingleCameraConfig(
    primaryCameraSelector,
    useCaseGroup,
    lifecycleOwner
)

val secondary = ConcurrentCamera.SingleCameraConfig(
    secondaryCameraSelector,
    useCaseGroup,
    lifecycleOwner
)

val concurrentCamera = cameraProvider.bindToLifecycle(
    listOf(primary, secondary)
)

val primaryCamera = concurrentCamera.cameras[0]
val secondaryCamera = concurrentCamera.cameras[1]

Java

// Build ConcurrentCameraConfig
SingleCameraConfig primary = new SingleCameraConfig(
    primaryCameraSelector,
    useCaseGroup,
    lifecycleOwner
);

SingleCameraConfig secondary = new SingleCameraConfig(
    primaryCameraSelector,
    useCaseGroup,
    lifecycleOwner
);

ConcurrentCamera concurrentCamera =  
    mCameraProvider.bindToLifecycle(Arrays.asList(primary, secondary));

Camera primaryCamera = concurrentCamera.getCameras().get(0);
Camera secondaryCamera = concurrentCamera.getCameras().get(1);

Kamera çözünürlüğü

KameraX'in resim çözünürlüğünü bir kombinasyona göre ayarlamasına izin verebilirsiniz özellikleri, cihazın desteklenen donanımı seviyesi ise kullanım alanı ve en boy oranı belirtiliyor. Alternatif olarak, bütçeniz dahilinde belirli bir belirli bir en boy oranı veya hedef çözünürlük ya da bunların yapılandırma.

Otomatik çözünürlük

CameraX, içerdiği görüntülere dayalı olarak en iyi çözünürlük ayarlarını otomatik olarak kullanım alanları için cameraProcessProvider.bindToLifecycle(). Her zaman aynı anda çalışması için gereken tüm kullanım alanlarını oturumunda görüntülenebilir.bindToLifecycle() CameraX, çözünürlükleri belirler Bu, cihazın desteklenip desteklenmediğine bağlı olarak bağlı kullanım alanlarına göre ve cihaza özgü varyansı hesaba katarak (cihazın bağlı olarak akış yapılandırmalarını aşıyor veya karşılamıyor kullanılabilir). Amaç, uygulamanın aynı zamanda çok çeşitli cihazlarda çalışmasını cihaza özel kod yollarını en aza indirin.

Görüntü yakalama ve görüntü analizi kullanım alanları için varsayılan en boy oranı 4:3'tür.

Kullanım alanları, uygulamanın belirtmesi için yapılandırılabilir bir en boy oranına sahiptir. kullanıcı arayüzü tasarımına göre istenen en boy oranı. CameraX çıkışı şunun için üretilir: istenen en boy oranları cihazın desteklediği en boy oranıyla eşleşmelidir. Varsa tam eşleşme çözünürlüğü desteklenmez (en fazla koşulu karşılayan çözünürlük) seçili olduğundan emin olun. Böylelikle uygulama, kameranın görüntü alanında nasıl görüneceğini ve CameraX, bu çözünürlüğü karşılayacak en iyi kamera çözünürlüğü ayarlarını belirler farklı cihazlarda kullanabilirsiniz.

Örneğin, bir uygulama aşağıdakilerden herhangi birini yapabilir:

  • Kullanım alanı için 4:3 veya 16:9 hedef çözünürlüğü belirtin
  • CameraX'in en yakın çözünürlüğü bulmaya çalıştığı özel bir çözünürlük belirtin şununla eşleştir:
  • ImageCapture için kırpma en boy oranı belirtin

CameraX, dahili Camera2 yüzey çözünürlüklerini otomatik olarak seçer. İlgili içeriği oluşturmak için kullanılan aşağıdaki tabloda çözünürlükler gösterilmektedir:

Kullanım alanı Dahili yüzey çözünürlüğü Çıkış verilerinin çözünürlüğü
Önizle En Boy Oranı: Hedefe en uygun çözünürlük, ayarını değiştirebilirsiniz. Dahili yüzey çözünürlüğü. Bir Görünümün kırpılmasına izin vermek için meta veriler hedef en boy oranına göre ölçeklenir ve döndürülür.
Varsayılan çözünürlük: En yüksek önizleme çözünürlüğü veya en yüksek Önizlemenin en boy oranıyla eşleşen cihaz tarafından tercih edilen çözünürlük
Maksimum çözünürlük: En iyi boyutu ifade eden önizleme boyutu cihazın ekran çözünürlüğüyle veya 1080p (1920x1080) çözünürlüğe sahip olmalıdır.
Görüntü analizi En boy oranı: Hedefe en uygun çözünürlük, ayarını değiştirebilirsiniz. Dahili yüzey çözünürlüğü.
Varsayılan çözünürlük: Varsayılan hedef çözünürlük ayarı: 640x480. Hem hedef çözünürlüğü hem de karşılık gelen en boy oranını ayarlama en iyi desteklenen çözümle sonuçlanacaktır.
Maksimum çözünürlük: Kamera cihazının maksimum çıkış çözünürlüğü. Şuradan alınan YUV_420_888 biçimi StreamConfigurationMap.getOutputSizes(). Hedef çözünürlük varsayılan olarak 640x480 olarak ayarlanır. Bu nedenle, 640x480'den daha büyük bir çözünürlük istiyorsanız setTargetResolution() ve setTargetAspectRatio() ve desteklenen çözünürlüklerden en yakın olanı bulun.
Görüntü yakalama En boy oranı: Ayara en uygun en boy oranı. Dahili yüzey çözünürlüğü.
Varsayılan çözünürlük: Kullanılabilir en yüksek çözünürlük veya en yüksek çözünürlük ImageCapture'ın en boy oranıyla eşleşen cihaz tarafından tercih edilen çözünürlüğe sahip olur.
Maksimum çözünürlük: Kamera cihazının maksimum çıkış çözünürlüğü. JPEG biçiminde olur. Tekliflerinizi otomatikleştirmek ve optimize etmek için StreamConfigurationMap.getOutputSizes() geri yükleyebilirsiniz.

Çözünürlük belirtin

Kullanım alanları oluştururken setTargetResolution(Size resolution) yöntemi, aşağıdaki kodda gösterildiği gibi örnek:

Kotlin

val imageAnalysis = ImageAnalysis.Builder()
    .setTargetResolution(Size(1280, 720))
    .build()

Java

ImageAnalysis imageAnalysis =
  new ImageAnalysis.Builder()
    .setTargetResolution(new Size(1280, 720))
    .build();

Aynı kullanımda hem hedef en boy oranını hem de hedef çözünürlüğü ayarlayamazsınız dava açın. Bu işlem, yapılandırma derlenirken bir IllegalArgumentException hatası verir nesnesini tanımlayın.

Çözünürlüğü Size koordinatta ifade edin çerçeve içine alın. Örneğin, doğal hedef rotasyonunda dikey doğal yönlü cihaz dikey resim 480x640 çözünürlüğü belirtebilir ve aynı cihaz 90 derece döndürülmüş ve hedef yatay yön 640x480 belirtebilir.

Hedef çözünürlük, resim için minimum sınır oluşturmaya çalışır. belirler. Gerçek resim çözünürlüğü, kullanılabilir olan en yakın çözünürlükdür. ekran görüntüsünde belirtilen hedef çözünürlükten daha küçük olmayan bir boyuta Kamera kullanımı.

Ancak, hedef çözünürlükten daha büyük, mevcut çözünürlükten daha küçük olan en yakın hedef çözünürlük seçilir. Şu en boy oranına sahip çözünürlük: sağlanan Size, farklı çözünürlüklerden daha yüksek önceliğe sahip en boy oranları.

CameraX, isteklere göre en uygun çözünürlüğü uygular. Öğe birincil ihtiyaç, en boy oranını karşılamaktır, yalnızca setTargetAspectRatio belirtin. ve CameraX, cihaza uygun belirli bir çözünürlük belirler. Uygulamanın birincil ihtiyacı görüntü oluşturmak için bir çözünürlük belirtmekse daha verimli bir şekilde işlenmesini sağlar (örneğin, işlem özelliği) setTargetResolution(Size resolution) kullanın.

Uygulamanız için tam bir çözünürlük gerekiyorsa createCaptureSession() her donanım düzeyinde hangi maksimum çözünürlüklerin desteklendiğini belirleyin. Alıcı: mevcut cihazın desteklediği belirli çözünürlükleri kontrol edin. StreamConfigurationMap.getOutputSizes(int).

Uygulamanız Android 10 veya sonraki bir sürümde çalışıyorsa şunu kullanabilirsiniz: isSessionConfigurationSupported() SessionConfiguration kontrol edebilirsiniz.

Kamera çıkışını kontrol edin

Ayrıca, her bir cihaz için kamera çıkışını kameraX, Google Analytics 4'te tarama deneyimini desteklemek için Tüm bağlı kullanım alanlarında ortak kamera işlemleri:

  • CameraControl şunları yapmanıza olanak tanır: Genel kamera özelliklerini yapılandırın.
  • CameraInfo, Google Haritalar'daki durumunu öğrenebilirsiniz.

CameraControl'de desteklenen kamera özellikleri şunlardır:

  • Yakınlaştırma
  • Flaş
  • Odak ve Ölçme (dokunarak odaklama)
  • Pozlama Telafisi

CameraControl ve CameraInfo örneklerini alma

Şunu kullanarak CameraControl ve CameraInfo örneklerini alın: Camera nesnesi şu tarafından döndürüldü: ProcessCameraProvider.bindToLifecycle(). Aşağıdaki kodda bir örnek gösterilmektedir:

Kotlin

val camera = processCameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview)

// For performing operations that affect all outputs.
val cameraControl = camera.cameraControl
// For querying information and states.
val cameraInfo = camera.cameraInfo

Java

Camera camera = processCameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview)

// For performing operations that affect all outputs.
CameraControl cameraControl = camera.getCameraControl()
// For querying information and states.
CameraInfo cameraInfo = camera.getCameraInfo()

Örneğin, yakınlaştırma ve diğer CameraControl işlemlerini şundan sonra gönderebilirsiniz: bindToLifecycle() aranıyor. Bağlamak için kullanılan etkinliği durdurduktan veya yok ettikten sonra kamera örneğine dönerse CameraControl, artık işlemleri yürütemez ve başarısız bir ListenableFuture döndürür.

Yakınlaştırma

CameraControl, yakınlaştırma seviyesini değiştirmek için iki yöntem sunar:

  • setZoomRatio() yakınlaştırma oranını yakınlaştırma oranına göre ayarlar.

    Oran, aralığın içinde olmalıdır CameraInfo.getZoomState().getValue().getMinZoomRatio() ve CameraInfo.getZoomState().getValue().getMaxZoomRatio(). Aksi halde işlevi başarısız bir ListenableFuture değeri döndürüyor.

  • setLinearZoom() geçerli yakınlaştırmayı 0 - 1,0 arasında değişen bir doğrusal yakınlaştırma değeriyle ayarlar.

    Doğrusal yakınlaştırmanın avantajı, görüş alanını (FOV) net bir şekilde yakınlaşmadaki değişikliklerle ölçeklenir. Bu da onun belirli bir Slider görünümü.

CameraInfo.getZoomState() geçerli yakınlaştırma durumunun LiveData'sını döndürür. Değer, kamera başlatıldıysa veya yakınlaştırma düzeyi setZoomRatio() setLinearZoom(). İki yöntemden birinin çağrılması, yedeklenen değerleri belirler ZoomState.getZoomRatio() ve ZoomState.getLinearZoom(). Bu, yakınlaştırma oranı metnini kaydırma çubuğuyla birlikte görüntülemek istediğinizde yararlı olur. Güncellemek için ZoomState LiveData öğesini (herhangi bir işlem yapmanıza gerek kalmadan) gözlemlemeniz yeterlidir. gösterir.

Her iki API'nin döndürdüğü ListenableFuture, uygulamalar için seçenek sunar Belirtilen yakınlaştırma değerine sahip tekrarlanan bir istek olduğunda bilgilendirilmek için tamamlandı. Buna ek olarak, önceki işlem sırasında yeni bir yakınlaştırma değeri ayarlarsanız hâlâ yürütülüyor, önceki yakınlaştırma işleminin ListenableFuture değeri başarısız oluyor hemen teslim edebilirsiniz.

Flaş

CameraControl.enableTorch(boolean) meşaleyi (el feneri olarak da bilinir) etkinleştirir veya devre dışı bırakır.

CameraInfo.getTorchState() mevcut flaş durumunu sorgulamak için kullanılabilir. Döndürülen değeri kontrol edebilirsiniz. - CameraInfo.hasFlashUnit() fener olup olmadığını belirleyin. Değilse telefonla aramak CameraControl.enableTorch(boolean), döndürülen ListenableFuture değerinin başarısız bir sonuçla hemen tamamlar ve lamba durumunu TorchState.OFF.

Fener etkinleştirildiğinde, fotoğraf ve video çekimi sırasında açık kalır flashMode ayarından bağımsız olarak. İlgili içeriği oluşturmak için kullanılan flashMode inç ImageCapture yalnızca flaş devre dışıyken çalışır.

Odak ve Ölçme

CameraControl.startFocusAndMetering() AF/AE/AWB ölçüm bölgelerini ayarlayarak otomatik odaklama ve pozlama sayacını tetikler buna göre çalışır. Bu yöntem genellikle özelliğini kullanabilirsiniz.

Ölçüm Noktası

Başlamak için bir MeteringPoint şunları kullanıyor: MeteringPointFactory.createPoint(float x, float y, float size). MeteringPoint, kameradaki tek bir noktayı temsil eder Surface Normalleştirilmiş bir biçimde depolanır belirlemek üzere sensör koordinatlarına kolayca dönüştürülebilmesi için AF/AE/AWB bölgeleri

MeteringPoint öğesinin boyutu, varsayılan boyutla 0 ile 1 arasında değişir. 0,15f. MeteringPointFactory.createPoint(float x, float y, float size) çağrılırken, CameraX sağlanan alan için (x, y) bölgesinde ortalanmış bir dikdörtgen bölge oluşturur size.

Aşağıdaki kodda MeteringPoint özelliğinin nasıl oluşturulacağı gösterilmektedir:

Kotlin

// Use PreviewView.getMeteringPointFactory if PreviewView is used for preview.
previewView.setOnTouchListener((view, motionEvent) ->  {
val meteringPoint = previewView.meteringPointFactory
    .createPoint(motionEvent.x, motionEvent.y)

}

// Use DisplayOrientedMeteringPointFactory if SurfaceView / TextureView is used for
// preview. Please note that if the preview is scaled or cropped in the View,
// it’s the application's responsibility to transform the coordinates properly
// so that the width and height of this factory represents the full Preview FOV.
// And the (x,y) passed to create MeteringPoint might need to be adjusted with
// the offsets.
val meteringPointFactory = DisplayOrientedMeteringPointFactory(
     surfaceView.display,
     camera.cameraInfo,
     surfaceView.width,
     surfaceView.height
)

// Use SurfaceOrientedMeteringPointFactory if the point is specified in
// ImageAnalysis ImageProxy.
val meteringPointFactory = SurfaceOrientedMeteringPointFactory(
     imageWidth,
     imageHeight,
     imageAnalysis)

startFocusAndMetering ve FocusMeteringAction

Çağırmak için startFocusAndMetering() uygulamaların bir sonraki FocusMeteringAction, isteğe bağlı sayaç moduyla bir veya daha fazla MeteringPoints içeren şuradan kombinasyonlar: FLAG_AF FLAG_AE, FLAG_AWB. İlgili içeriği oluşturmak için kullanılan aşağıdaki kod bu kullanımı gösterir:

Kotlin

val meteringPoint1 = meteringPointFactory.createPoint(x1, x1)
val meteringPoint2 = meteringPointFactory.createPoint(x2, y2)
val action = FocusMeteringAction.Builder(meteringPoint1) // default AF|AE|AWB
      // Optionally add meteringPoint2 for AF/AE.
      .addPoint(meteringPoint2, FLAG_AF | FLAG_AE)
      // The action is canceled in 3 seconds (if not set, default is 5s).
      .setAutoCancelDuration(3, TimeUnit.SECONDS)
      .build()

val result = cameraControl.startFocusAndMetering(action)
// Adds listener to the ListenableFuture if you need to know the focusMetering result.
result.addListener({
   // result.get().isFocusSuccessful returns if the auto focus is successful or not.
}, ContextCompat.getMainExecutor(this)

Önceki kodda gösterildiği gibi startFocusAndMetering() AF/AE/AWB için bir MeteringPoint içeren FocusMeteringAction alır ölçüm bölgeleri ve yalnızca AF ve AE için başka bir MeteringPoint içerir.

KameraX dahili olarak bunu Camera2'ye dönüştürür MeteringRectangles ve ilgili parametrelerin CONTROL_AF_REGIONS / CONTROL_AE_REGIONS / CONTROL_AWB_REGIONS parametrelerini yakalama isteğine ekleyin.

Her cihaz AF/AE/AWB ve birden çok bölgeyi desteklemediğinden, CameraX en iyi çabayla FocusMeteringAction. CameraX maksimum sayıyı kullanıyor desteklenen en fazla sayıda MeteringPoints metriği bulunmaktadır. Tümü Maksimum sayıdan sonra eklenen MeteringPoint'ler yoksayılır. Örneğin, FocusMeteringAction, desteklenen bir platformda 3 MeteringPoints ile birlikte sağlanır yalnızca ilk 2 MeteringPoint kullanılır. Son MeteringPoint CameraX tarafından yoksayıldı.

Pozlama Telafisi

Pozlama dengelemesi, uygulamaların pozlamada ince ayar yapması gerektiğinde kullanışlıdır otomatik pozlama (AE) çıkış sonucunun ötesindeki değerlere (EV) eşittir. Pozlama dengeleme aşağıdaki şekilde birleştirilir. Bu sayede, geçerli resim koşulları:

Exposure = ExposureCompensationIndex * ExposureCompensationStep

CameraX, Camera.CameraControl.setExposureCompensationIndex() pozlama telafisini dizin değeri olarak ayarlamak için kullanılır.

Pozitif indeks değerleri resmi daha parlak hale getirirken negatif değerler resmi soluklaştırır görüntüsüdür. Uygulamalar, desteklenen aralığı aşağıdaki şekilde sorgulayabilir: CameraInfo.ExposureState.exposureCompensationRange() sonraki bölümde açıklanmıştır. Değer destekleniyorsa döndürülen ListenableFuture değer, yakalama isteği; belirtilen dizin desteklenen aralığın dışındaysa setExposureCompensationIndex(), döndürülen ListenableFuture değerinin başarısız bir sonuçla hemen tamamlanır.

CameraX yalnızca en son olağanüstü setExposureCompensationIndex() içeriğini saklar isteğine ve önceki istekten önce işlevin birden çok kez çağrılması uygulanması iptal edilmesine neden olur.

Aşağıdaki snippet, bir karşılaşma tazminat dizini ayarlar ve bir karşılaşma değişikliği isteği yürütüldüğünde geri çağırma:

Kotlin

camera.cameraControl.setExposureCompensationIndex(exposureCompensationIndex)
   .addListener({
      // Get the current exposure compensation index, it might be
      // different from the asked value in case this request was
      // canceled by a newer setting request.
      val currentExposureIndex = camera.cameraInfo.exposureState.exposureCompensationIndex
      
   }, mainExecutor)
  • Camera.CameraInfo.getExposureState() alır ExposureState şunları içerir:

    • Pozlama dengeleme kontrolünün desteklenebilirliği.
    • Geçerli pozlama dengeleme dizini.
    • Pozlama telafisi dizini aralığı.
    • Pozlama dengeleme değerinde kullanılan pozlama dengeleme adımı hesaplamanız gerekir.

Örneğin, aşağıdaki kod bir karşılaşmaya ilişkin ayarları başlatır Mevcut ExposureState ile SeekBar değerleri:

Kotlin

val exposureState = camera.cameraInfo.exposureState
binding.seekBar.apply {
   isEnabled = exposureState.isExposureCompensationSupported
   max = exposureState.exposureCompensationRange.upper
   min = exposureState.exposureCompensationRange.lower
   progress = exposureState.exposureCompensationIndex
}

Ek kaynaklar

CameraX hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.

Kod Laboratuvarı

  • CameraX'i Kullanmaya Başlama
  • Kod örneği

  • CameraX örnek uygulamaları
  • Geliştirici topluluğu

    Android CameraX Tartışma Grubu