Kamera uzantıları

Cihaz üreticileri bokeh, gece modu ve HDR gibi uzantıları gösterebilir Kamera Uzantıları arayüzü üzerinden üçüncü taraf geliştiricilere kitaplığını oluşturur. Geliştiriciler, Kamera2 Uzantıları API'si ve KameraX Extensions API ziyaret edin.

Desteklenen uzantıların listesi için bu, Camera2'de aynıdır. ve CameraX, bkz. KameraX Uzantıları API'si. Bir uzantı eklemek isterseniz şuna hata bildirin: Sorun İzleyici.

Bu sayfada, şurada OEM tedarikçi kitaplığının nasıl uygulanacağı ve etkinleştirileceği açıklanmaktadır: cihazlar.

Mimari

Aşağıdaki şemada, Kamera Uzantılarının mimarisi açıklanmaktadır arayüz veya extensions-interface: Mimari

Şekil 1. Kamera Uzantıları mimari şeması

Şemada gösterildiği gibi, Kamera Uzantılarını desteklemek için OEM tedarikçi kitaplığı tarafından sağlanan extensions-interface kodunu uygulayın. Sizin OEM tedarikçi kitaplığı iki API'yi etkinleştirir: KameraX Extensions API ve Kamera2 Uzantıları API'si, sırasıyla CameraX ve Camera2 uygulamaları tarafından kullanılan satıcı uzantılarıdır.

OEM tedarikçi kitaplığını uygulama

OEM tedarikçi kitaplığını uygulamak için camera-extensions-stub dosyalarını sistem kitaplığı projesine ekleyebileceksiniz. Bu dosyalar Kamera Uzantılarını tanımlar arayüzü.

camera-extensions-stub dosyaları aşağıdaki kategorilere ayrılır:

Temel arayüz dosyaları (değişiklik yapmayın)

  • PreviewExtenderImpl.java
  • ImageCaptureExtenderImpl.java
  • ExtenderStateListener.java
  • ProcessorImpl.java
  • PreviewImageProcessorImpl.java
  • CaptureProcessorImpl.java
  • CaptureStageImpl.java
  • RequestUpdateProcessorImpl.java
  • ProcessResultImpl.java
  • advanced/AdvancedExtenderImpl.java
  • advanced/Camera2OutputConfigImpl.java
  • advanced/Camera2SessionConfigImpl.java
  • advanced/ImageProcessorImpl.java
  • advanced/ImageReaderOutputConfigImpl.java
  • advanced/ImageReferenceImpl.java
  • advanced/MultiResolutionImageReaderOutputConfigImpl.java
  • advanced/OutputSurfaceImpl.java
  • advanced/RequestProcessorImpl.java
  • advanced/SessionProcessorImpl.java
  • advanced/SurfaceOutputConfigImpl.java

Zorunlu uygulamalar (uygulamanızı ekleyin)

  • ExtensionVersionImpl.java
  • InitializerImpl.java

Bokeh uzatıcı sınıfları (Bokeh uzantısı destekleniyorsa uygulayın)

  • BokehImageCaptureExtenderImpl.java
  • BokehPreviewExtenderImpl.java
  • advanced/BokehAdvancedExtenderImpl.java

Gece uzatıcı sınıfları (Gece uzantısı destekleniyorsa uygulayın)

  • NightImageCaptureExtenderImpl.java
  • NightPreviewExtenderImpl.java
  • advanced/NightAdvancedExtenderImpl.java

Otomatik uzatma sınıfları (Otomatik uzantı destekleniyorsa uygulayın)

  • AutoImageCaptureExtenderImpl.java
  • AutoPreviewExtenderImpl.java
  • advanced/AutoAdvancedExtenderImpl.java

HDR uzatıcı sınıfları (HDR uzantısı destekleniyorsa uygulayın)

  • HdrImageCaptureExtenderImpl.java
  • HdrPreviewExtenderImpl.java
  • advanced/HdrAdvancedExtenderImpl.java

Yüz rötuşu uzatıcı sınıfları (yüz rötuşu uzantısı destekleniyorsa uygulayın)

  • BeautyImageCaptureExtenderImpl.java
  • BeautyPreviewExtenderImpl.java
  • advanced/BeautyAdvancedExtenderImpl.java

Yardımcı programlar (isteğe bağlı, silinebilir)

  • advanced/Camera2OutputConfigImplBuilder.java
  • advanced/Camera2SessionConfigImplBuilder.java

Her uzantı için uygulama sağlamanız gerekmez. Şu durumda: bir uzantı uygulama, isExtensionAvailable() değerini false değerini döndürecek şekilde ayarlayın veya ilgili Genişletici sınıflarını kaldırın. Camera2 ve CameraX Uzantıları API'ler uygulamaya uzantının kullanılamadığını bildirir.

Şimdi Camera2 ve CameraX Uzantıları API'lerinin tedarikçi firma kitaplığını kullanarak bir uzantıyı etkinleştirin. Aşağıdaki şemada uçtan uca akışa örnek olarak Gece uzantısını kullanabilirsiniz:

Ana Akış

Şekil 2. Gece uzatma uygulaması

  1. Sürüm doğrulaması:

    Camera2/X, kameranın ExtensionVersionImpl.checkApiVersion() numarasını çağırarak OEM tarafından uygulanan extensions-interface sürümü Camera2/X ile uyumludur desteklenir.

  2. Sağlayıcı kitaplığını başlatma:

    InitializerImpl, tedarikçi kitaplığını başlatan bir init() yöntemine sahip. Camera2/X, Genişletici sınıflarına erişmeden önce başlatma işlemini tamamlar.

  3. Genişletici sınıflarını gösterme:

    Uzantının Genişletici sınıflarını gösterir. İki Uzatma Aparatı var türler: Temel Uzatma ve Gelişmiş Uzatma. Bir tane uygulamalısınız Tüm uzantılar için genişletici türü. Daha fazla bilgi için bkz. Temel Genişletici ve Gelişmiş Genişletici.

    Camera2/X, verileri almak için Genişletici sınıflarını somutlaştırır ve onlarla etkileşime girer bilgi edinin ve uzantıyı etkinleştirin. Kamera2/X, belirli bir uzantı için Genişletici sınıflarını birkaç kez örneklendirin. Bu nedenle, ilk kullanıma hazırlama süreci sırasında init() Şunu yapın: yalnızca kamera oturumu başlamak üzereyken ağır kaldırma onInit() çağrıldığında örneğin Temel Genişletici'de veya initSession(), Advanced Extender'da çağrılıyor.

    Night uzantısı için aşağıdaki Extender sınıfları Temel Uzatma Aparatı türü:

    • NightImageCaptureExtenderImpl.java
    • NightPreviewExtenderImpl.java

    Gelişmiş Uzatma türü için:

    • NightAdvancedExtenderImpl.java
  4. Uzantı kullanılabilirliğini kontrol edin:

    isExtensionAvailable(), uzantıyı etkinleştirmeden önce uzantı, belirtilen kamera kimliğinde Uzatma Aracı üzerinden mevcut. kullanır.

  5. Extender'ı kamera bilgileriyle başlatın:

    Camera2/X, Extender örneğinde init() yöntemini çağırır ve kameraya iletir Kimlik ve CameraCharacteristics.

  6. Sorgu bilgileri:

    Desteklenen gibi bilgileri almak için Extender sınıfını çağırır yine de tahmini gecikmeyi yakalayın ve istek anahtarlarını kullanıma hazırlanırken Genişletici'yi tıklayın.

  7. Genişleticide uzantıyı etkinleştirin:

    Extender sınıfı, Search Ads 360'ı etkinleştirmek için gereken tüm sınıfını kullanır. OEM'in ilgisini çekmek için bir mekanizma sunar. yakalama isteği ekleme gibi kamera2 ardışık düzenine uygulama parametrelerini veya bir son işlemciyi etkinleştirmenizi sağlar.

    Gelişmiş Genişletme türü için Camera2/X, Uzantıyı etkinleştirmek için SessionProcessorImpl. Camera2/X, SessionProcessorImpl örneği için aşağıdaki kodu createSessionProcessor() çağırarak Uzatma Aparatı.

