CameraX fournit une API Extensions pour accéder aux effets spéciaux suivants que les fabricants ont implémentés sur divers appareils Android (téléphones, tablettes, etc.).
- Auto : adapte automatiquement l'image finale au décor environnant. Par exemple, l'implémentation de la bibliothèque du fournisseur peut détecter une faible luminosité et basculer en mode faible luminosité ou HDR pour prendre une photo. La bibliothèque peut aussi appliquer automatiquement un mode de retouche du visage lors de la prise d'une photo au format portrait. Le mode automatique délègue la sélection du mode à l'implémentation de la bibliothèque du fournisseur.
- Bokeh : ce mode accentue la netteté du sujet au premier plan et floute l'arrière-plan d'une photo. Il est généralement conçu pour prendre des photos de personnes en mode portrait, semblables à ce qui serait produit par un appareil photo équipé d'un grand objectif.
- Retouche du visage : permet de retoucher la couleur de la peau, la géométrie du visage et d'autres propriétés lors de la prise d'images fixes.
- HDR (High Dynamic Range) : le mode HDR permet de prendre des photos qui conservent une plus large gamme de niveaux d'éclairage de scène visibles dans l'image finale. Par exemple, lorsque vous photographiez un objet situé devant une fenêtre lumineuse, il est possible que l'objet et la scène à travers la fenêtre soient tous deux visibles en mode HDR. En mode normal, en revanche, l'un ou l'autre risque d'être mal exposé. En contrepartie, le mode HDR prend généralement beaucoup plus de temps pour capturer une seule image, n'offre aucun contrôle à l'utilisateur et peut entraîner d'autres défauts visuels selon la méthode HDR utilisée.
- Nuit : permet d'obtenir les meilleures images fixes dans des conditions de faible luminosité, généralement la nuit.
Pour qu'un appareil soit compatible avec ces extensions de fournisseur, il doit répondre aux exigences suivantes :
- L'effet prend en charge la bibliothèque à partir de la ROM de l'appareil.
- La bibliothèque ROM est installée sur l'appareil actuel.
- L'appareil est équipé d'une version du système d'exploitation requise par la bibliothèque.
Vous pouvez activer une extension de préférence. Si l'extension est prise en charge par l'appareil et se trouve physiquement sur celui-ci, elle sera activée. Sinon, elle sera dégradée de manière appropriée.
Les fournisseurs ne sont pas tenus de proposer une implémentation pour chaque effet et fonctionnalité. Toute capacité sans implémentation proposée par le fournisseur est définie par défaut sur l'implémentation de CameraX. L'implémentation par défaut signale que la capacité n'est pas disponible et ignore son activation.
Architecture des extensions
L'image suivante illustre l'architecture des extensions avec CameraX.

