CameraX — een Android Jetpack-bibliotheek voor het werken met de camera, die een eenvoudige en consistente API biedt bovenop de complexe Camera2. Het abstraheert de verschillen tussen honderden modellen Android-apparaten en garandeert hetzelfde gedrag van de camera op verschillende toestellen. Volgens Android Developer CameraX Guide (2026) wordt de bibliotheek gebruikt in 25.000+ Google Play-apps en werkt het op apparaten met API Level 21 en hoger.
Belangrijkste punten
CameraX — is een bibliotheek uit de Android Jetpack-suite, voor het eerst uitgebracht door Google in 2019 als vervanging voor de verouderde Camera API en een vereenvoudigd alternatief voor de complexe Camera2. De belangrijkste filosofie van CameraX — „schrijf eenmaal, werk op alle apparaten". De bibliotheek verwerkt automatisch hardwareverschillen: positie van camera's, ondersteunde resoluties, sensororiëntatie en beschikbare formaten — de ontwikkelaar hoeft geen apparaatspecifieke code te schrijven.
De architectuur van CameraX is gebaseerd op use cases: Preview (beeld van camera tonen in Viewfinder), ImageCapture (foto's maken), ImageAnalysis (analyse van beeldstromen voor ML) en VideoCapture (video opnemen). Elke use case is een onafhankelijk component dat kan worden gecombineerd: tegelijkertijd Preview voor de zoeker en ImageAnalysis voor ML-verwerking uitvoeren. Volgens Google (2026) wordt CameraX ondersteund op 99% Android-apparaten met API 21+.
CameraX biedt automatisch schakelen tussen voor- en achtercamera, ondersteuning voor schermrotatie zonder sessie opnieuw aan te maken, ingebouwde levenscyclusafhandeling via LifecycleOwner, koppeling van use cases aan één Lifecycle-proces, ondersteuning voor Camera2 Extensions voor portret, HDR en nachtmodus, en TestableCameraX voor unittesten zonder echt apparaat.
CameraX definieert vier standaard use cases, die elk een specifieke camerataak oplossen. Use cases kunnen worden gecombineerd: de populairste combinaties zijn Preview + ImageCapture voor de camera en Preview + ImageAnalysis voor een ML-scanner.
| Use case | Doel | Klasse |
|---|---|---|
| Preview | Realtime camerabeeld weergeven | PreviewView |
| ImageCapture | Foto's maken met flits- en resolutie-instellingen | ImageCapture |
| ImageAnalysis | Elk frame analyseren voor ML-verwerking | ImageAnalysis |
| VideoCapture | Video opnemen met microfoon (sinds 1.1.0-beta) | VideoCapture |
Preview use case toont de videostream van de camera in PreviewView — een speciale View uit de CameraX-bibliotheek. PreviewView past zich automatisch aan de beeldverhouding van de camera aan, ondersteunt ScaleType (FillCenter, FitCenter) en schermrotatie zonder de use case opnieuw aan te maken. De ontwikkelaar hoeft alleen Preview aan Lifecycle te koppelen via ProcessCameraProvider.
ImageAnalysis use case stuurt elk frame van de camera naar de handler voor analyse: tekstherkenning, gezichtsdetectie, QR-codes scannen. De analysator ontvangt frames in YUV_420_888-formaat — de universele Android-kleurruimte. Werkmodus (BLOCKING of NON_BLOCKING) beheert de framewachtrij: BLOCKING wacht op voltooiing van vorige analyse, NON_BLOCKING slaat frames over bij vertraging.
ImageCapture use case maakt foto's met de camera met flits-, resolutie- en compressie-instellingen. JPEG- en RAW-formaten worden ondersteund (op compatibele apparaten). ImageCapture slaat de foto asynchroon op via OnImageCapturedCallback of rechtstreeks in een bestand via ImageCapture.OutputFileOptions.
VideoCapture use case is toegevoegd in CameraX 1.1.0 (bèta) en maakt video-opname mogelijk met een resolutie tot 4K bij 30 FPS. De use case synchroniseert automatisch met Preview: het beeld in de zoeker komt overeen met wat in het bestand wordt opgenomen. VideoCapture gebruikt intern MediaCodec en MediaMuxer en verbergt de complexiteit van het configureren van de videocodec en MP4-container.
CameraX en Camera2 — twee benaderingen voor werken met de camera in Android. Camera2 — low-level API die volledige controle over het apparaat geeft. CameraX — high-level abstractie die typische scenario's automatiseert. De keuze tussen beide hangt af van de projectvereisten.
| Kenmerk | CameraX | Camera2 |
|---|---|---|
| API-niveau | Hoog (use case) | Laag (volledige controle) |
| Apparaatspecifieke code | Niet nodig | Vereist voor elk apparaat |
| Koppeling aan Lifecycle | Automatisch | Handmatig |
| Extensies | Ingebouwd (HDR, Portrait, Night) | Vereisen OEM-implementatie |
| Implementatiecomplexiteit | 15–30 regels code | 100–300 regels code |
| API-ondersteuning | API 21+ | API 21+ |
| Flexibiliteit | Standaard scenario's | Alle scenario's |
Gebruik CameraX voor standaardtaken: camera in app, QR-scanner, ML-stroomverwerking. Gebruik Camera2 wanneer handmatige belichtingsregeling, RAW-fotografie met volledige parametercontrole, werken met meerdere camera's tegelijk vereist is.
Laten we de volledige configuratie van CameraX in een Android-app bekijken met alle drie de belangrijkste use cases: Preview, ImageCapture en ImageAnalysis.
De code koppelt CameraX aan de Lifecycle van Activity via ProcessCameraProvider. Eerst wordt een provider-instantie aangevraagd, daarna worden use cases gemaakt en wordt de koppeling uitgevoerd.
val cameraProviderFuture =
ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
// Preview aanmaken
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(
binding.viewFinder.surfaceProvider
)
}
// ImageCapture aanmaken
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// Koppelen aan Lifecycle
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}, ContextCompact.getMainExecutor(this))
Kotlin-code krijgt ProcessCameraProvider via een future, maakt Preview- en ImageCapture-use cases aan en koppelt ze aan de Lifecycle van de huidige Activity. CameraX verwerkt automatisch schermrotatie, cameraschakeling en het vrijgeven van bronnen bij het sluiten van Activity.
Laten we ImageAnalysis use case toevoegen voor frame-voor-frame-verwerking van de camerastroom, bijvoorbeeld voor integratie met ML Kit.
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
)
.build()
imageAnalysis.setAnalyzer(
ContextCompact.getMainExecutor(this)
) { imageProxy ->
// YUV converteren naar Bitmap voor ML Kit
val bitmap = ImageUtils.yuvToBitmap(imageProxy)
val inputImage = InputImage.fromBitmap(bitmap)
// ML Kit tekstherkenning starten
recognizer.process(inputImage)
.addOnSuccessListener { result ->
// Resultaat verwerken
processTextResult(result)
}
.addOnCompleteListener {
imageProxy.close()
}
}
ImageAnalysis met KEEP_ONLY_LATEST-strategie verwerkt alleen het laatste beschikbare frame en slaat verouderde frames over als de analysator niet bijhoudt. Elk frame wordt geconverteerd van YUV naar Bitmap voor ML Kit, waarna tekstherkenning wordt gestart. De aanroep imageProxy.close() is verplicht — anders stopt CameraX met het leveren van nieuwe frames.
CameraX Extensions — module die geavanceerde opnamemodi toevoegt: portret (achtergrondvervaging), HDR (uitgebreid dynamisch bereik), nachtmodus (fotograferen bij weinig licht), autoretouche (huidcorrectie) en „mooi gezicht"-modus (beauty). Extensies worden alleen geactiveerd op apparaten waar de camerafabrikant een OEM-implementatie heeft geleverd.
Voordat u CameraX Extensions gebruikt, moet u controleren of de extensie beschikbaar is op het huidige apparaat. Google raadt aan om te controleren via ExtensionsManager.isExtensionAvailable.
val extensionsManager =
ExtensionsManager.getInstance(this)
if (extensionsManager.isExtensionAvailable(
cameraProvider,
CameraSelector.DEFAULT_BACK_CAMERA,
ExtensionMode.BOKEH
)) {
// Portretmodus inschakelen
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}
De code controleert ondersteuning voor de BOKEH-extensie (portret) via ExtensionsManager en schakelt deze in als er een OEM-implementatie beschikbaar is. CameraX schakelt automatisch de camera-instellingen naar portretmodus. Als de extensie niet beschikbaar is, blijft de app in de standaardmodus werken zonder crashes.
CameraX Extensions lossen een van de grootste problemen van Android-ontwikkeling op: camerafragmentatie. Op verschillende apparaten wordt de portretmodus anders geïmplementeerd — sommige gebruiken twee lenzen, andere — softwarematige vervaging. CameraX abstraheert dit verschil: de ontwikkelaar schakelt de BOKEH-modus in en de bibliotheek bepaalt zelf hoe deze op het specifieke apparaat te implementeren. Google onderhoudt een lijst van geverifieerde OEM-partners: Samsung, Xiaomi, OPPO, vivo, Google Pixel.
Bij het werken met CameraX is het belangrijk rekening te houden met beperkingen van het aantal gelijktijdige use cases: op de meeste apparaten kunnen maximaal 3 use cases tegelijk worden uitgevoerd. Preview + ImageCapture + ImageAnalysis werken bijvoorbeeld op alle moderne apparaten, maar Preview + ImageCapture + VideoCapture wordt mogelijk niet ondersteund op budgetmodellen. CameraX biedt de methode ProcessCameraProvider.checkAvailability() die de compatibiliteit van de use case-combinatie controleert vóór het koppelen, waardoor crashes in runtime worden voorkomen.
CameraX integreert met Jetpack Navigation via CameraXFragment of Compose-compatibele PreviewView. Voor Compose wordt het element AndroidView gebruikt waarin PreviewView wordt ingebed. CameraX verwerkt schermrotatie en configuratiewijzigingen correct zonder verlies van de camerasesiestatus — het volstaat om LifecycleOwner op te geven en de bibliotheek zal automatisch de use case-koppelingen opnieuw aanmaken bij rotatie van het apparaat.
Voor het testen van CameraX zonder echt apparaat biedt Google TestableCameraX — een bibliotheek die het gedrag van de camera emuleert in unittesten. TestableCameraX maakt het mogelijk cameraframes te simuleren, de werking van ImageAnalysis en de correctheid van ImageCapture-verwerking te controleren zonder fysiek apparaat. Dit versnelt de CI/CD-pijplijn aanzienlijk voor projecten die met de camera werken.
Veelgestelde vragen
Android 5.0 (API 21) en hoger. CameraX dekt 99% van de actieve Android-apparaten. Voor extensies (Portrait, HDR) is API 23+ en OEM-ondersteuning van de specifieke modus vereist.
Ja, ImageAnalysis use case stuurt elk frame naar de analysator. Frames worden geconverteerd van YUV_420_888 naar InputImage voor ML Kit. Dit is het standaardpatroon voor het maken van een ML-scanner.
CameraX — high-level API met use case-architectuur, automatische Lifecycle-koppeling en verwerking van apparaatspecifieke verschillen. Camera2 — low-level volledige controle over de camera met veel boilerplate-code.
Ja, VideoCapture use case is toegevoegd in CameraX 1.1.0-beta. Het neemt video op met microfoon en synchroniseert met Preview. Gebruik voor complexere scenario's direct Camera2.
Via CameraSelector: DEFAULT_BACK_CAMERA of DEFAULT_FRONT_CAMERA. Om te schakelen roept u cameraProvider.bindToLifecycle() aan met een nieuwe selector — CameraX start de sessie automatisch opnieuw.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook