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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также