Aşağıdaki bölümlerde uzantı akışı daha ayrıntılı olarak açıklanmaktadır.

Sürüm doğrulama

Çalışma zamanında cihazdan OEM tedarikçi kitaplığını yüklerken Camera2/X kitaplığın extensions-interface sürümüyle uyumlu olup olmadığını doğrular. extensions-interface, anlamsal sürüm oluşturma kullanır veya MAJOR.MINOR.PATCH (ör. 1.1.0 veya 1.2.0). Ancak yalnızca Sürüm doğrulaması sırasında ana ve alt sürümler kullanılır.

Sürümü doğrulamak için Camera2/X'i arar. Desteklenen ExtensionVersionImpl.checkApiVersion() extensions-interface sürüm. Daha sonra Camera2/X, Uzantının etkinleştirilip etkinleştirilemeyeceğini ve hangi özellikleri içerdiğini belirlemek için OEM kitaplığı tarafından çağrılacaktır.

Ana sürüm uyumluluğu

extension-interface ana sürümleri farklı Camera2/X ile tedarikçi kitaplığı arasında uyumsuz olarak kabul edilir ve uzantı devre dışıdır.

Geriye dönük uyumluluk

Ana sürüm aynı olduğu sürece Camera2/X, Önceki sürümlerle oluşturulan OEM tedarikçi kitaplıklarıyla geriye dönük uyumluluk extensions-interface sürüm. Örneğin, Camera2/X extensions-interface 1.3.0, 1.0.0'ı uygulayan OEM tedarikçi kitaplıkları, 1.1.0 ve 1.2.0 hâlâ uyumludur. Bu aynı zamanda, satıcı kitaplığının belirli bir sürümünü kullanıyorsanız Camera2/X, kullanıma sunulacak extension-interface sürümleriyle geriye dönük uyumludur.

Yönlendirme uyumluluğu

Daha yeni extensions-interface sürümünün satıcı kitaplıklarıyla ileriye dönük uyumluluk Bu ise size, yani OEM'ye bağlıdır. Uzantıları uygulamak için bazı özelliklere ihtiyacınız varsa, uzantıları belirli bir sürümden itibaren etkinleştirmek isteyebilirsiniz. Burada şu durumlarda desteklenen extensions-interface sürümünü iade edebilirsiniz: Camera2/X kitaplık sürümü, şartları karşılıyor. Camera2/X sürümleri desteklenmiyorsa 99.0.0 gibi uyumsuz bir sürümü döndürerek uzantıları devre dışı bırakın.

Satıcı kitaplığını başlatma

OEM tarafından uygulanan extensions-interface sürümünü doğruladıktan sonra kamera2/X ilk kullanıma hazırlama işlemini başlatır. İlgili içeriği oluşturmak için kullanılan InitializerImpl.init() yöntemi, bir uygulamanın OEM kitaplığına bir işlemin yapmaya çalıştığını belirtir nasıl kullanacağınızı göstereceğim.

Camera2/X, OEM kitaplığına başka arama yapmaz (sürüm kontrolü dışında) OEM tedarikçi kütüphanesi OnExtensionsInitializedCallback.onSuccess() çağırana kadar tıklayın.

Tekliflerinizi otomatikleştirmek ve optimize etmek için InitializerImpl extensions-interface 1.1.0 itibarıyla. Camera2/X, kitaplık başlatma işlemini atlar extensions-interface 1.0.0'ı uygular.

Temel Uzatıcı ve Gelişmiş Uzatıcı Karşılaştırması

İki tür extensions-interface uygulaması vardır: Temel Genişletme ve Gelişmiş Uzatma Aracı. Advanced Extender, şu tarihten beri destekleniyor: extensions-interface 1.2.0.

Kamera HAL veya HAL'sindeki resimleri işleyen uzantılar için Temel Genişletici'yi uygulayın. YUV akışlarını işleyebilen bir son işlemci kullanmalıdır.

Camera2'yi özelleştirmesi gereken uzantılar için Gelişmiş Genişletici'yi uygulayın2 akış yapılandırmasını ve yakalama isteklerini gönderin.

Karşılaştırma için aşağıdaki tabloya bakın:

Uzatma Aparatı Gelişmiş Uzatma Aparatı
Akış yapılandırmaları Sabit
Önizleme: PRIVATE veya YUV_420_888 (işleyen varsa)
Yine de yakalama: JPEG veya YUV_420_888 (işleyen varsa)
OEM tarafından özelleştirilebilir.
Yakalama isteği gönderiliyor Yalnızca Camera2/X yakalama isteği gönderebilir. Parametreleri talep edebilir. Görüntü yakalama için işlemci sağlandığında Camera2/X birden fazla yakalama isteği gönderebilir ve tüm resimleri gönderip işleyene iletebilir. Size bir RequestProcessorImpl örneği sağlandığı için kamera2 yakalama isteğini yürütüp sonuçları ve Görüntü'yü alın.

Kamera2/X, startRepeating ve startCapture çağrılarını açık duruma getirir OEM'e tekrarı başlatması için sinyal vermek üzere SessionProcessorImpl sırasıyla önizleme isteği gönderin ve hareketsiz görüntü yakalama sırasını başlatın.

Kamera hattındaki kancalar
  • onPresetSession, oturum parametreleri sağlar.
  • onEnableSession, CameraCaptureSession yapılandırıldıktan hemen sonra tek bir istek gönderir.
  • onDisableSession, CameraCaptureSession kapatılmadan önce tek bir istek gönderir.
  • initSession, özelleştirilmiş bir kamerayı başlatır ve döndürür2 oturum yapılandırmasını kullanabilirsiniz.
  • onCaptureSessionStart, CameraCaptureSession yapılandırıldıktan hemen sonra çağrılır.
  • onCaptureSessionEnd, CameraCaptureSession kapanmadan önce çağrılır.
Uygun Kamera HAL'sine veya işleyen bir işlemciye uygulanan uzantılar YUV resimleri.
  • Uzantılar için Camera2 tabanlı uygulamalar vardır.
  • RAW akışı gibi özelleştirilmiş yayın yapılandırması gerekiyor.
  • Etkileşimli yakalama sırası gerekiyor.
Desteklenen API sürümü Kamera2 Uzantıları: Android 13 veya sonraki sürümler
CameraX Uzantıları: camera-extensions 1.1.0 veya üstü
Kamera2 Uzantıları: Android 12L veya sonraki sürümler
CameraX Uzantıları: camera-extensions 1.2.0-alpha03 veya üstü

Uygulama akışları

Aşağıdaki tabloda üç tür uygulama akışı ve bunların ilgili Kamera Uzantıları API çağrıları. Kamera2/X ise desteği sağlamak için satıcı kitaplığını doğru şekilde uygulamanız İlerleyen bölümlerde bu konuyu daha ayrıntılı bir şekilde açıklayacağız.

