CameraX — Android Jetpack библиотека за рад са камером, која пружа једноставан и конзистентан API изнад сложеног Camera2. Апстрахује разлике између стотина модела Android уређаја и гарантује исто понашање камере на различитим уређајима. Према Android Developer CameraX Guide (2026), библиотека се користи у 25 000+ апликација Google Play-а и ради на уређајима са API Level 21 и вишим.
Главне тачке
CameraX — је библиотека из састава Android Jetpack-а, први пут објављена од стране Google-а 2019. године као замена за застарели Camera API и поједностављена алтернатива сложеном Camera2. Основна филозофија CameraX-а — „напиши једном, ради на свим уређајима". Библиотека аутоматски обрађује хардверске разлике: положај камера, подржане резолуције, оријентацију сензора и доступне формате — програмер не мора да пише code специфичан за уређај.
Архитектура CameraX је изграђена на use cases: Preview (приказ слике са камере у Viewfinder-у), ImageCapture (фотографисање), ImageAnalysis (анализа тока кадрова за ML) и VideoCapture (снимање видеа). Сваки use case је независна компонента која се може комбиновати: истовремено покренути Preview за визир и ImageAnalysis за ML обраду. Према Google-у (2026), CameraX је подржан на 99% Android уређаја са API 21+.
CameraX пружа аутоматско пребацивање између предње и задње камере, подршку за ротацију екрана без поновног креирања сесије, уграђену обраду животног циклуса кроз LifecycleOwner, повезивање use cases на један Lifecycle процес, подршку за Camera2 Extensions за портрет, HDR и ноћни режим, као и TestableCameraX за unit тестирање без правог уређаја.
CameraX дефинише четири стандардна use case-а, од којих сваки решава конкретан задатак рада са камером. Use cases се могу комбиновати: најпопуларније комбинације су Preview + ImageCapture за камеру и Preview + ImageAnalysis за ML скенер.
| Use case | Намена | Класа |
|---|---|---|
| Preview | Приказ слике са камере у реалном времену | PreviewView |
| ImageCapture | Фотографисање са подешавањима блица и резолуције | ImageCapture |
| ImageAnalysis | Анализа сваког кадра за ML обраду | ImageAnalysis |
| VideoCapture | Снимање видеа са микрофоном (од 1.1.0-beta) | VideoCapture |
Preview use case приказује видео ток са камере у PreviewView-у — посебном View-у из библиотеке CameraX. PreviewView се аутоматски прилагођава односу страница камере, подржава ScaleType (FillCenter, FitCenter) и ротацију екрана без поновног креирања use case-а. Програмер треба само да повеже Preview са Lifecycle-ом кроз ProcessCameraProvider.
ImageAnalysis use case прослеђује сваки кадар са камере руковаоцу за анализу: препознавање текста, детекцију лица, скенирање QR кодова. Анализатор прима кадрове у YUV_420_888 формату — универзалном Android простору боја. Режим рада (BLOCKING или NON_BLOCKING) управља редом кадрова: BLOCKING чека завршетак претходне анализе, NON_BLOCKING прескаче кадрове при кашњењу.
ImageCapture use case прави фотографије са камере са подешавањима блица, резолуције и компресије. Подржани су JPEG и RAW формати (на компатибилним уређајима). ImageCapture чува снимак асинхроно кроз OnImageCapturedCallback или директно у датотеку путем ImageCapture.OutputFileOptions.
VideoCapture use case је додат у CameraX 1.1.0 (бета) и омогућава снимање видеа у резолуцији до 4K при 30 FPS. Use case се аутоматски синхронизује са Preview-ом: слика у визиру одговара ономе што се снима у датотеку. VideoCapture интерно користи MediaCodec и MediaMuxer, скривајући сложеност подешавања видео кодека и MP4 контејнера.
CameraX и Camera2 — два приступа раду са камером у Android-у. Camera2 — ниск ниво API, који даје потпуну контролу над уређајем. CameraX — висок ниво апстракције, који аутоматизује типичне сценарије. Избор између њих зависи од захтева пројекта.
| Карактеристика | CameraX | Camera2 |
|---|---|---|
| Ниво API-ја | Висок (use case) | Низак (пуна контрола) |
| Код специфичан за уређај | Није потребан | Потребан за сваки уређај |
| Повезивање са Lifecycle-ом | Аутоматско | Ручно |
| Проширења | Уграђена (HDR, Portrait, Night) | Захтевају OEM имплементацију |
| Сложеност имплементације | 15–30 линија кода | 100–300 линија кода |
| Подршка за API | API 21+ | API 21+ |
| Флексибилност | Стандардни сценарији | Било који сценарији |
Користите CameraX за стандардне задатке: камера у апликацији, QR скенер, ML обрада тока. Користите Camera2 када је потребна ручна контрола експозиције, RAW фотографисање са потпуном контролом параметара, рад са више камера истовремено.
Размотримо пуну конфигурацију CameraX у Android апликацији коришћењем сва три главна use case-а: Preview, ImageCapture и ImageAnalysis.
Код повезује CameraX са Lifecycle-ом Activity кроз ProcessCameraProvider. Прво се захтева инстанца провајдера, затим се креирају use cases и извршава повезивање.
val cameraProviderFuture =
ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
// Креирање Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(
binding.viewFinder.surfaceProvider
)
}
// Креирање ImageCapture
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// Повезивање са Lifecycle-ом
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}, ContextCompact.getMainExecutor(this))
Kotlin код добија ProcessCameraProvider кроз future, креира use cases Preview и ImageCapture, и повезује их са Lifecycle-ом тренутне Activity. CameraX аутоматски обрађује ротацију екрана, пребацивање камера и ослобађање ресурса при затварању Activity.
Додајмо ImageAnalysis use case за обраду кадар по кадар тока са камере, на пример за интеграцију са ML Kit-ом.
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
)
.build()
imageAnalysis.setAnalyzer(
ContextCompact.getMainExecutor(this)
) { imageProxy ->
// Конверзија YUV у Bitmap за ML Kit
val bitmap = ImageUtils.yuvToBitmap(imageProxy)
val inputImage = InputImage.fromBitmap(bitmap)
// Покретање препознавања текста ML Kit
recognizer.process(inputImage)
.addOnSuccessListener { result ->
// Обрада резултата
processTextResult(result)
}
.addOnCompleteListener {
imageProxy.close()
}
}
ImageAnalysis са стратегијом KEEP_ONLY_LATEST обрађује само последњи доступан кадар, прескачући застареле ако анализатор не стиже. Сваки кадар се конвертује из YUV-а у Bitmap за ML Kit, након чега се покреће препознавање текста. Позив imageProxy.close() је обавезан — у супротном CameraX престаје да испоручује нове кадрове.
CameraX Extensions — модул који додаје напредне режиме снимања: портретни (замућење позадине), HDR (проширени динамички опсег), ноћни режим (снимање при слабом осветљењу), аутоматско ретуширање (корекција коже) и режим „лепо лице" (beauty). Проширења се активирају само на уређајима где је произвођач камере обезбедио OEM имплементацију.
Пре употребе CameraX Extensions потребно је проверити да ли је проширење доступно на тренутном уређају. Google препоручује проверу кроз ExtensionsManager.isExtensionAvailable.
val extensionsManager =
ExtensionsManager.getInstance(this)
if (extensionsManager.isExtensionAvailable(
cameraProvider,
CameraSelector.DEFAULT_BACK_CAMERA,
ExtensionMode.BOKEH
)) {
// Укључивање портретног режима
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}
Код проверава подршку за BOKEH (портретно) проширење кроз ExtensionsManager и укључује га ако постоји OEM имплементација. CameraX аутоматски пребацује подешавања камере за портретни режим. Ако проширење није доступно, апликација наставља да ради у стандардном режиму без падова.
CameraX Extensions решавају један од главних проблема Android развоја: фрагментацију камера. На различитим уређајима портретни режим се имплементира различито — неки користе два објектива, други — софтверско замућење. CameraX апстрахује ову разлику: програмер укључује BOKEH режим, а библиотека сама одређује како да га имплементира на конкретном уређају. Google одржава листу проверених OEM партнера: Samsung, Xiaomi, OPPO, vivo, Google Pixel.
При раду са CameraX важно је узети у обзир ограничења броја истовремених use cases: на већини уређаја може се истовремено покренути максимално 3 use case-а. На пример, Preview + ImageCapture + ImageAnalysis раде на свим модерним уређајима, али Preview + ImageCapture + VideoCapture можда неће бити подржани на буџетским моделима. CameraX пружа метод ProcessCameraProvider.checkAvailability() који проверава компатибилност комбинације use cases пре повезивања, што омогућава избегавање crash-ова у runtime-у.
CameraX се интегрише са Jetpack Navigation кроз CameraXFragment или Compose-компатибилни PreviewView. За Compose користи се елемент AndroidView у који се уграђује PreviewView. CameraX исправно обрађује ротацију екрана и промену конфигурације без губитка стања сесије камере — довољно је навести LifecycleOwner, а библиотека ће аутоматски поново креирати повезивање use cases при ротацији уређаја.
За тестирање CameraX без правог уређаја Google пружа TestableCameraX — библиотеку која емулира понашање камере у unit тестовима. TestableCameraX омогућава симулацију кадрова са камере, проверу рада ImageAnalysis и исправност обраде ImageCapture без физичког уређаја. Ово значајно убрзава CI/CD цевовод за пројекте који раде са камером.
Често постављана питања
Android 5.0 (API 21) и виши. CameraX покрива 99% активних Android уређаја. За проширења (Portrait, HDR) потребан је API 23+ и OEM подршка конкретног режима.
Да, ImageAnalysis use case прослеђује сваки кадар анализатору. Кадрови се конвертују из YUV_420_888 у InputImage за ML Kit. Ово је стандардни образац за креирање ML скенера.
CameraX — висок ниво API са use case архитектуром, аутоматским повезивањем са Lifecycle-ом и обрадом разлика специфичних за уређај. Camera2 — низак ниво потпуне контроле над камером са великом количином boilerplate кода.
Да, VideoCapture use case је додат у CameraX 1.1.0-beta. Снима видео са микрофоном и синхронизује се са Preview-ом. За сложеније сценарије користите Camera2 директно.
Кроз CameraSelector: DEFAULT_BACK_CAMERA или DEFAULT_FRONT_CAMERA. За пребацивање позовите cameraProvider.bindToLifecycle() са новим селектором — CameraX ће аутоматски поново покренути сесију.
Закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође