CameraX — ett Android Jetpack-bibliotek för att arbeta med kameran, som ger ett enkelt och konsekvent API ovanpå den komplexa Camera2. Det abstraherar skillnaderna mellan hundratals Android-enhetsmodeller och garanterar samma kamerabeteende på olika enheter. Enligt Android Developer CameraX Guide (2026) används biblioteket i 25 000+ Google Play-appar och fungerar på enheter med API Level 21 och högre.
Huvudpunkter
CameraX — är ett bibliotek från Android Jetpack-paketet, första gången utgivet av Google 2019 som en ersättning för det föråldrade Camera API och ett förenklat alternativ till det komplexa Camera2. Huvudfilosofin för CameraX — „skriv en gång, fungerar på alla enheter". Biblioteket hanterar automatiskt hårdvaruskillnader: kameraplacering, upplösningar som stöds, sensororientering och tillgängliga format — utvecklaren behöver inte skriva enhetsspecifik kod.
Arkitekturen för CameraX är byggd på use cases: Preview (visa bild från kameran i Viewfinder), ImageCapture (ta fotografier), ImageAnalysis (analysera bildström för ML) och VideoCapture (spela in video). Varje use case är en oberoende komponent som kan kombineras: kör Preview för sökaren och ImageAnalysis för ML-bearbetning samtidigt. Enligt Google (2026) stöds CameraX på 99% av Android-enheter med API 21+.
CameraX erbjuder automatisk växling mellan främre och bakre kamera, stöd för skärmrotation utan att återskapa sessionen, inbyggd livscykelhantering via LifecycleOwner, bindning av use cases till en Lifecycle-process, stöd för Camera2 Extensions för porträtt, HDR och nattläge, samt TestableCameraX för enhetstestning utan verklig enhet.
CameraX definierar fyra standard use cases, som var och en löser en specifik kamerauppgift. Use cases kan kombineras: de populäraste kombinationerna är Preview + ImageCapture för kameran och Preview + ImageAnalysis för ML-skanner.
| Use case | Syfte | Klass |
|---|---|---|
| Preview | Visa kamerabild i realtid | PreviewView |
| ImageCapture | Ta fotografier med blixt- och upplösningsinställningar | ImageCapture |
| ImageAnalysis | Analysera varje bildruta för ML-bearbetning | ImageAnalysis |
| VideoCapture | Spela in video med mikrofon (från 1.1.0-beta) | VideoCapture |
Preview use case visar videoströmmen från kameran i PreviewView — en speciell View från CameraX-biblioteket. PreviewView anpassar sig automatiskt till kamerans bildförhållande, stöder ScaleType (FillCenter, FitCenter) och skärmrotation utan att återskapa use case. Utvecklaren behöver bara binda Preview till Lifecycle via ProcessCameraProvider.
ImageAnalysis use case skickar varje bildruta från kameran till hanteraren för analys: textigenkänning, ansiktsdetektering, skanning av QR-koder. Analyzatorn tar emot bildrutor i YUV_420_888-format — det universella Android-färgrummet. Arbetsläge (BLOCKING eller NON_BLOCKING) hanterar bildrutekön: BLOCKING väntar på att föregående analys ska slutföras, NON_BLOCKING hoppar över bildrutor vid försening.
ImageCapture use case tar fotografier från kameran med blixt-, upplösnings- och komprimeringsinställningar. Format som JPEG och RAW stöds (på kompatibla enheter). ImageCapture sparar fotografiet asynkront via OnImageCapturedCallback eller direkt till fil via ImageCapture.OutputFileOptions.
VideoCapture use case lades till i CameraX 1.1.0 (beta) och möjliggör videoinspelning i upplösning upp till 4K vid 30 FPS. Use case synkroniseras automatiskt med Preview: bilden i sökaren motsvarar det som spelas in till filen. VideoCapture använder internt MediaCodec och MediaMuxer och döljer komplexiteten i att konfigurera videocodec och MP4-container.
CameraX och Camera2 — två tillvägagångssätt för att arbeta med kamera i Android. Camera2 — lågnivå-API som ger full kontroll över enheten. CameraX — högnivåabstraktion som automatiserar typiska scenarier. Valet mellan dem beror på projektets krav.
| Egenskap | CameraX | Camera2 |
|---|---|---|
| API-nivå | Hög (use case) | Låg (full kontroll) |
| Enhetsspecifik kod | Krävs inte | Krävs för varje enhet |
| Bindning till Lifecycle | Automatisk | Manuell |
| Tillägg | Inbyggda (HDR, Portrait, Night) | Kräver OEM-implementering |
| Implementeringskomplexitet | 15–30 rader kod | 100–300 rader kod |
| API-stöd | API 21+ | API 21+ |
| Flexibilitet | Standardscenarier | Alla scenarier |
Använd CameraX för standarduppgifter: kamera i app, QR-skanner, ML-strömbearbetning. Använd Camera2 när manuell exponeringskontroll, RAW-fotografering med full parameterkontroll, arbete med flera kameror samtidigt krävs.
Låt oss titta på den fullständiga konfigurationen av CameraX i en Android-app med alla tre huvudsakliga use cases: Preview, ImageCapture och ImageAnalysis.
Koden binder CameraX till Lifecycle för Activity via ProcessCameraProvider. Först begärs en instans av providern, sedan skapas use cases och bindning utförs.
val cameraProviderFuture =
ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
// Skapa Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(
binding.viewFinder.surfaceProvider
)
}
// Skapa ImageCapture
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// Binda till Lifecycle
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}, ContextCompact.getMainExecutor(this))
Kotlin-kod får ProcessCameraProvider via future, skapar Preview- och ImageCapture-use cases och binder dem till Lifecycle för den aktuella Activity. CameraX hanterar automatiskt skärmrotation, kameraomkoppling och frigöring av resurser när Activity stängs.
Lägg till ImageAnalysis use case för bildrute-för-bildrute-bearbetning av kameraströmmen, till exempel för integration med ML Kit.
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
)
.build()
imageAnalysis.setAnalyzer(
ContextCompact.getMainExecutor(this)
) { imageProxy ->
// Konvertera YUV till Bitmap för ML Kit
val bitmap = ImageUtils.yuvToBitmap(imageProxy)
val inputImage = InputImage.fromBitmap(bitmap)
// Starta ML Kit-textigenkänning
recognizer.process(inputImage)
.addOnSuccessListener { result ->
// Bearbeta resultatet
processTextResult(result)
}
.addOnCompleteListener {
imageProxy.close()
}
}
ImageAnalysis med KEEP_ONLY_LATEST-strategi bearbetar endast den senaste tillgängliga bildrutan och hoppar över föråldrade om analyzatorn inte hinner med. Varje bildruta konverteras från YUV till Bitmap för ML Kit, varefter textigenkänning startas. Anropet imageProxy.close() är obligatoriskt — annars slutar CameraX att leverera nya bildrutor.
CameraX Extensions — modul som lägger till avancerade fotograferingslägen: porträtt (oskärpa bakgrunden), HDR (utökat dynamiskt omfång), nattläge (fotografera i svagt ljus), automatisk retusch (hudkorrigering) och „vackert ansikte"-läge (beauty). Tilläggen aktiveras endast på enheter där kameratillverkaren har tillhandahållit en OEM-implementering.
Innan du använder CameraX Extensions måste du kontrollera om tillägget är tillgängligt på den aktuella enheten. Google rekommenderar kontroll via ExtensionsManager.isExtensionAvailable.
val extensionsManager =
ExtensionsManager.getInstance(this)
if (extensionsManager.isExtensionAvailable(
cameraProvider,
CameraSelector.DEFAULT_BACK_CAMERA,
ExtensionMode.BOKEH
)) {
// Aktivera porträttläge
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}
Koden kontrollerar stöd för BOKEH-tillägget (porträtt) via ExtensionsManager och aktiverar det om en OEM-implementering finns tillgänglig. CameraX växlar automatiskt kamerasinställningarna till porträttläge. Om tillägget inte är tillgängligt fortsätter appen att fungera i standardläge utan krascher.
CameraX Extensions löser ett av huvudproblemen inom Android-utveckling: kamerafragmentering. På olika enheter implementeras porträttläge olika — vissa använder två linser, andra — mjukvaruskärpa. CameraX abstraherar denna skillnad: utvecklaren aktiverar BOKEH-läge och biblioteket bestämmer själv hur det ska implementeras på den specifika enheten. Google upprätthåller en lista över verifierade OEM-partners: Samsung, Xiaomi, OPPO, vivo, Google Pixel.
När du arbetar med CameraX är det viktigt att ta hänsyn till begränsningar av antalet samtidiga use cases: på de flesta enheter kan maximalt 3 use cases köras samtidigt. Till exempel fungerar Preview + ImageCapture + ImageAnalysis på alla moderna enheter, men Preview + ImageCapture + VideoCapture kanske inte stöds på budgetmodeller. CameraX tillhandahåller metoden ProcessCameraProvider.checkAvailability() som kontrollerar kompatibiliteten för use case-kombinationen före bindning, vilket gör det möjligt att undvika krascher under körning.
CameraX integreras med Jetpack Navigation via CameraXFragment eller Compose-kompatibel PreviewView. För Compose används elementet AndroidView där PreviewView är inbäddat. CameraX hanterar korrekt skärmrotation och konfigurationsändring utan att förlora kamerasessionens tillstånd — det räcker att ange LifecycleOwner och biblioteket återskapar automatiskt use case-bindningarna vid rotation av enheten.
För att testa CameraX utan verklig enhet tillhandahåller Google TestableCameraX — ett bibliotek som emulerar kamerabeteende i enhetstester. TestableCameraX gör det möjligt att simulera bildrutor från kameran, kontrollera ImageAnalysis-funktionen och korrektheten i ImageCapture-bearbetning utan fysisk enhet. Detta påskyndar avsevärt CI/CD-pipelinen för projekt som arbetar med kamera.
Vanliga frågor
Android 5.0 (API 21) och högre. CameraX täcker 99% av aktiva Android-enheter. För tillägg (Portrait, HDR) krävs API 23+ och OEM-stöd för det specifika läget.
Ja, ImageAnalysis use case skickar varje bildruta till analyzatorn. Bildrutor konverteras från YUV_420_888 till InputImage för ML Kit. Detta är standardmönstret för att skapa en ML-skanner.
CameraX — högnivå-API med use case-arkitektur, automatisk Lifecycle-bindning och hantering av enhetsspecifika skillnader. Camera2 — lågnivå full kontroll över kameran med mycket boilerplate-kod.
Ja, VideoCapture use case lades till i CameraX 1.1.0-beta. Det spelar in video med mikrofon och synkroniseras med Preview. För mer komplexa scenarier, använd Camera2 direkt.
Via CameraSelector: DEFAULT_BACK_CAMERA eller DEFAULT_FRONT_CAMERA. För att växla, anropa cameraProvider.bindToLifecycle() med en ny väljare — CameraX startar om sessionen automatiskt.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också