Camera2 uzantıları CameraX uzantıları
Sorgu uzantılarının kullanılabilirliği CameraExtensionCharacteristics .getSupportedExtensions ExtensionsManager. isExtensionAvailable
Sorgu bilgileri CameraExtensionCharacteristics. getExtensionSupportedSizes CameraExtensionCharacteristics. getEstimatedCaptureLatencyRangeMillis CameraExtensionCharacteristics. getAvailableCaptureRequestKeys CameraExtensionCharacteristics. getAvailableCaptureResultKeys ExtensionsManager. getEstimatedCaptureLatencyRange

CameraX, kitaplıktaki geri kalan bilgileri işler.

Uzantı etkinken önizleme ve görüntü yakalama CameraDevice. createExtensionSession

cameraExtensionsSession. setRepeatingRequest

cameraExtensionsSession. capture

val cameraSelector = ExtensionsManager. getExtensionEnabledCameraSelector

bindToLifecycle(lifecycleOwner, cameraSelector, preview, ...)

Uzatma Aparatı

Temel Genişletici arayüzü, kameranın çeşitli yerlerine kancalar yerleştirir. ardışık düzendir. Her uzantı türünde, OEM'lerin ihtiyaç duyduğu ilgili Genişletici sınıfları bulunur pek çok yolu vardır.

Aşağıdaki tabloda, OEMS'lerin her bir kuruluş birimi için uygulaması gereken Genişletici sınıfları yer almaktadır uzantı:

Uygulanacak sınıfları genişletme
Gece NightPreviewExtenderImpl.java

NightImageCaptureExtenderImpl.java

HDR HdrPreviewExtenderImpl.java

HdrImageCaptureExtenderImpl.java

Otomotiv AutoPreviewExtenderImpl.java

AutoImageCaptureExtenderImpl.java

Boke BokehPreviewExtenderImpl.java

BokehImageCaptureExtenderImpl.java

Yüz rötuşu BeautyPreviewExtenderImpl.java

BeautyImageCaptureExtenderImpl.java

Yer tutucu olarak PreviewExtenderImpl ve ImageCaptureExtenderImpl kullanırız. aşağıdaki örnekte görebilirsiniz. Bunları, gerçek dosyalar.

Temel Genişletici'nin özellikleri:

  • CameraCaptureSession öğesini yapılandırırken oturum parametrelerini ekleyin ( onPresetSession) tıklayın.
  • Yakalama oturumu başlangıç ve kapanış etkinlikleri hakkında sizi bilgilendirip tek bir HAL'yi döndürülen parametrelerle bilgilendirme isteği (onEnableSession, onDisableSession) tıklayın.
  • İstek için yakalama parametrelerini ekleyin (PreviewExtenderImpl.getCaptureStage, ImageCaptureExtenderImpl.getCaptureStages) tıklayın.
  • Önizleme için işlemciler ekleyin ve işleme alınabilen verileri yakalamaya devam edin YUV_420_888 akışı.
ziyaret edin.

Kamera2/X'in, üçünü sağlamak için extensions-interface öğesini nasıl çağırdığına bakalım uygulama akışları için geçerlidir.

Uygulama akışı 1: Uzantı kullanılabilirliğini kontrol etme

TemelExtenderAppFlow1

Şekil 3. Temel Genişletici'de uygulama akışı 1

Bu akışta Camera2/X, doğrudan şu isExtensionAvailable() yöntemini çağırır: telefon etmeden hem PreviewExtenderImpl hem de ImageCaptureExtenderImpl init(). Uzantıların etkinleştirilmesi için her iki Genişletici sınıfının da true döndürmesi gerekir.

Bu, genellikle uygulamaların, belirtilen uzantının olup olmadığını kontrol ettiği ilk adımdır. type (tür), uzantı etkinleştirilmeden önce belirli bir kamera kimliği için desteklenir. Bunun nedeni, bazı uzantıların yalnızca belirli kamera kimliklerinde desteklenmesidir.

Uygulama akışı 2: Sorgu bilgileri

TemelExtenderAppFlow2

4.Şekil Temel Genişletici'de uygulama akışı 2

Uygulamalar uzantının kullanılabilir olup olmadığını belirledikten sonra ve uzantıyı etkinleştirmeden önce aşağıdaki bilgileri inceleyin.

  • Yine de yakalama gecikme aralığı: ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange, şu aralığı döndürür: uygulamanın uygun olup olmadığını değerlendirmek için uzantıyı geçerli senaryo için etkinleştirin.

  • Önizleme ve yakalama yüzeyi için desteklenen boyutlar: ImageCaptureExtenderImpl.getSupportedResolutions ve PreviewExtenderImpl.getSupportedResolutions, resim biçimleri listesini döndürür ve yüzey biçimi ve boyutu için desteklenen boyutlar.

  • Desteklenen istek ve sonuç anahtarları: Camera2/X, desteklenen yakalamayı almak için aşağıdaki yöntemleri çağırır uygulamanızdan anahtarları ve sonuç anahtarlarını isteyin:

    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
    • ImageCaptureExtenderImpl.getAvailableCapturetResultKeys

Camera2/X, sorgulamadan önce bu Genişletici sınıflarında her zaman ilk olarak init() numarasını çağırır konulu videomuzu izleyin.

Uygulama akışı 3: Uzantı etkinken önizleme/yine yakalama (HAL uygulaması)

TemelExtenderAppFlow3

5. Şekil. Temel Genişletici'de uygulama akışı 3

Yukarıdaki şemada, önizlemeyi etkinleştirme ve yakalamanıza yardımcı olabilir. Bu, kamera HAL'sinin uzantıyı işler.

Bu akışta Camera2/X önce init(), ardından onInit çağrısı yaparak size bildirim gönderir. belirtilen uzantılarla bir kamera oturumu başlamak üzere. onInit() uygulamasında zorlayıcı bir ilk kullanıma hazırlama işlemi gerçekleştirebilirsiniz.

CameraCaptureSession yapılandırılırken Kamera2/X şunları çağırır: Oturum parametrelerini almak için onPresetSession. Yakalama oturumu başarıyla yapılandırıldığında, Camera2/X, onEnableSession işlemini çağırarak bir CaptureStageImpl örnek olabilir. Kamera2/X hemen bu yakalama parametreleriyle tek bir istek göndererek HAL. Benzer şekilde, yakalama oturumu kapatılmadan önce Camera2/X, onDisableSession ve ardından döndürülen yakalamayla tek bir istek gönderir. parametreleridir.

Camera2/X tarafından tetiklenen yinelenen istek, istek parametrelerini içerir PreviewExtenderImpl.getCaptureStage() tarafından iade edildi. Dahası, hâlâ yakalama isteği, ImageCaptureExtenderImpl.getCaptureStages()

Son olarak Kamera2/X, kamera oturumu bittikten sonra onDeInit() öğesini çağırır. Kaynakları onDeinit() sürümünde serbest bırakabilirsiniz.

İşlemciyi önizle

Kamera HAL'sine ek olarak, bir işlemciye de uzantılar uygulayabilirsiniz.

İşleyen türünü belirtmek için PreviewExtenderImpl.getProcessorType uygulayın aşağıda açıklandığı gibi:

  • PROCESSOR_TYPE_NONE: İşleyen yok. Görüntüler kamerada işlenir HAL.

  • PROCESSOR_TYPE_REQUEST_UPDATE_ONLY: İşlemci türü şunları yapmanıza olanak tanır: şuna göre yeni yakalama isteği parametreleriyle tekrarlanan isteği güncelleyin: en son TotalCaptureResult.

    PreviewExtenderImpl.getProcessor, bir değer döndürmelidir RequestUpdateProcessorImpl TotalCaptureResult örneğini işleyen ve şunu döndüren bir örnek: Tekrarlanan isteği güncellemek için CaptureStageImpl örneği. PreviewExtenderImpl.getCaptureStage(), CaptureStageImpl değerini döndürür.

  • PROCESSOR_TYPE_IMAGE_PROCESSOR: Bu tür, bir dönüşüm hunisi uygulamak için bir işlemcisi ile YUV_420_888 görüntüyü işleyebilir ve çıktıyı bir PRIVATE yüzeyi.

    Bir PreviewImageProcessorImpl PreviewExtenderImpl.getProcessor konumundaki örnek. İşleyen sorumludur YUV_420_888 giriş resmini işlemek için kullanılır. Çıkışı PRIVATE önizleme biçimi. Camera2/X, bunun yerine YUV_420_888 yüzeyi kullanır Önizleme için CameraCaptureSession öğesini yapılandırmak üzere PRIVATE.

    Akış için aşağıdaki çizime bakın:

Önizleme İşleyici

6. Şekil. Akışı PreviewImageProcessorImpl ile önizleyin

PreviewImageProcessorImpl arayüzü ProcessImpl uzantısına sahiptir ve üç önemli yöntem vardır:

  • onOutputSurface(Surface surface, int imageFormat), çıkış yüzeyini ayarlar. temsil eder. PreviewImageProcessorImpl için imageFormat bir pikseldir (PixelFormat.RGBA_8888 gibi).

  • onResolutionUpdate(Size size), giriş resminin boyutunu ayarlar.

  • onImageFormatUpdate(int imageFormat), girişin resim biçimini belirler görüntüsüdür. Şu anda yalnızca YUV_420_888 olabilir.

Görüntü yakalama işlemcisi

Yine de yakalama için, bir CaptureProcessorImpl örneği ImageCaptureExtenderImpl.getCaptureProcessor ile gösterilir. İşlemci: çekilen YUV_420_888 görüntülerin listesini işlemek, TotalCaptureResult örnek ve çıkışı bir YUV_420_888 yüzeyine yazın.

yakalamaya devam eder.

Akışı aşağıdaki şemada görebilirsiniz:

Yakalama İşlemci

7.Şekil CaptureProcessorImpl ile akışı yakalamaya devam edin

  1. Camera2/X, yapılandırmada fotoğraf çekme işlemi için YUV_420_888 biçimli bir yüzey kullanır ele alacağız. Camera2/X, şunu çağırarak CaptureProcessorImpl uygulamasını hazırlar:

    • YUV_420_888 ile CaptureProcessorImpl.onImageFormatUpdate().
    • Giriş resim boyutuyla birlikte CaptureProcessorImpl.onResolutionUpdate().
    • YUV_420_888 çıkışıyla CaptureProcessorImpl.onOutputSurface() teşekkür ederiz.
  2. ImageCaptureExtenderImpl.getCaptureStages, şunun bir listesini döndürür: CaptureStageImpl her öğe, yakalama parametrelerine sahip bir CaptureRequest örneğine eşlenir. kamera2/X tarafından gönderilen görüntülerdir. Örneğin, üçlü bir liste döndürürse CaptureStageImpl örnek, Camera2/X üç yakalama isteği gönderir öğesini kullanarak karşılık gelen yakalama parametrelerini captureBurst API'ye gidin.

  3. Alınan görüntüler ve TotalCaptureResult örnek bir arada paketlenir ve işlenmek üzere CaptureProcessorImpl adresine gönderildi.

  4. CaptureProcessorImpl, sonuç Resmini (YUV_420_888 biçimi) onOutputSurface() çağrısıyla belirtilen çıkış yüzeyi. Camera2/X, bunu dönüştürür JPEG resimlerine yükleyebilirsiniz.

Yakalama isteği anahtarları ve sonuçları desteği

Uygulamalar, kamera önizleme ve çekime ek olarak yakınlaştırmayı ayarlayabilir, flaş parametreleri alabilir veya dokunarak odaklamayı tetikleyebilirsiniz. Bu parametreler ve uzantı uygulamanızla uyumludur.

Aşağıdaki yöntemler extensions-interface 1.3.0 sürümüne izin vermek için eklendi uygulamanızın desteklediği parametreleri ortaya çıkarmanızı sağlar:

  • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys() şunu döndürür: Uygulamanızın desteklediği istek anahtarlarını yakalama
  • ImageCaptureExtenderImpl.getAvailableCaptureResultKeys() şunu döndürür: Yakalama sonucunda yer alan sonuç anahtarlarını yakalama.

Kamera HAL'si uzantıyı işlerse Camera2/X yakalamayı alır. sonuç: CameraCaptureSession.CaptureCallback. Ancak, işlemci uygulanır, ardından Camera2/X yakalama sonuçlarını ProcessResultImpl . Bu değer process() yöntemindeki PreviewImageProcessorImpl ve CaptureProcessorImpl Raporlama sizin sorumluluğunuzdadır ProcessResultImpl aracılığıyla Camera2/X arasında fotoğraf çekin.

Örnek olarak aşağıdaki CaptureProcessorImpl arayüzünün tanımına bakın. extensions-interface 1.3.0 veya sonraki sürümlerde ikinci process() çağrısı çağrılır:

Interface CaptureProcessorImpl extends ProcessorImpl {
    // invoked when extensions-interface version < 1.3.0
    void process(Map<Integer, Pair<Image, TotalCaptureResult>> results);
    // invoked when extensions-interface version >= 1.3.0
    void process(Map<Integer, Pair<Image, TotalCaptureResult>> results,
            ProcessResultImpl resultCallback, Executor executor);
}

Yakınlaştırma, dokunarak odaklama, flaş ve pozlama gibi yaygın kamera işlemleri için için aşağıdaki tuşların kullanımını öneririz: istek ve yakalama sonucu:

  • Yakınlaştırma:
    • CaptureRequest#CONTROL_ZOOM_RATIO
    • CaptureRequest#SCALER_CROP_REGION
  • Odak için dokunma:
    • CaptureRequest#CONTROL_AF_MODE
    • CaptureRequest#CONTROL_AF_TRIGGER
    • CaptureRequest#CONTROL_AF_REGIONS
    • CaptureRequest#CONTROL_AE_REGIONS
    • CaptureRequest#CONTROL_AWB_REGIONS
  • Flash:
    • CaptureRequest#CONTROL_AE_MODE
    • CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER
    • CaptureRequest#FLASH_MODE
  • Karşılaşma telafisi:
    • CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION

1.2.0 veya önceki sürümleri uygulayan Temel Uzatma Aparatları için CameraX Extensions API, yukarıdaki tüm anahtarları açık bir şekilde destekler. Örneğin, extensions-interface 1.3.0, hem CameraX hem de Camera2, döndürülen listeyi dikkate alır ve yalnızca dosyadaki anahtarları desteklemelidir. Örneğin, web sitenize geri dönmeye yalnızca CaptureRequest#CONTROL_ZOOM_RATIO ve CaptureRequest#SCALER_CROP_REGION kullanıyorsanız, Uygulama için yalnızca dokunarak odaklama, flaş ve pozlama yakınlaştırmanın desteklendiği anlamına gelir. izin verilmez.

Gelişmiş Uzatma Aparatı

Advanced Extender, Camera2 API'ye dayalı bir tedarikçi firma uygulaması türüdür. Bu Uzatma türü extensions-interface 1.2.0 sürümünde eklendi. Şuna bağlı olarak: cihaz üreticisi, uzantılar uygulama katmanında uygulanmış olabilir, Bu, şu faktörlere bağlıdır:

  • Özel yayın yapılandırması: RAW akışı gibi özel akışları yapılandırın veya farklı fiziksel kamera kimlikleri için birden fazla canlı yayın yapabilirsiniz.

  • Kamera2 istekleri gönderme özelliği: Karmaşık etkileşimleri destekleme şunun sonuçlarına göre parametrelerle yakalama istekleri gönderebilen mantıksal olması gerekir.

Advanced Extender bir sarmalayıcı veya ara katman sağlar. Böylece şunları yapabilirsiniz: Akış yapılandırmasını özelleştirme ve isteğe bağlı yakalama istekleri gönderme.

Uygulanacak dosyalar

Advanced Extender uygulamasına geçmek için isAdvancedExtenderImplemented() yöntemi ExtensionVersionImpl sonucu true döndürülmelidir. OEM'ler, her uzantı türü için ilgili Uzatma sınıflarına göz atın. Advanced Extender uygulama dosyaları, gelişmiş pakette mevcuttur.

Uygulanacak sınıfları genişlet
Gece advanced/NightAdvancedExtenderImpl.java
HDR advanced/HdrAdvancedExtenderImpl.java
Otomotiv advanced/AutoAdvancedExtenderImpl.java
Boke advanced/BokehAdvancedExtenderImpl.java
Yüz rötuşu advanced/BeautyAdvancedExtenderImpl.java

Aşağıdaki örnekte yer tutucu olarak AdvancedExtenderImpl kullanılmıştır. Bu dosyayı, kullandığınız uzantının Extender dosyasının adıyla değiştirin. üzerine konuşacağız.

Kamera2/X'in, üçünü sağlamak için extensions-interface öğesini nasıl çağırdığına bakalım her şeyi kapsamaktadır.

Uygulama akışı 1: Uzantıların kullanılabilirliğini kontrol etme

GelişmişUygulamaFlow1

8. Şekil. Advanced Extender'da uygulama akışı 1

Öncelikle, uygulama belirtilen uzantının desteklenip desteklenmediğini kontrol eder.

Uygulama akışı 2: Sorgu bilgileri

AdvancedAppFlow2

9. Şekil. Advanced Extender'da uygulama akışı 2

AdvancedExtenderImpl.init() çağrıldıktan sonra uygulama AdvancedExtenderImpl adresindeki bilgilere göre:

  • Tahmini henüz yakalama gecikmesi: AdvancedExtenderImpl.getEstimatedCaptureLatencyRange(), şu aralığı döndürür: uygulamanın işleme alınmasının uygun olup olmadığını değerlendirmesi için uzantıyı geçerli senaryo için etkinleştirin.

  • Önizleme ve görüntü yakalama için desteklenen çözünürlükler:

    • AdvancedExtenderImpl.getSupportedPreviewOutputResolutions() bir harita döndürür önizleme yüzeyi biçimi için desteklenen boyut listesine resim biçiminin seçin. OEM'ler en az PRIVATE biçimini desteklemelidir.

    • AdvancedExtenderImpl.getSupportedCaptureOutputResolutions() şunu döndürür: desteklenen biçim ve boyutları kontrol edin. OEM'ler her ikisini de desteklemelidir JPEG ve YUV_420_888 biçiminde çıkış.

    • AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions() şunu döndürür: resim analizinde ekstra YUV_420_888 akışı için desteklenen boyutları kullanın. Öğe görüntü analizi YUV yüzeyi desteklenmiyor. getSupportedYuvAnalysisResolutions(), null veya boş bir liste döndürmelidir.

  • Kullanılabilir yakalama isteği anahtarları/sonuçları (extensions-interface 1.3.0'da eklenmiştir): Camera2/X, desteklenen yakalamayı almak için aşağıdaki yöntemleri çağırır uygulamanızdan anahtarları ve sonuç anahtarlarını isteyin:

    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys
    • AdvancedExtenderImpl.getAvailableCaptureResultKeys

Daha fazla bilgi için bkz. Yakalama isteği anahtarlarını ve sonuçlarını destekleyin.

Uygulama akışı 3: Uzantı etkin durumdayken önizleme/yine yakalama

AdvancedAppFlow3

Şekil 10. Advanced Extender'da uygulama akışı 3

Yukarıdaki şemada, önizlemeyi başlatmak için ana akış ve izleme sırasında Gelişmiş Uzatma Türü'dür. Her bir adımı inceleyelim.

  1. SessionProcessorImpl örnek

    Temel Advanced Extender uygulaması SessionProcessorImpl içindedir. özelleştirilmiş oturum yapılandırması sağlamaktan ve Önizlemeyi başlatmak ve isteği yakalamaya devam etmek için istekleri yakalama. AdvancedExtenderImpl.createSessionProcessor(), SessionProcessorImpl örneği.

  2. initSession

    SessionProcessorImpl.initSession(), uzantı için oturumu başlatır. Bu aşamada kaynakları ayırabilir ve CameraCaptureSession hazırlanıyor.

    Giriş parametreleri için Camera2/X, çıkış yüzeyi yapılandırmalarını belirtir önizleme, yine de yakalama ve isteğe bağlı YUV görüntüsü analizi için kullanılabilir. Bu çıkış yüzey yapılandırması (OutputSurfaceImpl) yüzey, boyut ve görüntüyü içerir biçimi (AdvancedExtenderImpl içinde aşağıdaki yöntemlerle alınır):

    • getSupportedPreviewOutputResolutions()
    • getSupportedCaptureOutputResolutions()
    • getSupportedYuvAnalysisResolutions()

    Şunları içeren bir Camera2SessionConfigImpl örneği döndürmeniz gerekir: Camera2OutputConfigImpl örneğin ve kullanılan oturum parametrelerinin listesi CameraCaptureSession yapılandırması için. Sizin sorumluluğunuz Çıkış yüzeylerine doğru kamera görüntülerini çıkarırken Kamera2/X Çıkışı etkinleştirmek için kullanabileceğiniz bazı seçenekler şunlardır:

    • Kamera HAL'sinde işleme: Çıkış yüzeylerini doğrudan ekleyebilirsiniz. SurfaceOutputConfigImpl ile CameraCaptureSession konumuna bazı ipuçları vereceğim. Bu işlem, kameraya sağlanan çıkış yüzeyini yapılandırır. kamera HAL'sinin resmi işlemesine olanak tanır.
    • Ara ImageReader yüzeyi işleniyor (RAW, YUV vb.): Şunu ekleyin: CameraCaptureSession için orta seviye ImageReader ImageReaderOutputConfigImpl örneği.

      Aradaki resimleri işlemeniz ve sonuç görüntüsünü çıkış yüzeyini gösteriyor.

    ziyaret edin.
    • Kamera2 yüzey paylaşımını kullanma: Yüzey paylaşımını başka bir yüzeyle kullanma herhangi bir Camera2OutputConfigImpl örneğini Başka bir tanesinin getSurfaceSharingOutputConfigs() yöntemi Camera2OutputConfigImpl örneği. Yüzey biçimi ve boyutu aynı olmalıdır.

    SurfaceOutputConfigImpl ve dahil tüm Camera2OutputConfigImpl ImageReaderOutputConfigImpl, benzersiz bir kimliğe (getId()) sahip olmalıdır: hedef yüzeyi belirtmek ve resmi şuradan almak için kullanılır: ImageReaderOutputConfigImpl.

  3. onCaptureSessionStart ve RequestProcessorImpl

    CameraCaptureSession başladığında ve Kamera çerçevesi çağırdığında onConfigured(), ardından Camera2/X çağrısı Kamera2 isteği ile SessionProcessorImpl.onCaptureSessionStart() sarmalayıcı RequestProcessImpl. Camera2/X, RequestProcessImpl özelliğini uygular, Bu, yakalama isteklerini yürütmenizi ve ImageReaderOutputConfigImpl kullanılıyorsa resimleri alın.

    RequestProcessImpl API'leri Camera2'ye benzer İsteklerin yürütülmesi açısından CameraCaptureSession API. Farklar şunlardır:

    • Hedef yüzey, Camera2OutputConfigImpl örneği.
    • ImageReader görüntüsünü alma özelliği.

    RequestProcessorImpl.setImageProcessor() öğesini belirli bir ImageProcessorImpl örneğinin kaydedileceği Camera2OutputConfigImpl kimliği resim alır.

    Camera2/X çağrılarından sonra RequestProcessImpl örneği geçersiz hale gelir SessionProcessorImpl.onCaptureSessionEnd().

  4. Önizlemeyi başlatma ve fotoğraf çekme

    Advanced Extender uygulamasında yakalama istekleri gönderebilirsiniz. RequestProcessorImpl arayüzü üzerinden. Camera2/X size şunu bildirir: tekrarlayan önizleme isteğini veya görüntü yakalama sırasını başlatabilirsiniz. SessionProcessorImpl#startRepeating aranıyor ve Sırasıyla SessionProcessorImpl#startCapture. Yakalama göndermeniz gerekiyor isteklerini yerine getirmesi gerekir.

    Camera2/X, yakalama isteği parametrelerini de SessionProcessorImpl#setParameters Bu istek parametrelerini ayarlamanız gerekir (parametreler destekleniyorsa) hem yinelenen hem de tekli isteklerde.

    En az CaptureRequest.JPEG_ORIENTATION ve CaptureRequest.JPEG_QUALITY. extensions-interface 1.3.0, isteği destekler ve sonuç anahtarlarını görebilirsiniz:

    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
    • AdvancedExtenderImpl.getAvailableCaptureResultKeys()

    Geliştiriciler getAvailableCaptureRequestKeys listesindeki anahtarları ayarladığında parametreleri etkinleştirmeniz ve yakalamanın sonuç, getAvailableCaptureResultKeys listesindeki anahtarları içerir.

  5. startTrigger

    SessionProcessorImpl.startTrigger(), tetikleyiciyi şu şekilde başlatmak için çağrılır: CaptureRequest.CONTROL_AF_TRIGGER ve CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER. Göz ardı edebilirsiniz. reklamı yapılmayan istek anahtarlarını yakalama AdvancedExtenderImpl.getAvailableCaptureRequestKeys()

    startTrigger(), extensions-interface 1.3.0 sürümünden itibaren destekleniyor. Google uygulamaların dokunarak odaklamayı ve uzantıları olan flaş özelliğini kullanmasını sağlar.

  6. Temizlik

    Yakalama oturumunu sonlandırdığınızda SessionProcessorImpl.onCaptureSessionEnd(), kapanıştan önce çağrılır CameraCaptureSession. Yakalama oturumu kapatıldıktan sonra Temizliği deInitSession() gerçekleştirir.

Önizleme, görüntü yakalama ve görüntü analizi desteği

Uzantıyı hem önizleme için uygulamanız hem de kullanım alanlarını yakalamanız gerekir. Ancak gecikme, önizlemenin sorunsuz bir şekilde gösterilmesi için çok yüksekse yalnızca fotoğraf çekme işlemi için uygulayın.

Temel Genişletici türünde uzantıyı önizleme için etkinleştirmeye bakılmaksızın, hem ImageCaptureExtenderImpl hem de PreviewExtenderImpl uygulamanız gerekir kullanabilirsiniz. Uygulamalar genellikle YUV akışını kullanarak QR kodu veya metin bulma gibi resim içeriklerine yer verir. Bu kullanım alanını daha iyi desteklemek için için önizleme, fotoğraf çekme ve video izleme özelliklerinin CameraCaptureSession yapılandırması için YUV_420_888 akış. Bunun anlamı şudur: işleyen bir süreç olursa akışı desteklemeniz YUV_420_888 akış.

Gelişmiş Genişletici'de Camera2/X, üç çıkış yüzeyini SessionProcessorImpl.initSession() arama. Bu çıkış yüzeyleri önizleme içindir sırasıyla fotoğraf çekme ve görüntü analizi. Önizlemenin çıkış yüzeylerinde geçerli çıkışı gösterir. Ancak resim için analiz çıktı yüzeyini kullanıyorsanız, yalnızca null olmayan durumlarda çalıştığından emin olun. Eğer uygulama resim analizi akışını desteklemiyorsa, bir resim analiz akışı AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions() konumundaki liste. Bu resim analizi çıkış yüzeyinin her zaman boş kalmasını sağlar: SessionProcessorImpl.initSession()

Video çekimini destekleyin

Mevcut Kamera Uzantısı mimarisi yalnızca önizlemeyi ve aynı anda örnek olarak verilebilir. MediaCodec üzerinde uzantının etkinleştirilmesi desteklenmiyor veya videoyu kaydetmek için MediaRecorder yüzey. Ancak bazı durumlarda önizleme çıkışını kaydetmesine olanak tanır.

MediaCodec ve MediaRecorder yüzeylerinin desteklenmesi inceleniyor.

Uzantıya özel meta veriler

Android 14 ve sonraki sürümler için uzantıya özel meta veriler Kamera uzantısı istemcilerinin uzantıya özel çekim yapıp almasını sağlar ve sonuçları kontrol edebilirsiniz. Özellikle, kamera uzantısı istemciler, kontrol etmek için EXTENSION_STRENGTH yakalama isteği parametresini kullanabilir uzantı gücünü ve EXTENSION_CURRENT_TYPE yakalama sonucunu etkin uzantı türünü belirtir.

Yakalama istekleri

İlgili içeriği oluşturmak için kullanılan EXTENSION_STRENGTH yakalama isteği parametresini uzantının işleme sonrası etkisinin gücünü kontrol eder. İlgili yakalama sonucu, bu parametre ayarlanmazsa varsayılan güç değerini içerir tarafından işleme konulacaktır. Bu parametre aşağıdaki gibi uygulanabilir uzantı türleri:

  • BOKEH: Bulanıklaştırma miktarını kontrol eder.
  • HDR ve NIGHT: Çok kaynaklı resim miktarını ve son bir resimdir.
  • FACE_RETOUCH: Kozmetik iyileştirme ve cilt miktarını kontrol eder yumuşatma.

EXTENSION_STRENGTH parametresi için desteklenen aralık 0 ile arasındadır 100, 0 uzantı işleme olmadığını veya basit geçiş olmadığını gösteriyor ve İşleme etkisinin maksimum uzantı gücünü belirten 100.

EXTENSION_STRENGTH için destek eklemek üzere tedarikçi firmayı kullanın uzantı kitaplığının 1.3.0 sürümünde kullanıma sunulan belirli parametre API'leri arayüzü. Daha fazla bilgi için bkz. getAvailableCaptureRequestKeys().

Sonuçları yakala

İlgili içeriği oluşturmak için kullanılan EXTENSION_CURRENT_TYPE yakalama sonucu, uzantı uygulamalarının müşterilere etkin uzantı hakkında uzantı türü.

AUTO türünü kullanan uzantılar, uzantılar arasında dinamik olarak geçiş yaptığından sahne koşullarına bağlı olarak HDR ve NIGHT gibi türler ve kamera uzantılar uygulamaları aşağıdaki bilgileri görüntülemek için EXTENSION_CURRENT_TYPE kullanabilir: AUTO uzantısı tarafından seçilen mevcut uzantı.

Gerçek zamanlı yine de yakalama gecikme tahmini

Android 14 ve sonraki sürümler için kamera uzantısı istemcileri gerçek zamanlı sorgu gönderebilen ve yine de sahneye göre gecikme tahminlerini yakalayabilir çevre koşullarını karşılamak için getRealtimeStillCaptureLatency(). Bu yöntemi, statik yönteme kıyasla daha doğru tahminler sunar. getEstimatedCaptureLatencyRangeMillis() yöntemidir. Gecikme tahminine dayalı olarak uygulamalar, süreyi atlamaya karar verebilir veya kullanıcılara uzun bir süre hakkında bilgi vermeye gösteren bir tekniktir.

CameraExtensionSession.StillCaptureLatency latency;

latency = extensionSession.getRealtimeStillCaptureLatency();

// The capture latency from ExtensionCaptureCallback#onCaptureStarted() until ExtensionCaptureCallback#onCaptureProcessStarted().

latency.getCaptureLatency();

// The processing latency from  ExtensionCaptureCallback#onCaptureProcessStarted() until  the processed frame returns to the client.

latency.getProcessingLatency();

Yine de gecikme tahminlerini gerçek zamanlı olarak yakalamak için şu:

İşleme ilerlemesine ait geri çağırmaları yakala

Android 14 ve sonraki sürümler için kamera uzantısı istemcileri uzun süre devam eden yakalama işleminin ilerlemesi için geri çağırma alabilir anlamına gelir. Uygulamalar, kullanıcılara ne kadar iyi karşıladığını görebileceksiniz.

Uygulamalar bu özelliği entegre etmek için aşağıdaki kodu kullanabilir:

import android.hardware.camera2.CameraExtensionSession.
ExtensionCaptureCallback;

{
…
  class AppCallbackImpl extends ExtensionCaptureCallback {
…
    @Override
    public void onCaptureProcessProgressed(
      @NonNull CameraExtensionSession session,
      @NonNull CaptureRequest request,
      @IntRange(from = 0, to = 100) int progress) {
      // Update app UI with current progress
    }
  }
…
}

Yakalama işleme ilerlemesi geri çağırmalarının desteklenmesi için uzantı tedarikçiniz uygulama, mevcut ilerleme durumuyla birlikte aşağıdaki geri çağırmaları çağırmalıdır değer:

Görüntüleme sonrası görüntü yakalama devam ediyor

Android 14 ve sonraki sürümlerde kamera uzantıları aşağıdakileri kullanarak bir yayın sonrası (önizleme resmi) sağlayın: setPostviewOutputConfiguration. Uygulamalar, kullanıcı deneyimini iyileştirmek için görüntüleme sonrası resmi bir uzantı işleme gecikmesinde artış yaşıyorsa yer tutucusu ve son resim hazır olduğunda resmi değiştirin. Uygulamalar yapılandırabilir ve aşağıdaki referans kodunu kullanarak görüntüleme sonrası yakalama isteği gönderin:

{
…
if (!CameraExtensionCharacteristics.isPostviewAvailable()) {
    continue;
}
…
ExtensionSessionConfiguration extensionConfiguration = new
        ExtensionSessionConfiguration(
                CameraExtensionCharacteristics.EXTENSION_NIGHT,
                outputConfig,
                backgroundExecutor,
                extensionSessionStateCallback
    );

extensionConfiguration.setPostviewOutputConfiguration(
    postviewImageOutput);
…
CaptureRequest.Builder captureRequestBuilder =
    cameraDevice.createCaptureRequest(
        CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(stillImageReader.getSurface());
captureRequestBuilder.addTarget(postviewImageSurface);

CaptureRequest captureRequest = captureRequestBuilder.build();
…
}

Görüntüleme sonrası görüntü yakalamayı desteklemek için tedarikçi uygulamanızın takip etmek için:

SurfaceView çıkışı desteği

Android 14 ve sonraki sürümler için kamera uzantısı istemcileri kullanarak güç ve performans açısından optimize edilmiş önizleme oluşturma yollarını kullanabilir. SurfaceView tekrarlayan istekler için önizleme çıkışı örneği.

SurfaceView çıkışını desteklemek için tedarikçi firma uzantısı uygulamanız SurfaceView örneğe akışla önizleme yapabilir ve önizleme çıkışı yapabilir. Alıcı: bunun desteklendiğini doğrulayın, SurfaceViewExtensionPreviewTest.java çalıştırın CTS modülü.

Tedarikçi firmaya özel oturum türleri

Bu özellik, varsayılan değer yerine dahili kamera çekimi oturumunda ayarlanacak tedarikçi firmaya özel bir oturum türü seçmek için tedarikçi firma uzantısı uygulamalarını etkinleştirir.

Bu özellik tamamen çerçeve ve tedarikçi yığını içinde çalışır ve istemci/herkese açık API etkisine sahip değildir.

Tedarikçi firmaya özel bir oturum türü seçmek için uzantı kitaplıklarınız için aşağıdakileri uygulayın: * Temel uzantılar için ExtenderStateListener.onSessionType() * Gelişmiş uzantılar için Camera2SessionConfigImpl.getSessionType()

Uzantıların arayüzü sürüm geçmişi

Aşağıdaki tabloda, Kamera Uzantısı arayüzü sürüm geçmişi gösterilmektedir. Siz tedarikçi kitaplığını her zaman en son sürümde uygulamalısınız.

Sürüm Ek özellikler
1.0.0
  • Sürüm doğrulama
    • ExtensionVersionImpl
  • Uzatma Aparatı
    • PreviewExtenderImpl
    • ImageCaptureExtenderImpl
    • Processor
      • PreviewImageProcessorImpl
      • CaptureProcessorImpl
      • RequestUpdateProcessorImpl
1.1.0
  • Kitaplık başlatma
    • InitializerImpl
  • Desteklenen çözünürlükleri göster
    • PreviewExtenderImpl.getSupportedResolutions
    • ImageCaptureExtenderImpl.getSupportedResolutions
1.2.0
  • AdvancedExtender
    • AdvancedExtenderImpl
    • SessionProcessorImpl
  • Tahmini yakalama gecikmesini alın
    • ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
1.3.0
  • Desteklenen yakalama isteği anahtarlarını/sonuç anahtarlarını kullanıma sunma
    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys ve getAvailableCaptureResultKeys
    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys ve getAvailableCaptureResultKeys
    • PreviewImageProcessorImpl ve CaptureProcessorImpl içinde ProcessResultImpl sürecek yeni process() görüşmesi
    • Destek tetikleyici türü isteği
      • AdvancedExtenderImpl.startTrigger
1.4.0
  • Uzantıya özel meta veriler
  • Dinamik yakalama gecikme tahminleri
  • İşleme ilerlemesine ait geri çağırmaları yakala
  • Görüntüleme sonrası görüntü yakalama devam ediyor
  • SurfaceView çıkışı için destek
  • Tedarikçi firmaya özel oturum türleri

Referans uygulaması

Aşağıdaki referans OEM tedarikçi kitaplığı uygulamalarını frameworks/ex.

  • advancedSample: Advanced Extender'ın temel bir uygulaması.

  • sample: Temel Genişletici'nin temel bir uygulaması.

  • service_based_sample: Barındırmayı gösteren bir uygulama Kamera Uzantıları Service Bu uygulama aşağıdaki bileşenleri içerir:

    • oem_library: Camera2 ve CameraX Uzantıları API'leri için Kamera Uzantıları OEM kitaplığı Extensions-Interface uygulayan bir dizindir. Bu yöntem, kullanıcının aramaları Extensions-Interface kaynağından hizmete yönlendirir. Bu kitaplık ile iletişim kurmak için AIDL dosyaları ve sarmalayıcı sınıfları geliştirmenizi sağlar.

      Advanced Extender varsayılan olarak etkindir. Temel Genişletici'yi etkinleştirmek için: ExtensionsVersionImpl#isAdvancedExtenderImplemented değerini, döndürülecek şekilde değiştirin false.

    • extensions_service: Uzantı Hizmeti'nin örnek bir uygulaması. Uygulamanızı ekleyin burayı tıklayın. Hizmette kullanılacak arayüz benzerdir Şuraya: Extensions-Interface. Örneğin, IAdvancedExtenderImpl.Stub aşağıdakilerle aynı işlemleri gerçekleştirir: AdvancedExtenderImpl. ImageWrapper ve TotalCaptureResultWrapper Image ve TotalCaptureResult öğelerini ayrıştırılabilir hale getirmek için gereklidir.

Bir cihazda satıcı kitaplığını ayarlama

OEM tedarikçi kitaplığı, bir uygulamada yerleşik olarak bulunmaz; Cihazdan yüklendi kamera2/X ile çalışma zamanında doğru şekilde ilerliyor. CameraX'te <uses-library> etiketi, tanımlanan androidx.camera.extensions.impl kitaplığının AndroidManifest.xml dosyası, CameraX'in bir bağımlılığıdır vecamera-extensions çalışma zamanında yüklendi. Kamera2'de çerçeve, uygulamanızın <uses-library> öğesinin aynı şekilde yüklendiğini de Çalışma zamanında androidx.camera.extensions.impl kitaplığı.

Bu seçenek, uzantı kullanan üçüncü taraf uygulamalarının OEM'yi otomatik olarak yüklemesine olanak tanır. yardımcı olur. Uygulamaların cihazlarda çalışabilmesi için OEM kitaplığı isteğe bağlı olarak işaretlendi bu uygulamaları kullanabilirsiniz. Bir uygulama kamera kullanmaya çalıştığında Camera2/X bu davranışı otomatik olarak uygular (cihaz üreticisinin OEM kitaplığını cihaza yerleştirdiği sürece) böylece uygulama tarafından keşfedilebilir.

Bir cihazda OEM kitaplığını oluşturmak için aşağıdakileri yapın:

  1. <uses-library> etiketinin gerektirdiği izin dosyasını ekleyin ve şu biçimi kullanarak: /etc/permissions/ANY_FILENAME.xml. Örneğin, örnek, /etc/permissions/camera_extensions.xml. Bu klasördeki dosyalar dizini, <uses-library> dizininde adlandırılmış kitaplığın cihazdaki gerçek dosya yolunu gösterir.
  2. Dosyaya gerekli bilgileri eklemek için aşağıdaki örneği kullanın.

    • name, androidx.camera.extensions.impl olmalıdır kameraX'ın aradığı kitaplığa kavuşun.
    • file, uzantıları uygulama (örneğin, /system/framework/androidx.camera.extensions.impl.jar) tıklayın.
    <?xml version="1.0" encoding="utf-8"?>
    <permissions>
        <library name="androidx.camera.extensions.impl"
                 file="OEM_IMPLEMENTED_JAR" />
    </permissions>
    

Android 12 veya sonraki sürümleri çalıştıran CameraX'i destekleyen cihazlar uzantıların ro.camerax.extensions.enabled özelliği true, Böylece cihazın uzantıları destekleyip desteklemediğini sorgulayabilirsiniz. Bunu yapmak için cihaz oluşturma dosyasına aşağıdaki satırı ekleyin:

PRODUCT_VENDOR_PROPERTIES += \
    ro.camerax.extensions.enabled=true \

Doğrulama

OEM tedarikçi kitaplığını kullanımınızı test etmek için geliştirme aşamasında kullanmak için androidx-main/camera/integration-tests/extensionstestapp/ çeşitli tedarikçi firma uzantılarından geçen bir test aracıdır.

Uygulamanızı tamamladıktan sonra, kamera uzantıları doğrulama aracı otomatik ve manuel testler çalıştırarak tedarikçi kitaplığının test edebilirsiniz.

Genişletilmiş sahne modu ile kamera uzantılarının karşılaştırması

Bokeh uzantısı için, uzantıyı kamera uzantısı kullanarak pozlamanın yanı sıra, genişletilmiş sahne modunu kullanarak uzantıyı pozlayabilir. "the" CONTROL_EXTENDED_SCENE_MODE tuşuna basın. Uygulamayla ilgili daha fazla ayrıntı için Kamera bokeh'si başlıklı makaleye bakın.

Genişletilmiş sahne modunun, şunun kamera uzantılarına kıyasla daha az kısıtlaması vardır: Camera2 uygulamaları. Örneğin, genişletilmiş sahne modunu şurada etkinleştirebilirsiniz: Esnek akışı destekleyen normal bir CameraCaptureSession örneği istek parametrelerini yakalamamıza ve yakalamanıza olanak tanır. Öte yandan kamera uzantıları yalnızca sabit bir akış türü grubunu destekler ve yakalama desteği sınırlıdır istek parametreleridir.

Genişletilmiş sahne modunun olumsuz tarafı, bunu yalnızca sahneye Yani kamera HAL'si, yani tüm kameralarda çalışması için uygulama geliştiricilerin kullanımına sunulan dikey kontroller.

Hem genişletilmiş sahne modunu hem de Kamera'yı kullanarak bokeh pozlamanızı öneririz Uygulamaların bokeh'i etkinleştirmek için belirli bir API kullanmayı tercih edebileceği için uzantılar. Genişletilmiş sahne modunun en yaygını olduğu için önce genişletilmiş sahne modunu kullanmanızı öneririz. uygulamaların bokeh uzantısını etkinleştirmesi için esnek bir yol sunuyor. Daha sonra kamera uzantıları arayüzü genişletilmiş sahne moduna göre değişir. Uygulama kamera HAL'sinde bokeh resimler, örneğin yayın gerektirmesi nedeniyle zordur. işlemci olarak çalıştırıyorsanız, uygulama katmanını bokeh uzantısını kullanabilirsiniz.

Sık sorulan sorular (SSS)

API düzeylerinde herhangi bir kısıtlama var mı?

Evet. Bu durum, OEM tarafından gerekli kılınan Android API özellik grubuna bağlıdır yardımcı olur. Örneğin, ExtenderStateListener.onPresetSession(), SessionConfiguration.setSessionParameters() çağrısına ihtiyacınız olacaktır. Bu çağrı yalnızca API düzeyinde kullanılabilir 28 yaş ve üzeri. Belirli arayüz yöntemleriyle ilgili ayrıntılar için API referans belgeleri.