I produttori di dispositivi possono esporre estensioni quali bokeh, modalità notturna e HDR agli sviluppatori di terze parti tramite l'interfaccia delle estensioni della fotocamera fornita da nella libreria dei fornitori OEM. Gli sviluppatori possono utilizzare API Camera2 Extensions e l'API CameraX Extensions per accedere alle estensioni implementate nella libreria dei fornitori OEM.
Per un elenco di estensioni supportate, che è lo stesso per Fotocamera2 e CameraX, vedi API CameraX Extensions. Se vuoi aggiungere un'estensione, segnala un bug al Issue Tracker.
Questa pagina descrive come implementare e attivare la libreria di fornitori OEM sui dispositivi mobili.
Architettura
Il seguente diagramma descrive l'architettura delle estensioni della fotocamera
interfaccia utente o extensions-interface
:
Figura 1. Diagramma dell'architettura delle estensioni della fotocamera
Come mostrato nel diagramma, per supportare le estensioni della fotocamera, devi:
implementare il valore extensions-interface
fornito dalla libreria dei fornitori dell'OEM. Il tuo
La libreria dei fornitori OEM abilita due API:
API CameraX Extensions e
API Camera2 Extensions,
che vengono utilizzati rispettivamente dalle app CameraX e Camera2 per accedere
le estensioni del fornitore.
Implementa la libreria dei fornitori OEM
Per implementare la libreria dei fornitori OEM, copia il
camera-extensions-stub
in un progetto della libreria di sistema. Questi file definiscono le estensioni della fotocamera
a riga di comando.
La camera-extensions-stub
di file sono suddivisi nelle seguenti categorie:
File di interfaccia essenziali (non modificare)
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
Implementazioni obbligatorie (aggiungi la tua implementazione)
ExtensionVersionImpl.java
InitializerImpl.java
Classi di extender bokeh (implementalo se è supportata l'estensione Bokeh)
BokehImageCaptureExtenderImpl.java
BokehPreviewExtenderImpl.java
advanced/BokehAdvancedExtenderImpl.java
Classi degli extender notturni (implementali se è supportata l'estensione notturna)
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
advanced/NightAdvancedExtenderImpl.java
Classi di extender automatici (implementalo se è supportata l'estensione automatica)
AutoImageCaptureExtenderImpl.java
AutoPreviewExtenderImpl.java
advanced/AutoAdvancedExtenderImpl.java
Classi di extender HDR (implementalo se è supportata l'estensione HDR)
HdrImageCaptureExtenderImpl.java
HdrPreviewExtenderImpl.java
advanced/HdrAdvancedExtenderImpl.java
Classi dell'extender Ritocco viso (implementalo se è supportata l'estensione Ritocco viso)
BeautyImageCaptureExtenderImpl.java
BeautyPreviewExtenderImpl.java
advanced/BeautyAdvancedExtenderImpl.java
Utilità (facoltativa, può essere eliminata)
advanced/Camera2OutputConfigImplBuilder.java
advanced/Camera2SessionConfigImplBuilder.java
Non è necessario fornire un'implementazione per ogni estensione. Se
non implementare un'estensione, imposta isExtensionAvailable()
in modo che restituisca false
o
rimuovere le classi Extender corrispondenti. Estensioni Camera2 e CameraX
Le API segnalano all'app che l'estensione non è disponibile.
Vediamo come le API Camera2 e CameraX interagiscono con il dalla libreria del fornitore per attivare un'estensione. Il seguente diagramma illustra le flusso end-to-end utilizzando l'estensione Notte come esempio:
Figura 2. Implementazione delle estensioni di notte
Verifica della versione:
Camera2/X chiama
ExtensionVersionImpl.checkApiVersion()
per garantire che La versioneextensions-interface
implementata dall'OEM è compatibile con Camera2/X versioni supportate.Inizializzazione della libreria dei fornitori:
InitializerImpl
utilizza un metodoinit()
che inizializza la libreria del fornitore. Camera2/X completa l'inizializzazione prima di accedere alle classi Extender.Creare istanze di classi Extender:
Crea un'istanza per le classi Extender per l'estensione. Esistono due estensori tipi: estensore di base ed estensore avanzato. Devi implementarne uno Tipo di estensore per tutte le estensioni. Per ulteriori informazioni, vedi Extender di base ed extender avanzato.
Camera2/X crea un'istanza e interagisce con le classi Extender per recuperare informazioni e attivare l'estensione. Per una determinata estensione, Camera2/X può creare più volte un'istanza per le classi Extender. Di conseguenza, non devi l'inizializzazione più impegnativa nel costruttore o nella chiamata
init()
. Esegui le il lavoro pesante solo quando la sessione della videocamera sta per avvia, ad esempio quandoonInit()
viene chiamato in Basic Extender oinitSession()
viene chiamato in Advanced Extender.Per l'estensione Night, viene creata un'istanza delle seguenti classi Extender il tipo di estensore di base:
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
Per il tipo di extender avanzato:
NightAdvancedExtenderImpl.java
Verifica la disponibilità delle estensioni:
Prima di attivare l'estensione,
isExtensionAvailable()
controlla se è disponibile per l'ID fotocamera specificato tramite l'estensione in esecuzione in un'istanza Compute Engine.Inizializza l'extender con le informazioni della fotocamera:
Camera2/X chiama
init()
sull'istanza Extender e le passa alla fotocamera ID eCameraCharacteristics
.Informazioni sulla query:
Chiama la classe Extender per recuperare informazioni come soluzioni, acquisire comunque la latenza stimata e acquisire le chiavi di richiesta l'estensione in preparazione all'attivazione dell'estensione.
Abilita l'estensione sull'extender:
La classe Extender fornisce tutte le interfacce necessarie per abilitare . Offre un meccanismo per agganciare l'OEM l'implementazione nella pipeline Camera2, ad esempio inserendo una richiesta di acquisizione parametri o abilitare un post-processore.
Per il tipo Advanced Extender, Camera2/X interagisce con
SessionProcessorImpl
per attivare l'estensione. Camera2/X recuperaSessionProcessorImpl
mediante la chiamata dicreateSessionProcessor()
sul Estensore.
Le seguenti sezioni descrivono in maggiore dettaglio il flusso dell'estensione.
Verifica della versione
Quando carichi la libreria del fornitore OEM dal dispositivo in fase di runtime, Camera2/X
consente di verificare se la libreria è compatibile con la versione extensions-interface
.
extensions-interface
utilizza il controllo delle versioni semantico oppure
MAJOR.MINOR.PATCH, ad esempio 1.1.0 o 1.2.0. Tuttavia, solo
principale e secondaria vengono utilizzate durante la verifica della versione.
Per verificare la versione, Camera2/X chiama
ExtensionVersionImpl.checkApiVersion()
con i servizi
Versione extensions-interface
. Camera2/X utilizza quindi la versione segnalata
libreria OEM per determinare se è possibile attivare l'estensione e quali funzionalità
che deve richiamare.
Compatibilità con le versioni principali
Se le versioni principali dell'interfaccia dell'estensione sono diverse tra Camera2/X e la libreria del fornitore, pertanto è considerata incompatibile e l'estensione è disabilitata.
Compatibilità con le versioni precedenti
Finché la versione principale è identica, Camera2/X garantisce
compatibilità con le versioni precedenti con le librerie dei fornitori OEM create con
extensions-interface
versioni. Ad esempio, se Camera2/X supporta
extensions-interface
1.3.0, le librerie dei fornitori OEM che hanno implementato la versione 1.0.0,
1.1.0 e 1.2.0 sono ancora compatibili. Ciò significa anche che dopo aver implementato
una specifica versione della libreria del fornitore, Camera2/X fa in modo che
è compatibile con le versioni precedenti di extension-interface
.
Compatibilità con l'inoltro
Inoltra la compatibilità con le librerie dei fornitori delle versioni più recenti di extensions-interface
dipende da te, l'OEM. Se hai bisogno di alcune funzionalità
per implementare le estensioni,
è consigliabile attivare le estensioni a partire da una determinata versione. In questo
in questo caso, puoi restituire la versione supportata di extensions-interface
quando
La versione della libreria Camera2/X soddisfa i requisiti. Se le versioni Camera2/X
non sono supportati, puoi restituire una versione incompatibile come 99.0.0
disattivare le estensioni.
Inizializzazione della libreria del fornitore
Dopo aver verificato la versione extensions-interface
implementata dall'OEM
, Camera2/X avvia il processo di inizializzazione. La
Il metodo InitializerImpl.init()
segnala alla libreria OEM che un'app sta provando
per utilizzare le estensioni.
Camera2/X non effettua altre chiamate alla libreria OEM (a parte il controllo della versione)
finché la libreria di fornitori dell'OEM non chiama OnExtensionsInitializedCallback.onSuccess()
per notificare il completamento dell'inizializzazione.
Devi implementare
InitializerImpl
a partire da extensions-interface
1.1.0. Camera2/X salta l'inizializzazione della libreria
se la libreria dei fornitori dell'OEM implementa extensions-interface
1.0.0.
Extender di base ed extender avanzato
Esistono due tipi di implementazione di extensions-interface
: extender di base e
Extender avanzato. Advanced Extender è supportato da
extensions-interface
1.2.0.
Implementate Basic Extender per le estensioni che elaborano le immagini nell'HAL della fotocamera oppure usano un post-processore in grado di elaborare i flussi YUV.
Implementa Advanced Extender per le estensioni che richiedono la personalizzazione della videocamera2 la configurazione dello streaming e inviare richieste di acquisizione in base alle esigenze.
Consulta la seguente tabella per il confronto:
Estensore di base | Extender avanzato | |
---|---|---|
Configurazioni degli stream | Fissa Anteprima: PRIVATE o YUV_420_888 (se esiste un processore) Acquisizione ancora: JPEG o YUV_420_888 (se esiste un processore)
|
Personalizzabile dall'OEM. |
Invio della richiesta di acquisizione | Solo Camera2/X può inviare richieste di acquisizione. Puoi impostare i parametri su queste richieste. Quando viene fornito un processore per l'acquisizione delle immagini, Camera2/X puoi inviare più richieste di acquisizione e inviare tutte le immagini e i risultati al processore. | Ti viene fornita un'istanza RequestProcessorImpl
eseguire la richiesta di acquisizione di camera2 e ottenere risultati e immagini.
Camera2/X richiama |
Hook nella pipeline della videocamera |
|
|
Adatto a | Estensioni implementate nell'HAL della fotocamera o in un processore che elabora Immagini YUV. |
|
Versione API supportata | Estensioni Camera2: Android 13 o versioni successive Estensioni di CameraX: camera-extensions 1.1.0 o versioni successive |
Estensioni di Camera2: Android 12L o versioni successive Estensioni di CameraX: camera-extensions 1.2.0-alpha03 o versioni successive |
Flussi di app
La tabella seguente mostra tre tipi di flussi di app e i relativi corrispondenti all'API Camera Extensions. Mentre Camera2/X offre API, devi implementare correttamente la libreria dei fornitori per supportarli che descrivono più dettagliatamente in una sezione successiva.
Estensioni Fotocamera 2 | Estensioni di CameraX | |
---|---|---|
Disponibilità delle estensioni di query | CameraExtensionCharacteristics
.getSupportedExtensions
|
ExtensionsManager.
isExtensionAvailable
|
Informazioni sulle query | CameraExtensionCharacteristics.
getExtensionSupportedSizes
CameraExtensionCharacteristics.
getEstimatedCaptureLatencyRangeMillis
CameraExtensionCharacteristics.
getAvailableCaptureRequestKeys
CameraExtensionCharacteristics.
getAvailableCaptureResultKeys
|
ExtensionsManager.
getEstimatedCaptureLatencyRange
CameraX gestisce il resto delle informazioni all'interno della raccolta. |
Visualizzare l'anteprima e acquisire ancora foto con l'estensione abilitata | CameraDevice.
createExtensionSession
|
val cameraSelector = ExtensionsManager.
getExtensionEnabledCameraSelector
|
Estensore di base
L'interfaccia dell'estensione di base fornisce ganci in diverse posizioni della videocamera una pipeline o un blocco note personalizzato. Ogni tipo di estensione ha classi di estensione corrispondenti necessarie agli OEM. da implementare.
La tabella seguente elenca le classi di estensioni che gli OEM devono implementare per ciascuna estensione:
Classi di extender da implementare | |
---|---|
Notte | NightPreviewExtenderImpl.java
|
HDR | HdrPreviewExtenderImpl.java
|
Automatica | AutoPreviewExtenderImpl.java
|
Bokeh | BokehPreviewExtenderImpl.java
|
Ritocco viso | BeautyPreviewExtenderImpl.java
|
Utilizziamo PreviewExtenderImpl
e ImageCaptureExtenderImpl
come segnaposto
nell'esempio che segue. Sostituiscili con i nomi dei clienti effettivi
file che stai implementando.
Basic Extender ha le seguenti capacità:
- Inserisci i parametri di sessione durante la configurazione di
CameraCaptureSession
(onPresetSession
). - Invia una notifica relativa agli eventi di inizio e chiusura della sessione di acquisizione e invia un singolo
richiesta di notifica all'HAL con i parametri restituiti (
onEnableSession
,onDisableSession
). - Inserisci i parametri di acquisizione per la richiesta
(
PreviewExtenderImpl.getCaptureStage
,ImageCaptureExtenderImpl.getCaptureStages
). - Aggiungi processori per l'anteprima e acquisisci comunque immagini in grado di essere elaborate
YUV_420_888
stream.
Vediamo in che modo Camera2/X richiama extensions-interface
per raggiungere i tre
flussi di app indicati sopra.
Flusso di app 1: controllare la disponibilità delle estensioni
Figura 3. Flusso di app 1 su Basic Extender
In questo flusso, Camera2/X chiama direttamente il metodo isExtensionAvailable()
di
sia PreviewExtenderImpl
che ImageCaptureExtenderImpl
senza chiamare
init()
. Entrambe le classi di estensione devono restituire true
per abilitare le estensioni.
Questo è spesso il primo passaggio in cui le app controllano se l'estensione specifica sia supportato per un determinato ID videocamera prima di attivare l'estensione. Questo accade perché alcune estensioni sono supportate solo su determinati ID videocamera.
Flusso di app 2: informazioni sulle query
Figura 4. Flusso di app 2 su Basic Extender
Dopo aver determinato se l'estensione è disponibile, le app devono eseguire query le seguenti informazioni prima di attivare l'estensione.
Intervallo di latenza di acquisizione ancora:
ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
restituisce l'intervallo di la latenza di acquisizione affinché l'app valuti se è opportuno attivare l'estensione per lo scenario attuale.Dimensioni supportate per la piattaforma di anteprima e di acquisizione:
ImageCaptureExtenderImpl.getSupportedResolutions
ePreviewExtenderImpl.getSupportedResolutions
restituisce un elenco di formati dell'immagine e Le dimensioni supportate per il formato e le dimensioni della superficie.Chiavi di richiesta e risultati supportate: Camera2/X richiama i seguenti metodi per recuperare l'acquisizione supportata le chiavi di richiesta e le chiavi dei risultati della tua implementazione:
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
ImageCaptureExtenderImpl.getAvailableCapturetResultKeys
Camera2/X chiama sempre init()
su queste classi di extender prima di eseguire la query
per ulteriori informazioni.
Flusso di app 3: anteprima/acquisizione di fotogrammi con estensione abilitata (implementazione HAL)
Figura 5. Flusso di app 3 su Basic Extender
Il diagramma riportato sopra illustra il flusso principale per attivare l'anteprima e l'acquisizione con un'estensione senza alcun processore. Ciò significa che la videocamera HAL elabora l'estensione.
In questo flusso, la Fotocamera 2/X chiama prima il numero init()
e poi onInit
per avvisarti
che una sessione della videocamera sta per iniziare con le estensioni specificate.
Puoi eseguire l'inizializzazione più impegnativa in onInit()
.
Durante la configurazione di CameraCaptureSession
, Camera2/X richiama
onPresetSession
per ottenere i parametri di sessione. Al termine della sessione di acquisizione
configurata correttamente, Camera2/X richiama onEnableSession
restituendo un
CaptureStageImpl
che contiene i parametri di acquisizione. Fotocamera2/X
invia immediatamente una singola richiesta con questi parametri di cattura per
HAL Analogamente, prima di chiudere la sessione di acquisizione, Camera2/X richiama
onDisableSession
, quindi invia una singola richiesta con l'acquisizione restituita
parametri.
La richiesta ricorrente attivata da Camera2/X contiene i parametri della richiesta
restituito da PreviewExtenderImpl.getCaptureStage()
. Inoltre,
Capture contiene i parametri restituiti
ImageCaptureExtenderImpl.getCaptureStages()
.
Infine, Camera2/X richiama onDeInit()
al termine della sessione di fotocamera.
Puoi svincolare le risorse in onDeinit()
.
Anteprima processore
Oltre all'HAL della fotocamera, puoi anche implementare estensioni in un processore.
Implementa PreviewExtenderImpl.getProcessorType
per specificare il tipo di processore
come spiegato di seguito:
PROCESSOR_TYPE_NONE
: nessun processore. Le immagini vengono elaborate nella fotocamera HALPROCESSOR_TYPE_REQUEST_UPDATE_ONLY
: il tipo di processore ti consente di Aggiornare la richiesta ricorrente con i nuovi parametri della richiesta di acquisizione in base al ultimoTotalCaptureResult
.PreviewExtenderImpl.getProcessor
deve restituire unRequestUpdateProcessorImpl
che elabora l'istanzaTotalCaptureResult
e restituisce unCaptureStageImpl
istanza per aggiornare la richiesta ricorrente.PreviewExtenderImpl.getCaptureStage()
dovrebbe anche riflettere il risultato di l'elaborazione e restituirà ilCaptureStageImpl
più recente.PROCESSOR_TYPE_IMAGE_PROCESSOR
: questo tipo ti consente di implementare una di elaborazione per elaborareYUV_420_888
immagini e scrivere l'output in un PiattaformaPRIVATE
.Devi implementare e restituire un
PreviewImageProcessorImpl
inPreviewExtenderImpl.getProcessor
. Il responsabile del trattamento per l'elaborazione diYUV_420_888
immagini di input. Dovrebbe scrivere l'output Formato di anteprimaPRIVATE
. Fotocamera2/X utilizza invece una superficieYUV_420_888
diPRIVATE
per configurareCameraCaptureSession
per l'anteprima.Vedi l'illustrazione seguente per il flusso:
Figura 6. Visualizza l'anteprima del flusso con PreviewImageProcessorImpl
L'interfaccia PreviewImageProcessorImpl
estende ProcessImpl
e ha
tre metodi importanti:
onOutputSurface(Surface surface, int imageFormat)
imposta la superficie di output per il processore. PerPreviewImageProcessorImpl
,imageFormat
è un pixel comePixelFormat.RGBA_8888
.onResolutionUpdate(Size size)
imposta le dimensioni dell'immagine di input.onImageFormatUpdate(int imageFormat)
imposta il formato dell'immagine dell'input dell'immagine. Al momento il valore può essere soloYUV_420_888
.
Processore per l'acquisizione di immagini
Per l'acquisizione di immagini statiche, puoi implementare un processore restituendo un
CaptureProcessorImpl
utilizzando ImageCaptureExtenderImpl.getCaptureProcessor
. Il processore è
responsabile di elaborare un elenco di YUV_420_888
immagini acquisite e
TotalCaptureResult
e scrive l'output su una piattaforma YUV_420_888
.
Puoi tranquillamente presumere che l'anteprima sia abilitata e in esecuzione prima di inviare acquisire ancora la richiesta.
Osserva il flusso nel diagramma seguente:
Figura 7. Acquisisci ancora il flusso con CaptureProcessorImpl
Camera2/X utilizza una superficie in formato
YUV_420_888
per l'acquisizione di fotogrammi da configurare la sessione di acquisizione. Camera2/X preparaCaptureProcessorImpl
chiamando il numero:CaptureProcessorImpl.onImageFormatUpdate()
conYUV_420_888
.CaptureProcessorImpl.onResolutionUpdate()
con le dimensioni dell'immagine di input.CaptureProcessorImpl.onOutputSurface()
con outputYUV_420_888
superficie.
ImageCaptureExtenderImpl.getCaptureStages
restituisce un elenco diCaptureStageImpl
, in cui ogni elemento viene mappato a un'istanzaCaptureRequest
con parametri di acquisizione inviate da Camera2/X. Ad esempio, se restituisce un elenco di treCaptureStageImpl
istanze, Camera2/X invia tre richieste di acquisizione con i parametri di acquisizione corrispondenti utilizzandocaptureBurst
tramite Google Cloud CLI o tramite l'API Compute Engine.Le immagini ricevute e
TotalCaptureResult
istanze sono raggruppate insieme e inviato aCaptureProcessorImpl
per l'elaborazione.CaptureProcessorImpl
scrive l'immagine del risultato (formatoYUV_420_888
) nella superficie di output specificata dalla chiamataonOutputSurface()
. Camera2/X lo converte in immagini JPEG, se necessario.
Supporto per le chiavi di richiesta di acquisizione e i risultati
Oltre all'anteprima e all'acquisizione della fotocamera, le app possono impostare lo zoom, parametri flash o attivare un tocco per mettere a fuoco. Questi parametri potrebbero non essere compatibili con l'implementazione delle estensioni.
I seguenti metodi sono stati aggiunti a extensions-interface
1.3.0 per consentire
di esporre i parametri supportati dalla tua implementazione:
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys()
restituisce il valore e acquisire chiavi di richiesta di acquisizione supportate dalla tua implementazione.ImageCaptureExtenderImpl.getAvailableCaptureResultKeys()
restituisce il valore delle chiavi dei risultati dell'acquisizione contenute nel risultato dell'acquisizione.
Se la fotocamera HAL elabora l'estensione, Camera2/X recupera l'acquisizione
porta a CameraCaptureSession.CaptureCallback
. Tuttavia, se
il processore è implementato, Camera2/X recupera i risultati dell'acquisizione
ProcessResultImpl
, che viene passato al process()
in
PreviewImageProcessorImpl
e
CaptureProcessorImpl
Sei responsabile della segnalazione
il risultato dell'acquisizione tramite ProcessResultImpl
a Fotocamera2/X.
Consulta la definizione dell'interfaccia CaptureProcessorImpl
di seguito come esempio.
In extensions-interface
1.3.0 o versioni successive, viene richiamata la seconda chiamata a process()
:
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);
}
Per operazioni comuni della fotocamera come zoom, tocco per mettere a fuoco, flash ed esposizione compensazione, consigliamo di supportare i seguenti tasti per entrambe le acquisizioni richiedi e acquisisci il risultato:
- Zoom:
- .
CaptureRequest#CONTROL_ZOOM_RATIO
CaptureRequest#SCALER_CROP_REGION
- Tocco per mettere a fuoco:
- .
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
- Compensazione dell'esposizione:
- .
CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION
Per gli extender di base che implementano la versione 1.2.0 o versioni precedenti,
L'API Extensions supporta esplicitamente tutte le chiavi precedenti. Per
extensions-interface
1.3.0, sia CameraX che Camera2 rispettano l'elenco restituito
e supportare solo le chiavi che contiene. Ad esempio, se decidi di restituire
solo CaptureRequest#CONTROL_ZOOM_RATIO
e
CaptureRequest#SCALER_CROP_REGION
nell'implementazione 1.3.0,
significa che per l'app è supportato solo lo zoom e il tocco per mettere a fuoco, il flash e l'esposizione
non sono ammessi compensi.
Extender avanzato
Advanced Extender è un tipo di implementazione del fornitore basato sull'API Camera2.
Questo tipo di extender è stato aggiunto in extensions-interface
1.2.0. In base a
il produttore del dispositivo, le estensioni possono essere implementate a livello di app
che dipende dai seguenti fattori:
Configurazione dello stream personalizzata:configura stream personalizzati come lo stream RAW o avere più stream per ID videocamera fisici diversi.
Capacità di inviare richieste Camera2: supporta un'interazione complicata. logica in grado di inviare richieste di acquisizione con parametri basati sui risultati richieste precedenti.
Advanced Extender fornisce un wrapper, o un livello intermedio, per personalizzare la configurazione dello stream e inviare richieste di acquisizione on demand.
File da implementare
Per passare all'implementazione di Advanced Extender,
Metodo isAdvancedExtenderImplemented()
in
ExtensionVersionImpl
deve restituire true
. Per ogni tipo di estensione, gli OEM devono implementare il
le classi di estensione corrispondenti. I file di implementazione degli extender avanzati
nel pacchetto avanzato.
Classi di extender da implementare | |
---|---|
Notte | advanced/NightAdvancedExtenderImpl.java
|
HDR | advanced/HdrAdvancedExtenderImpl.java
|
Automatica | advanced/AutoAdvancedExtenderImpl.java
|
Bokeh | advanced/BokehAdvancedExtenderImpl.java
|
Ritocco viso | advanced/BeautyAdvancedExtenderImpl.java
|
Nell'esempio seguente, utilizziamo AdvancedExtenderImpl
come segnaposto.
Sostituiscilo con il nome del file Extender dell'estensione che stai
implementazione.
Vediamo in che modo Camera2/X richiama extensions-interface
per raggiungere i tre
i flussi di dati delle app.
Flusso di app 1: verificare la disponibilità delle estensioni
Figura 8. Flusso di app 1 su Advanced Extender
Innanzitutto, l'app controlla se l'estensione in questione è supportata.
Flusso di app 2: informazioni sulle query
Figura 9. Flusso di app 2 su Advanced Extender
Dopo aver chiamato AdvancedExtenderImpl.init()
, l'app può eseguire query su
seguendo le informazioni su AdvancedExtenderImpl
:
Latenza stimata di acquisizione ancora:
AdvancedExtenderImpl.getEstimatedCaptureLatencyRange()
restituisce l'intervallo di la latenza di acquisizione affinché l'app valuti se è opportuno attivare l'estensione per lo scenario attuale.Risoluzioni supportate per l'anteprima e l'acquisizione di fotogrammi:
AdvancedExtenderImpl.getSupportedPreviewOutputResolutions()
restituisce una mappa dell'immagine all'elenco delle dimensioni supportate per il formato della superficie di anteprima e dimensioni. Gli OEM devono supportare almeno il formatoPRIVATE
.AdvancedExtenderImpl.getSupportedCaptureOutputResolutions()
restituisce il valore formati e dimensioni supportati per l'acquisizione di immagini fisse. Gli OEM devono supportare entrambi Output in formatoJPEG
eYUV_420_888
.AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
restituisce il valore dimensioni supportate per uno stream aggiuntivo diYUV_420_888
per l'analisi delle immagini. Se superficie YUV di analisi delle immagini non supportata,getSupportedYuvAnalysisResolutions()
dovrebbe restituirenull
o un elenco vuoto.
Chiavi/risultati della richiesta di acquisizione disponibili (aggiunti in
extensions-interface
1.3.0): Camera2/X richiama i seguenti metodi per recuperare l'acquisizione supportata le chiavi di richiesta e le chiavi dei risultati della tua implementazione:AdvancedExtenderImpl.getAvailableCaptureRequestKeys
AdvancedExtenderImpl.getAvailableCaptureResultKeys
Per ulteriori informazioni, vedi Supporta le chiavi di richiesta di acquisizione e i risultati.
Flusso di app 3: Anteprima/acquisizione di ancora con estensione abilitata
Figura 10. Flusso di app 3 su Advanced Extender
Il diagramma riportato sopra mostra il flusso principale per avviare l'anteprima ed eseguire l'acquisizione per il tipo Advanced Extender. Vediamo in dettaglio ogni passaggio.
Istanza
SessionProcessorImpl
L'implementazione principale di Advanced Extender è in
SessionProcessorImpl
, che è responsabile di fornire configurazione personalizzata della sessione e di inviare acquisire le richieste per avviare l'anteprima e acquisire comunque la richiesta.AdvancedExtenderImpl.createSessionProcessor()
viene richiamato per restituire unSessionProcessorImpl
istanza.initSession
SessionProcessorImpl.initSession()
inizializza la sessione per l'estensione. È qui che assegni le risorse e restituisci una configurazione di sessione per preparando unCameraCaptureSession
.Per i parametri di input, Camera2/X specifica le configurazioni della superficie di output per l'anteprima, acquisire immagini statiche e un'analisi YUV facoltativa. Questo output La configurazione della superficie (
OutputSurfaceImpl
) contiene la superficie, le dimensioni e l'immagine recuperato con i seguenti metodi inAdvancedExtenderImpl
:getSupportedPreviewOutputResolutions()
getSupportedCaptureOutputResolutions()
getSupportedYuvAnalysisResolutions()
Devi restituire un'istanza
Camera2SessionConfigImpl
, composta da un elenco diCamera2OutputConfigImpl
istanze e i parametri di sessione utilizzati per la configurazione diCameraCaptureSession
. Sei responsabile inviare le immagini corrette della fotocamera alle superfici di output trasmesse da Fotocamera2/X. Ecco alcune opzioni per abilitare l'output:- Elaborazione nella fotocamera HAL: puoi aggiungere direttamente le superfici di output
a
CameraCaptureSession
con unSurfaceOutputConfigImpl
implementazione. Questa operazione configura la superficie di output fornita alla fotocamera pipeline di dati e consente alla fotocamera HAL di elaborare l'immagine. Elaborazione della superficie
ImageReader
intermedia (RAW, YUV e così via): aggiungi la superficiImageReader
intermedie inCameraCaptureSession
con unImageReaderOutputConfigImpl
istanza.Devi elaborare le immagini intermedie e scrivere l'immagine dei risultati in la superficie di output.
- Utilizzare la condivisione di una superficie di Fotocamera 2: utilizza la condivisione di una superficie con un'altra piattaforma
aggiungendo qualsiasi istanza
Camera2OutputConfigImpl
getSurfaceSharingOutputConfigs()
metodo di un altroCamera2OutputConfigImpl
istanza. Il formato e le dimensioni della superficie devono essere identici.
Tutti i
Camera2OutputConfigImpl
inclusiSurfaceOutputConfigImpl
eImageReaderOutputConfigImpl
deve avere un ID univoco (getId()
), che è utilizzata per specificare la superficie di destinazione e recuperare l'immagine daImageReaderOutputConfigImpl
.onCaptureSessionStart
eRequestProcessorImpl
Quando viene avviato
CameraCaptureSession
e si attiva il framework FotocameraonConfigured()
, poi Camera2/X richiamaSessionProcessorImpl.onCaptureSessionStart()
con la richiesta Camera2 wrapperRequestProcessImpl
. Camera2/X implementaRequestProcessImpl
, che ti consente di eseguire le richieste di acquisizione. recuperare immagini se viene utilizzatoImageReaderOutputConfigImpl
.Le API
RequestProcessImpl
sono simili a Camera2CameraCaptureSession
API in termini di esecuzione delle richieste. Le differenze sono:- La superficie target è specificata dall'ID del
Camera2OutputConfigImpl
istanza. - La funzionalità di recupero dell'immagine dell'elemento
ImageReader
.
Puoi chiamare
RequestProcessorImpl.setImageProcessor()
con un IDCamera2OutputConfigImpl
in cui registrare un'istanzaImageProcessorImpl
ricevere immagini.L'istanza
RequestProcessImpl
non è più valida dopo le chiamate Camera2/XSessionProcessorImpl.onCaptureSessionEnd()
.- La superficie target è specificata dall'ID del
Avviare l'anteprima e scattare una foto
Nell'implementazione di Advanced Extender, puoi inviare richieste di acquisizione tramite l'interfaccia
RequestProcessorImpl
. Camera2/X ti avvisa avvia la richiesta ricorrente per l'anteprima o la sequenza di acquisizione di fotogrammi chiave chiamata aSessionProcessorImpl#startRepeating
e rispettivamenteSessionProcessorImpl#startCapture
. Dovresti inviare screenshot per soddisfare queste richieste di anteprima e acquisizione continua.Camera2/X imposta inoltre i parametri della richiesta di acquisizione tramite
SessionProcessorImpl#setParameters
. Devi impostare questi parametri della richiesta (se i parametri sono supportati) sia nella richiesta ricorrente che in quella singola.Devi supportare almeno
CaptureRequest.JPEG_ORIENTATION
eCaptureRequest.JPEG_QUALITY
.extensions-interface
1.3.0 supporta la richiesta che sono esposte con i seguenti metodi:AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
AdvancedExtenderImpl.getAvailableCaptureResultKeys()
Quando gli sviluppatori impostano le chiavi nell'elenco
getAvailableCaptureRequestKeys
, devi abilitare i parametri e assicurarti che l'acquisizione Il risultato contiene le chiavi nell'elencogetAvailableCaptureResultKeys
.startTrigger
SessionProcessorImpl.startTrigger()
viene richiamato per avviare il trigger, ad esempio comeCaptureRequest.CONTROL_AF_TRIGGER
eCaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER
. Puoi ignorare qualsiasi chiavi di richiesta di acquisizione non pubblicizzateAdvancedExtenderImpl.getAvailableCaptureRequestKeys()
.startTrigger()
è supportato a partire daextensions-interface
1.3.0. it consente alle app di implementare il tocco per mettere a fuoco e il flash con estensioni.Pulizia
Al termine di una sessione di acquisizione,
SessionProcessorImpl.onCaptureSessionEnd()
viene richiamato prima della chiusuraCameraCaptureSession
. Una volta chiusa la sessione di acquisizione,deInitSession()
esegue la pulizia.
Supporta anteprima, acquisizione di fotogrammi e analisi delle immagini
Dovresti applicare l'estensione sia per l'anteprima che per i casi d'uso di acquisizione continua. Tuttavia, se la latenza è troppo elevata per una visualizzazione uniforme dell'anteprima, puoi e applicare l'estensione solo per l'acquisizione.
Per il tipo di estensore di base, a prescindere dall'abilitazione dell'estensione per l'anteprima,
devi implementare sia ImageCaptureExtenderImpl
sia PreviewExtenderImpl
per una determinata estensione. Spesso, un'app usa anche uno stream YUV per analizzare
contenuti di immagini come la ricerca di testo o codici QR. Per supportare meglio questo caso d'uso
, dovresti supportare la combinazione di streaming di anteprima, acquisizione fissa e
Flusso di YUV_420_888
per la configurazione di CameraCaptureSession
. Ciò significa
se implementi un processore, devi supportare il flusso
di tre stream YUV_420_888
.
Per Advanced Extender, Camera2/X passa tre superfici di output al
Chiamata SessionProcessorImpl.initSession()
. Queste piattaforme di output sono per l'anteprima
, acquisizione e analisi delle immagini, rispettivamente. Devi assicurarti che l'anteprima
e acquisire ancora delle sezioni di output
mostrano un output valido. Tuttavia, per l'immagine
superficie di output dell'analisi, assicurati che funzioni solo se è diverso da null. Se le tue
implementazione non supporta lo stream di analisi delle immagini, puoi restituire un
elenco in AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
. Questo
assicura che la superficie di output dell'analisi delle immagini sia sempre nulla
SessionProcessorImpl.initSession()
.
Supporto dell'acquisizione video
L'architettura corrente delle estensioni per la fotocamera supporta solo l'anteprima e
e acquisire casi d'uso. Non supportiamo l'attivazione dell'estensione sull'MediaCodec
o MediaRecorder
per la registrazione del video. Tuttavia, è possibile
affinché le app registrino l'output dell'anteprima.
L'assistenza per le piattaforme MediaCodec
e MediaRecorder
è in fase di verifica.
Metadati specifici delle estensioni
Per Android 14 e versioni successive, metadati specifici delle estensioni
consente ai client delle estensioni della fotocamera di impostare e ricevere acquisizioni specifiche per le estensioni
impostazioni e risultati della richiesta. Nello specifico, l'estensione fotocamera
I client possono utilizzare il parametro della richiesta di acquisizione EXTENSION_STRENGTH
per controllare
l'efficacia dell'estensione e il risultato dell'acquisizione EXTENSION_CURRENT_TYPE
indicare il tipo di estensione abilitata.
Richieste di acquisizione
La
EXTENSION_STRENGTH
parametro di richiesta di acquisizione
controlla l'intensità dell'effetto di post-elaborazione dell'estensione. Il corrispondente
Il risultato dell'acquisizione include il valore predefinito per l'efficacia se questo parametro non è impostato
esplicitamente dal client. Questo parametro può essere applicato come segue per questi
tipi di estensione:
BOKEH
: controlla la quantità di sfocatura.HDR
eNIGHT
: controlla la quantità di immagini unite e la luminosità delle l'immagine finale.FACE_RETOUCH
: controlla la quantità di miglioramento estetico e della pelle attenuazione.
L'intervallo supportato per il parametro EXTENSION_STRENGTH
è compreso tra 0
e
100
, con 0
che indica nessuna elaborazione delle estensioni o semplice passthrough e
100
che indica l'intensità massima dell'estensione dell'effetto di elaborazione.
Per aggiungere il supporto per EXTENSION_STRENGTH
, utilizza il fornitore
API di parametri specifici introdotte nella versione 1.3.0 della libreria delle estensioni
a riga di comando. Per ulteriori informazioni, vedi
getAvailableCaptureRequestKeys()
Acquisisci risultati
La
EXTENSION_CURRENT_TYPE
il risultato dell'acquisizione consente alle implementazioni delle estensioni di notificare ai client
di estensione.
Perché le estensioni che utilizzano il tipo AUTO
passano dinamicamente da un'estensione all'altra
tipi come HDR
e NIGHT
in base alle condizioni della scena,
estensioni che le app possono utilizzare EXTENSION_CURRENT_TYPE
per visualizzare informazioni su
l'estensione corrente selezionata dall'estensione AUTO
.
Stima della latenza di acquisizione ancora in tempo reale
Per Android 14 e versioni successive, client di estensione della fotocamera
eseguire query in tempo reale e acquisire comunque stime di latenza in base alla scena
le condizioni ambientali utilizzando
getRealtimeStillCaptureLatency()
Questo
fornisce stime più accurate rispetto al metodo
getEstimatedCaptureLatencyRangeMillis()
. In base alla stima della latenza, le app possono decidere di ignorare l'estensione
l'elaborazione o mostrare un'indicazione per informare gli utenti di un
è in esecuzione un'operazione.
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();
Per supportare l'acquisizione in tempo reale delle stime di latenza, implementa le seguenti:
- Estensioni di base:
ImageCaptureExtenderImpl.getRealtimeCaptureLatency()
- Estensioni avanzate:
SessionProcessorImpl.getRealtimeCaptureLatency
Acquisizione dei callback di avanzamento dell'elaborazione
Per Android 14 e versioni successive, client di estensione della fotocamera può ricevere callback per l'avanzamento dell'elaborazione dell'acquisizione continua a lunga esecuzione operazioni. Le app possono mostrare l'avanzamento corrente agli utenti per migliorare in generale l'esperienza utente.
Le app possono utilizzare il seguente codice per integrare questa funzionalità:
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
}
}
…
}
Per supportare i callback di avanzamento dell'acquisizione, il fornitore dell'estensione l'implementazione deve chiamare i seguenti callback con lo stato di avanzamento attuale valore:
- Estensioni di base:
ProcessResultImpl.onCaptureProcessProgressed()
- Estensioni avanzate:
CaptureCallback.onCaptureProcessProgressed()
Acquisizione ancora post-visualizzazione
Per Android 14 e versioni successive, le estensioni della fotocamera possono
fornisce una visualizzazione post (immagine di anteprima) utilizzando
setPostviewOutputConfiguration
Per migliorare l'esperienza utente, le app possono mostrare un'immagine postview come
quando un'estensione riscontra una maggiore latenza di elaborazione,
e sostituirla quando è disponibile l'immagine finale. Le app possono configurare
ed emettere richieste di acquisizione post-visualizzazione utilizzando il seguente codice di riferimento:
{
…
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();
…
}
Per supportare ancora l'acquisizione di postview, l'implementazione del fornitore deve implementare il seguenti:
Estensioni di base:
CaptureProcessorImpl.onPostviewOutputSurface
eCaptureProcessorImpl.processWithPostview
Estensioni avanzate:
SessionProcessorImpl.startCaptureWithPostview
Supporta l'output di SurfaceView
Per Android 14 e versioni successive, client di estensione della fotocamera
puoi utilizzare i percorsi di rendering dell'anteprima ottimizzati per potenza e prestazioni registrando un'immagine
SurfaceView
per l'output di anteprima per le richieste ripetute.
Per supportare l'output SurfaceView
, l'implementazione dell'estensione di fornitore deve essere
in grado di trasmettere flussi di dati e inviare l'anteprima a SurfaceView
istanze. A
verifica che questa funzionalità sia supportata, esegui SurfaceViewExtensionPreviewTest.java
Modulo CTS.
Tipi di sessione specifici del fornitore
Questa funzionalità consente alle implementazioni delle estensioni del fornitore di selezionare un tipo di sessione specifico del fornitore che verrà impostato nella sessione di acquisizione della fotocamera interna al posto del valore predefinito.
La funzionalità opera interamente all'interno del framework e dello stack del fornitore e non ha alcun impatto visibile a livello di client/API pubblica.
Per selezionare un tipo di sessione specifico per il fornitore, implementa quanto segue per le librerie di estensioni:
* ExtenderStateListener.onSessionType()
per le estensioni di base
* Camera2SessionConfigImpl.getSessionType()
per estensioni avanzate
Cronologia delle versioni dell'interfaccia delle estensioni
La tabella riportata di seguito mostra la cronologia delle versioni dell'interfaccia delle estensioni per le videocamere. Tu devono implementare sempre la libreria del fornitore con la versione più recente.
Versione | Funzionalità aggiunte |
---|---|
1.0.0 |
|
1.1.0 |
|
1.2.0 |
|
1.3.0 |
|
1.4.0 |
|
Implementazione dei riferimenti
Le seguenti implementazioni della libreria di fornitori OEM sono disponibili in
frameworks/ex
advancedSample
: un'implementazione di base di Advanced Extender.sample
: un'implementazione di base dell'estensione di base.service_based_sample
: un'implementazione che dimostra come ospitare Estensioni della fotocamera in unService
Questa implementazione contiene i seguenti componenti:oem_library
: Una libreria OEM Camera Extensions per le API Camera2 e CameraX Extensions che implementaExtensions-Interface
. Questo funge da passthrough inoltra le chiamate daExtensions-Interface
al servizio. Questa libreria fornisce anche file AIDL e classi wrapper per comunicare completamente gestito di Google Cloud.Advanced Extender è abilitato per impostazione predefinita. Per abilitare l'extender di base, modifica
ExtensionsVersionImpl#isAdvancedExtenderImplemented
per restituirefalse
.extensions_service
: Un'implementazione di esempio del servizio Extensions. Aggiungi la tua implementazione qui. L'interfaccia da implementare nel servizio è simile alExtensions-Interface
. Ad esempio, l'implementazioneIAdvancedExtenderImpl.Stub
esegue le stesse operazioni diAdvancedExtenderImpl
.ImageWrapper
eTotalCaptureResultWrapper
sono necessario per rendereImage
eTotalCaptureResult
assegnabili.
Configurare la libreria del fornitore su un dispositivo
La libreria dei fornitori OEM non è integrata in un'app. viene caricato dal dispositivo
in fase di runtime da Camera2/X. In CameraX, il tag <uses-library>
dichiara
che la libreria androidx.camera.extensions.impl
, definita nel
AndroidManifest.xml
:
della libreria camera-extensions
, è una dipendenza di CameraX e deve essere
vengono caricati in fase di runtime. In Camera2, il framework carica un servizio di estensioni che
dichiara inoltre che <uses-library>
carica lo stesso
libreria androidx.camera.extensions.impl
in fase di runtime.
In questo modo le app di terze parti che utilizzano le estensioni possono caricare automaticamente l'OEM e la libreria dei fornitori. La libreria OEM è contrassegnata come facoltativa per consentire l'esecuzione delle app sui dispositivi che non hanno la raccolta sul dispositivo. Fotocamera2/X gestisce automaticamente questo comportamento quando un'app tenta di utilizzare una fotocamera dell'estensione purché il produttore del dispositivo inserisca la libreria OEM nella dispositivo in modo che possa essere rilevato dall'app.
Per configurare la libreria OEM su un dispositivo:
- Aggiungi un file di autorizzazione, richiesto dal tag
<uses-library>
, utilizzando il seguente formato:/etc/permissions/ANY_FILENAME.xml
. Per ad esempio/etc/permissions/camera_extensions.xml
. I file in questo fornisce una mappatura della libreria denominata in<uses-library>
alla sul percorso effettivo del file sul dispositivo. Utilizza l'esempio riportato di seguito per aggiungere le informazioni richieste al file.
name
deve essereandroidx.camera.extensions.impl
poiché è nella raccolta cercata da CameraX.file
è il percorso assoluto del file che contiene un'implementazione delle estensioni (ad es./system/framework/androidx.camera.extensions.impl.jar
).
<?xml version="1.0" encoding="utf-8"?> <permissions> <library name="androidx.camera.extensions.impl" file="OEM_IMPLEMENTED_JAR" /> </permissions>
In Android 12 o versioni successive, i dispositivi che supportano CameraX
le estensioni devono avere la proprietà ro.camerax.extensions.enabled
impostata su true
,
che consente di chiedere se un dispositivo supporta le estensioni.
A tale scopo, aggiungi la seguente riga nel file di marca del dispositivo:
PRODUCT_VENDOR_PROPERTIES += \
ro.camerax.extensions.enabled=true \
Convalida
Per testare l'implementazione della libreria di fornitori OEM durante la
di sviluppo, usa l'app di esempio
androidx-main/camera/integration-tests/extensionstestapp/
,
che viene eseguito con varie estensioni di fornitori.
Dopo aver completato l'implementazione, utilizza strumento di convalida delle estensioni per le videocamere eseguire test automatici e manuali per verificare che la libreria del fornitore sia correttamente implementato.
Modalità scena estesa rispetto alle estensioni della fotocamera
Per l'estensione bokeh, oltre a mostrarla tramite le estensioni della fotocamera,
può esporre l'estensione utilizzando la modalità scena estesa, abilitata tramite
il
CONTROL_EXTENDED_SCENE_MODE
chiave.
Per ulteriori dettagli sull'implementazione, consulta l'articolo Bokeh della fotocamera.
La modalità scena estesa ha meno limitazioni rispetto alle estensioni della fotocamera per
app per la fotocamera2. Ad esempio, puoi attivare la modalità scena estesa
un'istanza CameraCaptureSession
normale che supporta lo stream flessibile
combinazioni e acquisire i parametri della richiesta. Al contrario, le estensioni della fotocamera
supportano solo un insieme fisso di tipi di stream e hanno un supporto limitato per l'acquisizione
parametri della richiesta.
Uno svantaggio della modalità scena estesa è che puoi implementarla solo videocamera HAL, il che significa che deve essere verificata per funzionare controlli ortogonali a disposizione degli sviluppatori di app.
Consigliamo di esporre il bokeh utilizzando sia la modalità scena estesa sia la fotocamera Estensioni perché le app potrebbero preferire utilizzare una determinata API per attivare il bokeh. Ti consigliamo prima di usare la modalità Scena estesa perché è la modalità un modo flessibile per attivare l'estensione bokeh nelle app. Poi puoi implementare dell'interfaccia delle estensioni della videocamera basata sulla modalità scena estesa. Se implementi l'effetto bokeh nella fotocamera HAL è difficile, ad esempio, perché richiede un post in esecuzione nel livello app per elaborare le immagini, consigliamo di implementare l'estensione bokeh utilizzando l'interfaccia Estensioni fotocamera.
Domande frequenti
Esistono limitazioni sui livelli API?
Sì. Dipende dal set di funzionalità dell'API Android richiesto dall'OEM.
dell'implementazione della libreria dei fornitori. Ad esempio:
ExtenderStateListener.onPresetSession()
utilizza
SessionConfiguration.setSessionParameters()
per impostare un insieme di riferimento di tag. Questa chiamata è disponibile solo a livello API
28 e successive. Per maggiori dettagli su metodi specifici dell'interfaccia, consulta
documentazione di riferimento API.