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 — «напиши один раз, працює на всіх пристроях». Бібліотека автоматично обробляє апаратні відмінності: розташування камер, підтримувані роздільні здатності, орієнтацію сенсора та доступні формати — розробнику не потрібно писати device-specific код.
Архітектура 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) | Низький (повний контроль) |
| Device-specific код | Не потрібен | Потрібен для кожного пристрою |
| Прив'язка до Lifecycle | Автоматична | Ручна |
| Розширення | Вбудовані (HDR, Portrait, Night) | Вимагають OEM-реалізації |
| Складність впровадження | 15–30 рядків коду | 100–300 рядків коду |
| Підтримка API | API 21+ | API 21+ |
| Гнучкість | Стандартні сценарії | Будь-які сценарії |
Використовуйте CameraX для стандартних завдань: камера в додатку, сканер QR, ML-обробка потоку. Використовуйте Camera2, коли потрібне ручне керування експозицією, RAW-знімання з повним контролем параметрів, робота з кількома камерами одночасно.
Розглянемо повне налаштування CameraX у Android-додатку з використанням усіх трьох основних use cases: 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 через ф'ючерс, створює 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 та обробкою device-specific відмінностей. 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також