Novità sul prodotto

Oltre le singole funzionalità: garantire combinazioni di funzionalità con CameraX 1.5

Lettura di 6 minuti
Tahsin Masrur
Ingegnere del software

Le moderne app per la fotocamera sono caratterizzate da funzionalità potenti e sovrapposte. Gli utenti si aspettano di registrare video con un HDR straordinario, acquisire movimenti fluidi a 60 FPS e ottenere filmati fluidi con la stabilizzazione dell'anteprima, spesso tutto nello stesso momento.

In qualità di sviluppatori, sappiamo che la realtà è più complessa. Come puoi garantire che un dispositivo specifico supporti effettivamente una determinata combinazione? Fino ad ora, l'attivazione di più funzionalità era spesso un azzardo. Puoi verificare il supporto delle singole funzionalità, ma la loro combinazione potrebbe comportare un comportamento indefinito o, peggio ancora, una sessione della videocamera non riuscita. Questa incertezza costringe gli sviluppatori a essere conservativi, il che impedisce agli utenti di dispositivi compatibili di accedere alla migliore esperienza possibile.

Ad esempio, pochissimi dispositivi premium supportano in modo affidabile video HDR e a 60 FPS contemporaneamente. Di conseguenza, la maggior parte delle app evita di attivarli entrambi contemporaneamente per evitare una scarsa esperienza utente sulla maggior parte degli smartphone.

Per risolvere questo problema, stiamo introducendo Feature Group in CameraX, una nuova API progettata per eliminare questa incertezza. Ora puoi verificare se una combinazione specifica di funzionalità è supportata prima di configurare la videocamera oppure comunicare semplicemente a CameraX le tue priorità e lasciare che abiliti la combinazione meglio supportata per te.

Per chi non ha mai usato CameraX

Prima di esaminare la nuova API Feature Group, riepiloghiamo rapidamente cos'è CameraX. CameraX è una libreria di supporto Jetpack, creata per semplificare lo sviluppo di app fotocamera. Fornisce una superficie API coerente e facile da usare che funziona sulla maggior parte dei dispositivi Android, con compatibilità con le versioni precedenti fino ad Android 6.0 (livello API 23). Se non hai mai utilizzato CameraX, ti consigliamo di consultare la documentazione ufficiale e di provare il codelab per iniziare.

Cosa puoi creare con l'API Feature Group

Non devi più rischiare con le combinazioni di funzionalità e puoi offrire con sicurezza le migliori esperienze possibili con la fotocamera, come video HDR e a 60 FPS simultanei su hardware compatibile (ad es. Pixel 10 Pro), evitando al contempo errori sui dispositivi che non supportano la combinazione.

unnamed.png

Pixel 10 Pro che consente di attivare contemporaneamente HDR e 60 FPS

unnamed (1).png

Su un dispositivo meno recente in cui HDR e 60 FPS non possono essere eseguiti contemporaneamente, viene attivato solo l'HDR, mentre l'opzione 60 FPS viene disattivata.

Con l'API Feature Group puoi:

  • Crea UI dinamiche e più intelligenti:attiva o disattiva in modo intelligente le impostazioni nella tua UI in base al supporto hardware in tempo reale. Ad esempio, se un utente attiva l'HDR, puoi disattivare e disabilitare immediatamente l'opzione 60 FPS se la combinazione non è supportata sul dispositivo. 
unsupported-features-disabled.gif
  • Offrire una modalità "Alta qualità" affidabile: configura la videocamera con un elenco prioritario delle funzionalità desiderate. CameraX trova e attiva automaticamente la combinazione meglio supportata per qualsiasi dispositivo, garantendo un ottimo risultato senza una logica complessa e specifica per il dispositivo.
  • Evita errori della sessione della videocamera:verificando il supporto in anticipo, impedisci alla videocamera di tentare di configurare una combinazione non supportata, eliminando una fonte comune di arresti anomali e offrendo un'esperienza utente fluida.

Come funziona: i componenti principali

La nuova API è incentrata su aggiunte chiave a SessionConfig e CameraInfo.

  1. GroupableFeature: questa API introduce un insieme di funzionalità raggruppabili predefinite, come HDR_HLG10FPS_60PREVIEW_STABILIZATIONIMAGE_ULTRA_HDR. A causa delle limitazioni di calcolo, solo un insieme specifico di funzionalità può essere raggruppato con l'elevato grado di affidabilità fornito da questa API. Stiamo lavorando attivamente per ampliare questo elenco e introdurremo il supporto per altre funzionalità nelle release future.
     
  2. Nuovi parametri SessionConfig: questa classe, utilizzata per avviare una sessione della videocamera, ora accetta due nuovi parametri:
    • requiredFeatureGroup: utilizza questo valore per le funzionalità che devono essere supportate affinché la configurazione vada a buon fine. È ideale per le funzionalità che un utente attiva esplicitamente, ad esempio l'attivazione/disattivazione di un'opzione "HDR". Per garantire un'esperienza deterministica e coerente, la chiamata bindToLifecycle genererà un errore IllegalArgumentException se la combinazione richiesta non è supportata, anziché ignorare silenziosamente una richiesta di funzionalità. Per eseguire query su questo risultato in anticipo, deve essere utilizzata l'API CameraInfo#isFeatureGroupSupported (dettagli di seguito).
    • preferredFeatureGroup: utilizza questo valore per le funzionalità desiderabili ma facoltative, ad esempio quando vuoi implementare una modalità "Alta qualità" predefinita. Fornisci un elenco delle funzionalità che ti interessano ordinate in base alle tue priorità e CameraX attiva automaticamente la combinazione con la priorità più alta supportata dal dispositivo.
  3. CameraInfo#isFeatureGroupSupported(): questo è il metodo di query principale per verificare in modo esplicito se un gruppo di funzionalità è supportato, ideale per fornire agli utenti solo le opzioni delle funzionalità supportate nell'interfaccia utente della tua app. Passi un valore SessionConfig e restituisce un valore booleano che indica se la combinazione è supportata. Se intendi associare un SessionConfig con le funzionalità richieste, devi utilizzare prima questa API per assicurarti che sia supportata. 

Implementazione in pratica

Vediamo come utilizzare questi componenti per creare un'esperienza migliore con la fotocamera.

Scenario 1: modalità di alta qualità "Best Effort"

Se vuoi attivare le migliori funzionalità possibili per impostazione predefinita, puoi fornire un elenco prioritario a preferredFeatureGroup. In questo esempio, diciamo a CameraX di dare la priorità all'HDR, poi a 60 FPS e infine alla stabilizzazione dell'anteprima. CameraX gestisce la complessità del controllo di tutte le combinazioni possibili e della scelta di quella migliore supportata dal dispositivo.

Ad esempio, se un dispositivo può gestire HDR e 60 FPS insieme, ma non con la stabilizzazione dell'anteprima, CameraX attiverà i primi due e ignorerà il terzo. In questo modo, ottieni la migliore esperienza possibile senza scrivere controlli complessi e specifici per il dispositivo.

  cameraProvider.bindToLifecycle(

    lifecycleOwner,

    cameraSelector,

    SessionConfig(

        useCases = listOf(preview, videoCapture),

        // The order of features in this list determines their priority. 

        // CameraX will enable the best-supported combination based on these

        // priorities: HDR_HLG10 > FPS_60 > Preview Stabilization.  

        preferredFeatureGroup =

           listOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION),

    ).apply {

        // (Optional) Get a callback with the enabled features

        // to update your UI. 

        setFeatureSelectionListener { selectedFeatures ->

            updateUiIndicators(selectedFeatures)

        }

    }

)