Les extensions sont séparées du noyau Camera2 de CameraX. Sur cette illustration, les flèches rouges indiquent le flux de données principal lorsque les utilisateurs déclenchent une fonctionnalité basée sur une extension, telle que la capture d'image HDR.
Activer un effet pour la capture d'image et l'aperçu
Avant d'utiliser l'API Extensions, récupérez une instance ExtensionsManager
à l'aide de la méthode ExtensionsManager#getInstanceAsync(Context, CameraProvider). Cela vous permettra d'interroger les informations sur la disponibilité de l'extension. Ensuite, récupérez un CameraSelector
activé par l'extension. Le mode d'extension sera appliqué aux cas d'utilisation de capture d'image et d'aperçu lors de l'appel de la méthode bindToLifecycle() avec l'extension CameraSelector
activée.
Pour implémenter l'extension pour les cas d'utilisation de capture d'image et d'aperçu, reportez-vous à l'exemple de code suivant :
Kotlin
import androidx.camera.extensions.ExtensionMode import androidx.camera.extensions.ExtensionsManager fun onCreate() { // Create a camera provider val cameraProvider : ProcessCameraProvider = ... // Get the provider instance lifecycleScope.launch { // Create an extensions manager val extensionsManager = ExtensionsManager.getInstanceAsync(context, cameraProvider).await() // Select the camera val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA // Query if extension is available. if (extensionsManager.isExtensionAvailable( cameraSelector, ExtensionMode.BOKEH ) ) { // Unbind all use cases before enabling different extension modes. cameraProvider.unbindAll() // Retrieve extension enabled camera selector val bokehCameraSelector = extensionsManager.getExtensionEnabledCameraSelector( cameraSelector, ExtensionMode.BOKEH ) // Bind image capture and preview use cases with the extension enabled camera selector. val imageCapture = ImageCapture.Builder().build() val preview = Preview.Builder().build() cameraProvider.bindToLifecycle( lifecycleOwner, bokehCameraSelector, imageCapture, preview ) } } }
Java
import androidx.camera.extensions.ExtensionMode; import androidx.camera.extensions.ExtensionsManager; void onCreate() { // Create a camera provider ProcessCameraProvider cameraProvider = ... // Get the provider instance // Call the getInstanceAsync function to retrieve a ListenableFuture object ListenableFuturefuture = ExtensionsManager.getInstanceAsync(context, cameraProvider); // Obtain the ExtensionsManager instance from the returned ListenableFuture object future.addListener(() -> { try { ExtensionsManager extensionsManager = future.get(); // Select the camera CameraSelector cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA; // Query if extension is available. if (extensionsManager.isExtensionAvailable(cameraSelector, ExtensionMode.BOKEH)) { // Unbind all use cases before enabling different extension modes. cameraProvider.unbindAll(); // Retrieve extension enabled camera selector CameraSelector bokehCameraSelector = extensionsManager .getExtensionEnabledCameraSelector(cameraSelector, ExtensionMode.BOKEH); // Bind image capture and preview use cases with the extension enabled camera selector. ImageCapture imageCapture = new ImageCapture.Builder().build(); Preview preview = new Preview.Builder().build(); cameraProvider.bindToLifecycle(lifecycleOwner, bokehCameraSelector, imageCapture, preview); } } catch (ExecutionException | InterruptedException e) { // This should not happen unless the future is cancelled or the thread is interrupted by // applications. } }, ContextCompact.getMainExecutor(context)); }
Désactiver l'effet
Pour désactiver les extensions du fournisseur, dissociez tous les cas d'utilisation, et associez à nouveau les cas d'utilisation de capture d'image et d'aperçu à un sélecteur d'appareil photo ordinaire. Par exemple, associez à nouveau l'appareil photo à l'aide de CameraSelector.DEFAULT_BACK_CAMERA
.
Dépendances
L'API CameraX Extensions est implémentée dans la bibliothèque camera-extensions
.
Les extensions dépendent des modules principaux de CameraX (core
, camera2
, lifecycle
).
Groovy
dependencies { def camerax_version = "1.2.0-alpha04" implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" implementation "androidx.camera:camera-lifecycle:${camerax_version}" //the CameraX Extensions library implementation "androidx.camera:camera-extensions:${camerax_version}" ... }
Kotlin
dependencies { val camerax_version = "1.2.0-alpha04" implementation("androidx.camera:camera-core:${camerax_version}") implementation("androidx.camera:camera-camera2:${camerax_version}") implementation("androidx.camera:camera-lifecycle:${camerax_version}") // the CameraX Extensions library implementation("androidx.camera:camera-extensions:${camerax_version}") ... }
Suppression de l'ancienne API
Avec la publication de la nouvelle API Extensions dans la version 1.0.0-alpha26
, l'ancienne API Extensions, publiée en août 2019, est maintenant obsolète. L'ancienne API Extensions a été supprimée de la bibliothèque à partir de la version 1.0.0-alpha28
. Les applications qui utilisent la nouvelle API Extensions doivent maintenant obtenir un CameraSelector
activé par l'extension et l'utiliser pour lier les cas d'utilisation.
Les applications qui utilisent l'ancienne API Extensions doivent migrer vers la nouvelle API Extensions pour garantir la compatibilité avec les prochaines versions de CameraX.
Ressources supplémentaires
Pour en savoir plus sur CameraX, consultez les ressources supplémentaires suivantes.
Atelier de programmation
Exemple de code
Autres références
Extensions du fournisseur CameraX
Outil de validation des extensions du fournisseur CameraX