Actualités des produits

Au-delà des fonctionnalités uniques : garantir les combinaisons de fonctionnalités avec CameraX 1.5

Temps de lecture : 6 min
Tahsin Masrur
Ingénieur logiciel

Les applications de caméras modernes se définissent par des fonctionnalités puissantes et qui se chevauchent. Les utilisateurs s'attendent à enregistrer des vidéos HDR époustouflantes, à capturer des mouvements fluides à 60 FPS et à obtenir des séquences d'une fluidité exceptionnelle grâce à la stabilisation de l'aperçu, souvent en même temps.

En tant que développeurs, nous savons que la réalité est plus complexe. Comment garantir qu'un appareil spécifique est compatible avec une combinaison donnée ? Jusqu'à présent, l'activation de plusieurs fonctionnalités était souvent un pari risqué. Vous pouvez vérifier la compatibilité de chaque fonctionnalité, mais les combiner peut entraîner un comportement indéfini, voire une session de caméras qui échoue. Cette incertitude oblige les développeurs à être prudents, ce qui empêche les utilisateurs d'accéder à la meilleure expérience possible sur les appareils compatibles.

Par exemple, très peu d'appareils haut de gamme sont compatibles avec les vidéos HDR et 60 FPS en même temps. Par conséquent, la plupart des applications évitent d'activer les deux en même temps pour éviter une mauvaise expérience utilisateur sur la majorité des téléphones.

Pour résoudre ce problème, nous lançons Feature Group dans CameraX, une nouvelle API conçue pour éliminer ces incertitudes. Vous pouvez désormais vérifier si une combinaison spécifique de fonctionnalités est prise en charge avant de configurer la caméra, ou simplement indiquer vos priorités à CameraX et le laisser activer la combinaison la mieux prise en charge pour vous.

Pour les débutants avec CameraX

Avant de nous plonger dans la nouvelle API Feature Group, rappelons rapidement ce qu'est CameraX. CameraX est une bibliothèque d'assistance Jetpack conçue pour vous aider à développer plus facilement des applications d'appareil photo. Elle fournit une surface d'API cohérente et facile à utiliser qui fonctionne sur la plupart des appareils Android, avec une rétrocompatibilité avec Android 6.0 (niveau d'API 23). Si vous débutez avec CameraX, nous vous recommandons de consulter la documentation officielle et d'essayer l'atelier de programmation pour commencer.

Ce que vous pouvez créer avec l'API Feature Group

Vous n'avez plus besoin de deviner les combinaisons de fonctionnalités. Vous pouvez proposer les meilleures expériences d'appareil photo possibles (comme la vidéo HDR et 60 FPS simultanées sur du matériel compatible, par exemple un Pixel 10 Pro) en toute confiance, tout en évitant les erreurs sur les appareils qui ne peuvent pas prendre en charge la combinaison.

unnamed.png

Pixel 10 Pro permettant d'activer à la fois le HDR et 60 FPS

unnamed (1).png

Sur un appareil plus ancien où le HDR et les 60 FPS ne peuvent pas fonctionner simultanément, seul le HDR est activé, tandis que l'option 60 FPS est désactivée.

Avec l'API Feature Group, vous pouvez :

  • Créez des UI dynamiques et plus intelligentes : activez ou désactivez intelligemment les paramètres de votre UI en fonction de la compatibilité matérielle en temps réel. Par exemple, si un utilisateur active le HDR, vous pouvez immédiatement griser et désactiver l'option 60 FPS si la combinaison n'est pas prise en charge sur cet appareil. 
unsupported-features-disabled.gif
  • Fournir un mode "Haute qualité" fiable  : configurez la caméra avec une liste de fonctionnalités souhaitées classées par ordre de priorité. CameraX trouve et active automatiquement la combinaison la mieux prise en charge pour n'importe quel appareil, ce qui garantit un excellent résultat sans logique complexe spécifique à l'appareil.
  • Évitez les échecs de session de caméra : en vérifiant la compatibilité à l'avance, vous empêchez la caméra de tenter de configurer une combinaison non compatible, ce qui élimine une source courante de plantages et offre une expérience utilisateur fluide.

Fonctionnement : les composants principaux

La nouvelle API est axée sur des ajouts clés à SessionConfig et CameraInfo.

  1. GroupableFeature : cette API introduit un ensemble de fonctionnalités groupables prédéfinies, telles que HDR_HLG10, FPS_60, PREVIEW_STABILIZATION et IMAGE_ULTRA_HDR. En raison de limites de calcul, seul un ensemble spécifique de caractéristiques peut être regroupé avec le haut degré de fiabilité fourni par cette API. Nous nous efforçons d'étendre cette liste et d'ajouter la compatibilité avec d'autres fonctionnalités dans les prochaines versions.
     
  2. Nouveaux paramètres SessionConfig : cette classe, utilisée pour démarrer une session de caméras, accepte désormais deux nouveaux paramètres :
    • requiredFeatureGroup : utilisez cette option pour les fonctionnalités qui doivent être prises en charge pour que la configuration réussisse. Elle est idéale pour les fonctionnalités qu 'un utilisateur active explicitement, comme l'activation du HDR. Pour garantir une expérience déterministe et cohérente, l'appel bindToLifecycle générera une IllegalArgumentException si la combinaison demandée n'est pas prise en charge, au lieu d'ignorer silencieusement une demande de fonctionnalité. L'API CameraInfo#isFeatureGroupSupported (voir les détails ci-dessous) doit être utilisée pour interroger ce résultat au préalable.
    • preferredFeatureGroup : à utiliser pour les fonctionnalités souhaitables, mais facultatives. Par exemple, lorsque vous souhaitez implémenter un mode "Haute qualité" par défaut. Vous fournissez une liste des fonctionnalités souhaitées classées par ordre de priorité, et CameraX active automatiquement la combinaison la plus prioritaire compatible avec l'appareil.
  3. CameraInfo#isFeatureGroupSupported() : il s'agit de la méthode de requête principale pour vérifier explicitement si un groupe de fonctionnalités est pris en charge. Elle est idéale pour ne proposer aux utilisateurs que les options de fonctionnalités compatibles dans l'UI de votre application. Vous lui transmettez un SessionConfig, et il renvoie une valeur booléenne indiquant si la combinaison est compatible. Si vous prévoyez d'associer un SessionConfig avec des fonctionnalités requises, vous devez d'abord utiliser cette API pour vous assurer qu'il est compatible. 

Implémentation en pratique

Voyons comment utiliser ces composants pour améliorer l'expérience de l'appareil photo.

Scénario 1 : Mode "Meilleur effort" de haute qualité

Si vous souhaitez activer les meilleures fonctionnalités possibles par défaut, vous pouvez fournir une liste classée par ordre de priorité à preferredFeatureGroup. Dans cet exemple, nous demandons à CameraX de donner la priorité au HDR, puis à 60 FPS et enfin à la stabilisation de l'aperçu. CameraX gère la complexité de la vérification de toutes les combinaisons possibles et du choix de la meilleure combinaison compatible avec l'appareil.

Par exemple, si un appareil peut gérer le HDR et 60 FPS ensemble, mais pas avec la stabilisation de l'aperçu, CameraX activera les deux premiers et ignorera le troisième. Vous bénéficiez ainsi de la meilleure expérience possible sans avoir à écrire des vérifications complexes spécifiques à l'appareil.

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)

        }

    }

)

Pour cet extrait de code, CameraX tentera d'activer les combinaisons de fonctionnalités dans l'ordre de priorité suivant, en sélectionnant la première entièrement compatible avec l'appareil :

  1. HDR + 60 FPS + Stabilisation de l'aperçu
  2. HDR + 60 FPS
  3. HDR+ et stabilisation de l'aperçu
  4. HDR
  5. 60 FPS + Stabilisation de l'aperçu
  6. 60 FPS
  7. Stabilisation de l'aperçu
  8. Aucune des fonctionnalités ci-dessus

Scénario 2 : Créer une UI réactive

Pour créer une UI qui répond aux sélections des utilisateurs et les empêche de sélectionner une combinaison de fonctionnalités non compatible, vous pouvez interroger directement la compatibilité. La fonction ci-dessous vérifie les fonctionnalités incompatibles avec les sélections actuelles de l'utilisateur, ce qui vous permet de désactiver les éléments d'interface utilisateur correspondants.

/**

 * 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

}

Vous pouvez ensuite intégrer cette logique dans votre ViewModel ou votre contrôleur d'UI pour réagir aux entrées utilisateur et relier la caméra à une configuration qui fonctionne à coup sûr.

// 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,

        )

    )

}

Pour voir ces concepts dans une application fonctionnelle, vous pouvez explorer notre application de test interne. Elle fournit une implémentation complète des scénarios "au mieux" et "UI réactive" décrits ci-dessus.

Remarque : Il s'agit d'une application de test et non d'un exemple officiellement compatible. Bien qu'il s'agisse d'une excellente référence pour l'API Feature Group, il n'a pas été optimisé pour une utilisation en production.

Commencer dès aujourd'hui

L'API Feature Group élimine toute ambiguïté lors de l'utilisation des fonctionnalités avancées de l'appareil photo. En fournissant un moyen déterministe d'interroger la prise en charge des fonctionnalités, vous pouvez créer des applications d'appareil photo plus puissantes et fiables en toute confiance.

L'API est disponible en version expérimentale dans CameraX 1.5 et devrait devenir entièrement stable dans la version 1.6, avec davantage de fonctionnalités et d'améliorations à venir.

Pour en savoir plus, consultez la documentation officielle. Nous avons hâte de découvrir vos créations et de connaître votre avis. Veuillez nous faire part de vos impressions et signaler les problèmes par l'un des moyens suivants :

Écrit par :

Lire la suite