Per questo snippet di codice, CameraX tenterà di attivare le combinazioni di funzionalità nel seguente ordine di priorità, selezionando la prima completamente supportata dal dispositivo:

  1. HDR + 60 FPS + Stabilizzazione anteprima
  2. HDR + 60 FPS
  3. HDR + Preview Stabilization
  4. HDR
  5. 60 FPS + Stabilizzazione anteprima
  6. 60 FPS
  7. Anteprima stabilizzazione
  8. Nessuna delle funzionalità precedenti

Scenario 2: creazione di una UI reattiva

Per creare un'interfaccia utente che risponda alle selezioni degli utenti e impedisca loro di selezionare una combinazione di funzionalità non supportata, puoi eseguire una query direttamente per il supporto. La funzione riportata di seguito controlla quali funzionalità non sono compatibili con le selezioni correnti dell'utente, consentendoti di disattivare gli elementi della UI corrispondenti.

  /**

 * Returns a list of features that are NOT supported in combination

 * with the currently selected features.

 */

fun getUnsupportedFeatures(

    currentFeatures: Set<GroupableFeature>

): Set<GroupableFeature> {

    val unsupportedFeatures = mutableSetOf<GroupableFeature>()

    val appFeatureOptions = setOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION)


    // Iterate over every available feature option in your app. 

    appFeatureOptions.forEach { featureOption ->

        // Skip features the user has already selected. 

        if (currentFeatures.contains(featureOption)) return@forEach


        // Check if adding this new feature is supported. 

        val isSupported = cameraInfo.isFeatureGroupSupported(

            SessionConfig(

                useCases = useCases,

                // Check the new feature on top of existing ones.

                requiredFeatureGroup = currentFeatures + featureOption

            )

        )


        if (!isSupported) {

            unsupportedFeatures.add(featureOption)

        }

    }


    return unsupportedFeatures

}

Puoi quindi integrare questa logica nel tuo ViewModel o nel controller UI per reagire all'input dell'utente e riassociare la videocamera con una configurazione garantita.

  // Invoked when user turns some feature on/off.

fun onFeatureChange(currentFeatures: Set<GroupableFeature>) {

    // Identify features that are unsupported with the current selection.

    val unsupportedFeatures = getUnsupportedFeatures(currentFeatures)



    // Update app UI so that users can't enable them.

    updateDisabledFeatures(unsupportedFeatures)



    // Since the UI now only allows selecting supported feature combinations, 

    // `currentFeatures` is always valid. This allows setting

    // `requiredFeatureGroup` directly, without needing to re-check for

    // support or set a feature selection listener.  

    cameraProvider.bindToLifecycle(

        lifecycleOwner,

        cameraSelector,

        SessionConfig(

            useCases = listOf(preview, videoCapture),

            requiredFeatureGroup = currentFeatures,

        )

    )

}

Per vedere questi concetti in un'applicazione funzionante, puoi esplorare la nostra app di test interna. Fornisce un'implementazione completa degli scenari "best effort" e "UI reattiva" descritti in precedenza.

Nota: questa è un'applicazione di test e non un esempio supportato ufficialmente. Sebbene sia un ottimo riferimento per l'API Feature Group, non è stato perfezionato per l'utilizzo in produzione.

Inizia oggi stesso

L'API Feature Group elimina l'ambiguità dell'utilizzo delle funzionalità avanzate della fotocamera. Fornendo un modo deterministico per eseguire query per il supporto delle funzionalità, puoi creare app per la fotocamera più potenti e affidabili in tutta sicurezza.

L'API è disponibile in versione sperimentale in CameraX 1.5 e diventerà completamente stabile nella release 1.6, con ulteriori supporto e miglioramenti in arrivo.

Per saperne di più, consulta la documentazione ufficiale. Non vediamo l'ora di vedere le tue creazioni e di ricevere il tuo feedback. Condividi le tue opinioni e segnala eventuali problemi utilizzando i seguenti canali:

Scritto da:

Continua a leggere