CameraX: wat is het, CameraX API en hoe de camera werkt

Auteur: IT Sectr Gepubliceerd: 2026-03-26 Leestijd: 8 min

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 — Jetpack-bibliotheek voor Android-camera met use case API: Preview, ImageCapture en ImageAnalysis
  • Use case-architectuur bevrijdt de ontwikkelaar van handmatig beheer van sessie en camerastatussen
  • CameraX Extensions voegen portretmodus, HDR en nachtfotografie toe op apparaten die dit ondersteunen
  • Typeveiligheid — CameraX controleert compatibiliteit van use cases via ProcessCameraProvider
  • Compatibiliteit met 99% Android-apparaten vanaf Android 5.0 (API 21)

Wat is CameraX?

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+.

Belangrijkste functies

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 use cases

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 caseDoelKlasse
PreviewRealtime camerabeeld weergevenPreviewView
ImageCaptureFoto's maken met flits- en resolutie-instellingenImageCapture
ImageAnalysisElk frame analyseren voor ML-verwerkingImageAnalysis
VideoCaptureVideo opnemen met microfoon (sinds 1.1.0-beta)VideoCapture

Preview

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

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

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 — video opnemen

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 vs Camera2

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.

KenmerkCameraXCamera2
API-niveauHoog (use case)Laag (volledige controle)
Apparaatspecifieke codeNiet nodigVereist voor elk apparaat
Koppeling aan LifecycleAutomatischHandmatig
ExtensiesIngebouwd (HDR, Portrait, Night)Vereisen OEM-implementatie
Implementatiecomplexiteit15–30 regels code100–300 regels code
API-ondersteuningAPI 21+API 21+
FlexibiliteitStandaard scenario'sAlle 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.

Codevoorbeelden in Kotlin

Laten we de volledige configuratie van CameraX in een Android-app bekijken met alle drie de belangrijkste use cases: Preview, ImageCapture en ImageAnalysis.

ProcessCameraProvider configureren

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.

kotlin
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.

ImageAnalysis voor ML-verwerking

Laten we ImageAnalysis use case toevoegen voor frame-voor-frame-verwerking van de camerastroom, bijvoorbeeld voor integratie met ML Kit.

kotlin
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

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.

Extensies controleren en inschakelen

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.

kotlin
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

Vanaf welke Android-versies werkt CameraX?

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.

Kan CameraX worden gebruikt met ML Kit?

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.

Wat is het verschil tussen CameraX en Camera2?

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.

Ondersteunt CameraX video-opname?

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.

Hoe schakel ik tussen voor- en achtercamera?

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

  • CameraX — Jetpack-bibliotheek voor Android-camera met use case-architectuur (Preview, ImageCapture, ImageAnalysis, VideoCapture)
  • Use cases worden in één sessie gecombineerd: Preview + ImageAnalysis voor ML of Preview + ImageCapture voor foto's
  • Lifecycle-koppeling beheert automatisch camerabronnen bij schermrotatie en wijziging van Activity-statussen
  • CameraX Extensions voegen portretmodus, HDR en nachtfotografie toe op compatibele apparaten
  • Compatibiliteit met 99% Android-apparaten vanaf API 21 zonder apparaatspecifieke code
  • Integratie met ML Kit via ImageAnalysis maakt realtime analyse van elk frame mogelijk
  • Voor standaardtaken is CameraX de optimale keuze, gebruik Camera2 voor volledige controle

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.

Bespreek het project

Lees ook