CameraX est une bibliothèque Android Jetpack pour travailler avec la caméra, fournissant une API simple et cohérente au-dessus de la complexe Camera2. Elle abstrait les différences entre des centaines de modèles d'appareils Android et garantit un comportement uniforme de la caméra sur différents matériels. Selon le Guide Android Developer CameraX (2026), la bibliothèque est utilisée dans plus de 25 000 applications Google Play et fonctionne sur les appareils avec API Level 21 et supérieur.
Points clés
CameraX est une bibliothèque de la suite Android Jetpack, publiée pour la première fois par Google en 2019 en remplacement de l'ancienne Camera API et comme alternative simplifiée à la complexe Camera2. La philosophie centrale de CameraX est « écrivez une fois, fonctionne sur tous les appareils ». La bibliothèque gère automatiquement les différences matérielles : emplacement des caméras, résolutions prises en charge, orientation du capteur et formats disponibles — le développeur n'a pas besoin d'écrire de code spécifique à l'appareil.
L'architecture de CameraX est construite sur des cas d'utilisation : Preview (affichage du flux de la caméra dans Viewfinder), ImageCapture (prise de photos), ImageAnalysis (analyse du flux d'images pour le ML) et VideoCapture (enregistrement vidéo). Chaque cas d'utilisation est un composant indépendant qui peut être combiné : exécuter Preview pour le viseur et ImageAnalysis pour le traitement ML simultanément. Selon Google (2026), CameraX est pris en charge sur 99 % des appareils Android avec API 21+.
CameraX fournit le basculement automatique entre les caméras avant et arrière, la prise en charge de la rotation de l'écran sans recréer la session, la gestion intégrée du cycle de vie via LifecycleOwner, la liaison des cas d'utilisation à un seul processus Lifecycle, la prise en charge des extensions Camera2 pour le portrait, le HDR et le mode nuit, et TestableCameraX pour les tests unitaires sans appareil réel.
CameraX définit quatre cas d'utilisation standard, chacun résolvant une tâche spécifique de la caméra. Les cas d'utilisation peuvent être combinés : les combinaisons les plus populaires sont Preview + ImageCapture pour une application de caméra et Preview + ImageAnalysis pour un scanner ML.
| Cas d'utilisation | Objectif | Classe |
|---|---|---|
| Preview | Affichage du flux de la caméra en temps réel | PreviewView |
| ImageCapture | Prise de photos avec réglages du flash et de la résolution | ImageCapture |
| ImageAnalysis | Analyse de chaque image pour le traitement ML | ImageAnalysis |
| VideoCapture | Enregistrement vidéo avec microphone (depuis 1.1.0-beta) | VideoCapture |
Le cas d'utilisation Preview affiche le flux vidéo de la caméra dans PreviewView — une vue spéciale de la bibliothèque CameraX. PreviewView s'adapte automatiquement au rapport d'aspect de la caméra, prend en charge ScaleType (FillCenter, FitCenter) et la rotation de l'écran sans recréer le cas d'utilisation. Le développeur n'a qu'à lier Preview à un Lifecycle via ProcessCameraProvider.
Le cas d'utilisation ImageAnalysis envoie chaque image de la caméra à un gestionnaire pour analyse : reconnaissance de texte, détection de visages, scan de codes QR. L'analyseur reçoit les images au format YUV_420_888 — l'espace colorimétrique universel d'Android. Mode de fonctionnement (BLOCKING ou NON_BLOCKING) contrôle la file d'attente des images : BLOCKING attend la fin de l'analyse précédente, NON_BLOCKING ignore les images en cas de retard.
Le cas d'utilisation ImageCapture prend des photos de la caméra avec les réglages de flash, de résolution et de compression. Les formats JPEG et RAW sont pris en charge (sur les appareils compatibles). ImageCapture enregistre l'instantané de manière asynchrone via OnImageCapturedCallback ou directement dans un fichier via ImageCapture.OutputFileOptions.
Le cas d'utilisation VideoCapture a été ajouté dans CameraX 1.1.0 (bêta) et permet d'enregistrer une vidéo jusqu'en 4K à 30 FPS. Le cas d'utilisation se synchronise automatiquement avec Preview : l'image dans le viseur correspond à ce qui est enregistré dans le fichier. VideoCapture utilise MediaCodec et MediaMuxer en interne, masquant la complexité de la configuration du codec vidéo et du conteneur MP4.
CameraX et Camera2 sont deux approches pour travailler avec la caméra sous Android. Camera2 est une API de bas niveau offrant un contrôle total sur l'appareil. CameraX est une abstraction de haut niveau automatisant les scénarios typiques. Le choix entre eux dépend des exigences du projet.
| Caractéristique | CameraX | Camera2 |
|---|---|---|
| Niveau d'API | Haut (cas d'utilisation) | Bas (contrôle total) |
| Code spécifique à l'appareil | Non requis | Requis pour chaque appareil |
| Liaison au cycle de vie | Automatique | Manuelle |
| Extensions | Intégrées (HDR, Portrait, Night) | Nécessitent une implémentation OEM |
| Complexité d'implémentation | 15–30 lignes de code | 100–300 lignes de code |
| Support d'API | API 21+ | API 21+ |
| Flexibilité | Scénarios standard | Tout scénario |
Utilisez CameraX pour les tâches standard : caméra dans l'application, scanner QR, traitement de flux ML. Utilisez Camera2 lorsque le contrôle manuel de l'exposition, la prise de vue RAW avec contrôle total des paramètres, ou le travail avec plusieurs caméras simultanément est requis.
Examinons une configuration complète de CameraX dans une application Android utilisant les trois cas d'utilisation principaux : Preview, ImageCapture et ImageAnalysis.
Le code lie CameraX au cycle de vie de l'Activity via ProcessCameraProvider. D'abord, une instance du fournisseur est demandée, puis les cas d'utilisation sont créés et la liaison est effectuée.
val cameraProviderFuture =
ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
// Création de Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(
binding.viewFinder.surfaceProvider
)
}
// Création de ImageCapture
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// Liaison au Lifecycle
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}, ContextCompact.getMainExecutor(this))
Le code Kotlin obtient ProcessCameraProvider via un future, crée les cas d'utilisation Preview et ImageCapture, et les lie au cycle de vie de l'Activity actuelle. CameraX gère automatiquement la rotation de l'écran, le changement de caméra et la libération des ressources lors de la fermeture de l'Activity.
Ajoutons un cas d'utilisation ImageAnalysis pour le traitement image par image du flux de la caméra, par exemple pour l'intégration avec ML Kit.
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
)
.build()
imageAnalysis.setAnalyzer(
ContextCompact.getMainExecutor(this)
) { imageProxy ->
// Conversion YUV en Bitmap pour ML Kit
val bitmap = ImageUtils.yuvToBitmap(imageProxy)
val inputImage = InputImage.fromBitmap(bitmap)
// Lancement de la reconnaissance de texte ML Kit
recognizer.process(inputImage)
.addOnSuccessListener { result ->
// Traitement du résultat
processTextResult(result)
}
.addOnCompleteListener {
imageProxy.close()
}
}
ImageAnalysis avec stratégie KEEP_ONLY_LATEST ne traite que la dernière image disponible, ignorant les images obsolètes si l'analyseur ne suit pas le rythme. Chaque image est convertie de YUV en Bitmap pour ML Kit, après quoi la reconnaissance de texte est lancée. L'appel à imageProxy.close() est obligatoire — sinon CameraX cessera de fournir de nouvelles images.
Les extensions CameraX sont un module qui ajoute des modes de prise de vue avancés : portrait (flou d'arrière-plan), HDR (plage dynamique étendue), mode nuit (prise de vue en faible luminosité), retouche automatique (correction de la peau) et mode beauté. Les extensions ne sont activées que sur les appareils où le fabricant de la caméra a fourni une implémentation OEM.
Avant d'utiliser les extensions CameraX, vous devez vérifier si l'extension est disponible sur l'appareil actuel. Google recommande de vérifier via ExtensionsManager.isExtensionAvailable.
val extensionsManager =
ExtensionsManager.getInstance(this)
if (extensionsManager.isExtensionAvailable(
cameraProvider,
CameraSelector.DEFAULT_BACK_CAMERA,
ExtensionMode.BOKEH
)) {
// Activation du mode portrait
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}
Le code vérifie la prise en charge de l'extension BOKEH (portrait) via ExtensionsManager et l'active si une implémentation OEM est disponible. CameraX bascule automatiquement les paramètres de la caméra pour le mode portrait. Si l'extension n'est pas disponible, l'application continue de fonctionner en mode standard sans crash.
Les extensions CameraX résolvent l'un des principaux problèmes du développement Android : la fragmentation des caméras. Sur différents appareils, le mode portrait est implémenté différemment — certains utilisent des objectifs doubles, d'autres utilisent un flou logiciel. CameraX abstrait cette différence : le développeur active le mode BOKEH, et la bibliothèque elle-même détermine comment l'implémenter sur un appareil spécifique. Google maintient une liste de partenaires OEM vérifiés : Samsung, Xiaomi, OPPO, vivo, Google Pixel.
Lorsque vous travaillez avec CameraX, il est important de considérer les limitations du nombre de cas d'utilisation simultanés : sur la plupart des appareils, un maximum de 3 cas d'utilisation peuvent être exécutés en même temps. Par exemple, Preview + ImageCapture + ImageAnalysis fonctionne sur tous les appareils modernes, mais Preview + ImageCapture + VideoCapture peut ne pas être pris en charge sur les modèles économiques. CameraX fournit la méthode ProcessCameraProvider.checkAvailability(), qui vérifie la compatibilité de la combinaison de cas d'utilisation avant la liaison, aidant ainsi à éviter les crashs au moment de l'exécution.
CameraX s'intègre avec Jetpack Navigation via CameraXFragment ou PreviewView compatible Compose. Pour Compose, l'élément AndroidView est utilisé, dans lequel PreviewView est intégré. CameraX gère correctement la rotation de l'écran et les changements de configuration sans perdre l'état de la session de la caméra — il suffit de spécifier le LifecycleOwner, et la bibliothèque recréera automatiquement les liaisons des cas d'utilisation lors de la rotation de l'appareil.
Pour tester CameraX sans appareil réel, Google fournit TestableCameraX — une bibliothèque qui émule le comportement de la caméra dans les tests unitaires. TestableCameraX permet de simuler des images de la caméra, de tester le fonctionnement d'ImageAnalysis et la correction d'ImageCapture sans appareil physique. Cela accélère considérablement le pipeline CI/CD pour les projets travaillant avec la caméra.
Foire aux questions
Android 5.0 (API 21) et supérieur. CameraX couvre 99 % des appareils Android actifs. Les extensions (Portrait, HDR) nécessitent API 23+ et la prise en charge OEM du mode spécifique.
Oui, le cas d'utilisation ImageAnalysis transmet chaque image à l'analyseur. Les images sont converties de YUV_420_888 en InputImage pour ML Kit. C'est le modèle standard pour créer un scanner ML.
CameraX est une API de haut niveau avec une architecture de cas d'utilisation, une liaison automatique au cycle de vie et la gestion des différences spécifiques à l'appareil. Camera2 est une API de bas niveau offrant un contrôle complet de la caméra avec une grande quantité de code passe-partout.
Oui, le cas d'utilisation VideoCapture a été ajouté dans CameraX 1.1.0-beta. Il enregistre la vidéo avec le microphone et se synchronise avec Preview. Pour des scénarios plus complexes, utilisez Camera2 directement.
Via CameraSelector : DEFAULT_BACK_CAMERA ou DEFAULT_FRONT_CAMERA. Pour basculer, appelez cameraProvider.bindToLifecycle() avec un nouveau sélecteur — CameraX redémarrera automatiquement la session.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi