CameraX — biblioteca Android Jetpack pentru lucrul cu camera, care oferă un API simplu și consistent peste complexul Camera2. Abstrage diferențele dintre sutele de modele de dispozitive Android și garantează același comportament al camerei pe diferite aparate. Conform Android Developer CameraX Guide (2026), biblioteca este utilizată în 25 000+ aplicații Google Play și funcționează pe dispozitive cu API Level 21 și superior.
Principalele puncte
CameraX — este o bibliotecă din compunerea Android Jetpack, lansată pentru prima dată de Google în 2019 ca înlocuitor pentru Camera API învechit și o alternativă simplificată la complexul Camera2. Filozofia principală a CameraX — «scrie o dată, funcționează pe toate dispozitivele». Biblioteca gestionează automat diferențele hardware: amplasarea camerelor, rezoluțiile suportate, orientarea senzorului și formatele disponibile — dezvoltatorul nu trebuie să scrie cod specific dispozitivului.
Arhitectura CameraX este construită pe use cases: Preview (afișarea imaginii de la cameră în Viewfinder), ImageCapture (fotografierea), ImageAnalysis (analiza fluxului de cadre pentru ML) și VideoCapture (înregistrarea video). Fiecare use case este o componentă independentă care poate fi combinată: rulează simultan Preview pentru vizor și ImageAnalysis pentru procesarea ML. Conform Google (2026), CameraX este suportat pe 99% dispozitive Android cu API 21+.
CameraX oferă comutarea automată între camerele frontală și spate, suport pentru rotirea ecranului fără recrearea sesiunii, gestionarea încorporată a ciclului de viață prin LifecycleOwner, legarea use cases la un singur proces Lifecycle, suport pentru Camera2 Extensions pentru portret, HDR și modul noapte, precum și TestableCameraX pentru testare unitară fără dispozitiv real.
CameraX definește patru use cases standard, fiecare rezolvând o sarcină specifică de lucru cu camera. Use cases pot fi combinate: cele mai populare combinații sunt Preview + ImageCapture pentru cameră și Preview + ImageAnalysis pentru scaner ML.
| Use case | Destinație | Clasă |
|---|---|---|
| Preview | Afișarea imaginii camerei în timp real | PreviewView |
| ImageCapture | Fotografierea cu setări de bliț și rezoluție | ImageCapture |
| ImageAnalysis | Analiza fiecărui cadru pentru procesarea ML | ImageAnalysis |
| VideoCapture | Înregistrarea video cu microfon (de la 1.1.0-beta) | VideoCapture |
Preview use case afișează fluxul video de la cameră în PreviewView — un View special din biblioteca CameraX. PreviewView se adaptează automat la proporțiile camerei, suportă ScaleType (FillCenter, FitCenter) și rotirea ecranului fără recrearea use case. Dezvoltatorul trebuie doar să lege Preview de Lifecycle prin ProcessCameraProvider.
ImageAnalysis use case transmite fiecare cadru de la cameră către handler pentru analiză: recunoașterea textului, detectarea fețelor, scanarea codurilor QR. Analizatorul primește cadrele în format YUV_420_888 — spațiul de culoare universal Android. Modul de lucru (BLOCKING sau NON_BLOCKING) gestionează coada de cadre: BLOCKING așteaptă finalizarea analizei anterioare, NON_BLOCKING omite cadrele în caz de întârziere.
ImageCapture use case face fotografii de la cameră cu setări de bliț, rezoluție și compresie. Sunt suportate formatele JPEG și RAW (pe dispozitive compatibile). ImageCapture salvează fotografia asincron prin OnImageCapturedCallback sau direct în fișier prin ImageCapture.OutputFileOptions.
VideoCapture use case a fost adăugat în CameraX 1.1.0 (beta) și permite înregistrarea video cu rezoluție de până la 4K la 30 FPS. Use case se sincronizează automat cu Preview: imaginea din vizor corespunde cu ceea ce se înregistrează în fișier. VideoCapture utilizează intern MediaCodec și MediaMuxer, ascunzând complexitatea configurării codecului video și containerului MP4.
CameraX și Camera2 — două abordări pentru lucrul cu camera în Android. Camera2 — API de nivel jos, oferind control complet asupra dispozitivului. CameraX — abstracție de nivel înalt, automatizând scenariile tipice. Alegerea între ele depinde de cerințele proiectului.
| Caracteristică | CameraX | Camera2 |
|---|---|---|
| Nivel API | Înalt (use case) | Jos (control complet) |
| Cod specific dispozitivului | Nu este necesar | Necesar pentru fiecare dispozitiv |
| Legarea la Lifecycle | Automată | Manuală |
| Extensii | Încorporate (HDR, Portrait, Night) | Necesită implementare OEM |
| Complexitatea implementării | 15–30 linii de cod | 100–300 linii de cod |
| Suport API | API 21+ | API 21+ |
| Flexibilitate | Scenarii standard | Orice scenarii |
Folosiți CameraX pentru sarcini standard: cameră în aplicație, scaner QR, procesare flux ML. Folosiți Camera2 când este necesar controlul manual al expunerii, fotografia RAW cu control complet al parametrilor, lucrul cu mai multe camere simultan.
Să examinăm configurarea completă a CameraX într-o aplicație Android utilizând toate cele trei use cases principale: Preview, ImageCapture și ImageAnalysis.
Codul leagă CameraX de Lifecycle-ul Activity prin ProcessCameraProvider. Mai întâi se solicită o instanță a provider-ului, apoi se creează use cases și se execută legarea.
val cameraProviderFuture =
ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
// Crearea Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(
binding.viewFinder.surfaceProvider
)
}
// Crearea ImageCapture
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// Legarea la Lifecycle
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}, ContextCompact.getMainExecutor(this))
Codul Kotlin primește ProcessCameraProvider prin future, creează use cases Preview și ImageCapture și le leagă de Lifecycle-ul Activity curente. CameraX gestionează automat rotirea ecranului, comutarea camerelor și eliberarea resurselor la închiderea Activity.
Adăugăm ImageAnalysis use case pentru procesarea cadru cu cadru a fluxului de la cameră, de exemplu pentru integrarea cu ML Kit.
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
)
.build()
imageAnalysis.setAnalyzer(
ContextCompact.getMainExecutor(this)
) { imageProxy ->
// Conversia YUV în Bitmap pentru ML Kit
val bitmap = ImageUtils.yuvToBitmap(imageProxy)
val inputImage = InputImage.fromBitmap(bitmap)
// Pornirea recunoașterii textului ML Kit
recognizer.process(inputImage)
.addOnSuccessListener { result ->
// Procesarea rezultatului
processTextResult(result)
}
.addOnCompleteListener {
imageProxy.close()
}
}
ImageAnalysis cu strategia KEEP_ONLY_LATEST procesează doar ultimul cadru disponibil, omițându-le pe cele învechite dacă analizatorul nu face față. Fiecare cadru este convertit din YUV în Bitmap pentru ML Kit, după care se rulează recunoașterea textului. Apelul imageProxy.close() este obligatoriu — altfel CameraX va înceta să furnizeze cadre noi.
CameraX Extensions — modulul care adaugă moduri avansate de fotografiere: portret (încețoșarea fundalului), HDR (gamă dinamică extinsă), modul noapte (fotografiere în condiții de iluminare slabă), autoretus (corectarea pielii) și modul „față frumoasă" (beauty). Extensiile se activează doar pe dispozitivele unde producătorul camerei a furnizat o implementare OEM.
Înainte de utilizarea CameraX Extensions trebuie verificat dacă extensia este disponibilă pe dispozitivul curent. Google recomandă verificarea prin ExtensionsManager.isExtensionAvailable.
val extensionsManager =
ExtensionsManager.getInstance(this)
if (extensionsManager.isExtensionAvailable(
cameraProvider,
CameraSelector.DEFAULT_BACK_CAMERA,
ExtensionMode.BOKEH
)) {
// Activarea modului portret
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}
Codul verifică suportul extensiei BOKEH (portret) prin ExtensionsManager și o activează dacă există o implementare OEM. CameraX comută automat setările camerei pentru modul portret. Dacă extensia nu este disponibilă, aplicația continuă să funcționeze în modul standard fără erori.
CameraX Extensions rezolvă una dintre problemele principale ale dezvoltării Android: fragmentarea camerelor. Pe diferite dispozitive, modul portret este implementat diferit — unele folosesc două obiective, altele — estomparea software. CameraX abstrage această diferență: dezvoltatorul activează modul BOKEH, iar biblioteca determină singură cum să îl implementeze pe dispozitivul concret. Google menține o listă de parteneri OEM verificați: Samsung, Xiaomi, OPPO, vivo, Google Pixel.
La lucrul cu CameraX este important să se țină cont de limitările privind numărul de use cases simultane: pe majoritatea dispozitivelor se pot rula maxim 3 use cases în același timp. De exemplu, Preview + ImageCapture + ImageAnalysis funcționează pe toate dispozitivele moderne, dar Preview + ImageCapture + VideoCapture pot să nu fie suportate pe modelele bugetare. CameraX oferă metoda ProcessCameraProvider.checkAvailability() care verifică compatibilitatea combinației de use cases înainte de legare, permițând evitarea crash-urilor în runtime.
CameraX se integrează cu Jetpack Navigation prin CameraXFragment sau PreviewView compatibil cu Compose. Pentru Compose se utilizează elementul AndroidView în care este încorporat PreviewView. CameraX gestionează corect rotirea ecranului și schimbarea configurației fără pierderea stării sesiunii camerei — este suficient să se specifice LifecycleOwner, iar biblioteca va recrea automat legarea use cases la rotirea dispozitivului.
Pentru testarea CameraX fără dispozitiv real, Google oferă TestableCameraX — o bibliotecă care emulează comportamentul camerei în teste unitare. TestableCameraX permite simularea cadrelor de la cameră, verificarea funcționării ImageAnalysis și corectitudinea procesării ImageCapture fără dispozitiv fizic. Aceasta accelerează semnificativ pipeline-ul CI/CD pentru proiectele care lucrează cu camera.
Întrebări frecvente
Android 5.0 (API 21) și superior. CameraX acoperă 99% din dispozitivele Android active. Pentru extensii (Portrait, HDR) este necesar API 23+ și suport OEM pentru modul respectiv.
Da, ImageAnalysis use case transmite fiecare cadru analizatorului. Cadrele sunt convertite din YUV_420_888 în InputImage pentru ML Kit. Acesta este modelul standard pentru crearea unui scaner ML.
CameraX — API de nivel înalt cu arhitectură use case, legare automată la Lifecycle și gestionarea diferențelor specifice dispozitivului. Camera2 — control complet de nivel jos asupra camerei cu mult cod boilerplate.
Da, VideoCapture use case a fost adăugat în CameraX 1.1.0-beta. Înregistrează video cu microfon și se sincronizează cu Preview. Pentru scenarii mai complexe, utilizați Camera2 direct.
Prin CameraSelector: DEFAULT_BACK_CAMERA sau DEFAULT_FRONT_CAMERA. Pentru comutare, apelați cameraProvider.bindToLifecycle() cu un nou selector — CameraX va reporni automat sesiunea.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și