CameraX: что это, CameraX API и как работает камера

Автор: IT Sectr Опубликовано: 2026-03-26 Время чтения: 8 мин

CameraX — библиотека Android Jetpack для работы с камерой, предоставляющая простой и консистентный API поверх сложного Camera2. Она абстрагирует различия между сотнями моделей Android-устройств и гарантирует одинаковое поведение камеры на разных аппаратах. По данным Android Developer CameraX Guide (2026), библиотека используется в 25 000+ приложений Google Play и работает на устройствах с API Level 21 и выше.

Главное

  • CameraX — библиотека Jetpack для Android-камеры с use case API: Preview, ImageCapture и ImageAnalysis
  • Use case-архитектура избавляет разработчика от ручного управления сессией и состояниями камеры
  • CameraX Extensions добавляют портретный режим, HDR и ночную съёмку на устройствах, где это поддерживается
  • Безопасность типов — CameraX проверяет совместимость use cases через ProcessCameraProvider
  • Совместимость с 99% Android-устройств начиная с Android 5.0 (API 21)

Что такое CameraX?

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-тестирования без реального устройства.

Use cases CameraX

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

Preview use case отображает видеопоток с камеры в PreviewView — специальном View из библиотеки CameraX. PreviewView автоматически подстраивается под соотношение сторон камеры, поддерживает ScaleType (FillCenter, FitCenter) и поворот экрана без пересоздания use case. Разработчику нужно лишь привязать Preview к Lifecycle через ProcessCameraProvider.

ImageAnalysis

ImageAnalysis use case передаёт каждый кадр с камеры в обработчик для анализа: распознавание текста, обнаружение лиц, сканирование QR-кодов. Анализатор получает кадры в формате YUV_420_888 — универсальном цветовом пространстве Android. Режим работы (BLOCKING или NON_BLOCKING) управляет очередью кадров: BLOCKING ожидает завершения предыдущего анализа, NON_BLOCKING пропускает кадры при задержке.

ImageCapture

ImageCapture use case делает фотографии с камеры с настройками вспышки, разрешения и сжатия. Поддерживаются форматы JPEG и RAW (на совместимых устройствах). ImageCapture сохраняет снимок асинхронно через OnImageCapturedCallback или напрямую в файл через ImageCapture.OutputFileOptions.

VideoCapture — запись видео

VideoCapture use case добавлен в CameraX 1.1.0 (бета) и позволяет записывать видео с разрешением до 4K при 30 FPS. Use case автоматически синхронизируется с Preview: изображение в видоискателе соответствует тому, что записывается в файл. VideoCapture использует MediaCodec и MediaMuxer внутри, скрывая сложность настройки видеокодека и контейнера MP4.

CameraX vs Camera2

CameraX и Camera2 — два подхода к работе с камерой в Android. Camera2 — низкоуровневый API, дающий полный контроль над устройством. CameraX — высокоуровневая абстракция, автоматизирующая типовые сценарии. Выбор между ними зависит от требований проекта.

ХарактеристикаCameraXCamera2
Уровень APIВысокий (use case)Низкий (полный контроль)
Device-specific кодНе требуетсяТребуется для каждого устройства
Привязка к LifecycleАвтоматическаяРучная
РасширенияВстроенные (HDR, Portrait, Night)Требуют OEM-реализации
Сложность внедрения15–30 строк кода100–300 строк кода
Поддержка APIAPI 21+API 21+
ГибкостьСтандартные сценарииЛюбые сценарии

Используйте CameraX для стандартных задач: камера в приложении, сканер QR, ML-обработка потока. Используйте Camera2, когда требуется ручное управление экспозицией, RAW-съёмка с полным контролем параметров, работа с несколькими камерами одновременно.

Примеры кода на Kotlin

Рассмотрим полную настройку CameraX в Android-приложении с использованием всех трёх основных use cases: Preview, ImageCapture и ImageAnalysis.

Настройка ProcessCameraProvider

Код привязывает CameraX к Lifecycle Activity через ProcessCameraProvider. Сначала запрашивается экземпляр провайдера, затем создаются use cases и выполняется привязка.

kotlin
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 для ML-обработки

Добавим ImageAnalysis use case для покадровой обработки потока с камеры, например для интеграции с ML Kit.

kotlin
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

CameraX Extensions — модуль, добавляющий продвинутые режимы съёмки: портретный (размытие фона), HDR (расширенный динамический диапазон), ночной режим (съёмка при низком освещении), авторетушь (коррекция кожи) и режим «красивое лицо» (beauty). Расширения активируются только на устройствах, где производитель камеры предоставил OEM-реализацию.

Проверка и включение расширений

Перед использованием CameraX Extensions необходимо проверить, доступно ли расширение на текущем устройстве. Google рекомендует проверять через ExtensionsManager.isExtensionAvailable.

kotlin
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 работает CameraX?

Android 5.0 (API 21) и выше. CameraX охватывает 99% активных Android-устройств. Для расширений (Portrait, HDR) требуется API 23+ и OEM-поддержка конкретного режима.

Можно ли использовать CameraX с ML Kit?

Да, ImageAnalysis use case передаёт каждый кадр в анализатор. Кадры конвертируются из YUV_420_888 в InputImage для ML Kit. Это стандартный паттерн для создания ML-сканера.

Чем CameraX отличается от Camera2?

CameraX — высокоуровневый API с use case-архитектурой, автоматической привязкой к Lifecycle и обработкой device-specific различий. Camera2 — низкоуровневый полный контроль над камерой с большим объёмом boilerplate-кода.

Поддерживает ли CameraX запись видео?

Да, VideoCapture use case добавлен в CameraX 1.1.0-beta. Он записывает видео с микрофоном и синхронизируется с Preview. Для более сложных сценариев используйте Camera2 напрямую.

Как переключить между передней и задней камерой?

Через CameraSelector: DEFAULT_BACK_CAMERA или DEFAULT_FRONT_CAMERA. Для переключения вызовите cameraProvider.bindToLifecycle() с новым селектором — CameraX автоматически перезапустит сессию.

Итоги

  • CameraX — библиотека Jetpack для Android-камеры с use case-архитектурой (Preview, ImageCapture, ImageAnalysis, VideoCapture)
  • Use cases комбинируются в одной сессии: Preview + ImageAnalysis для ML или Preview + ImageCapture для фото
  • Привязка к Lifecycle автоматически управляет ресурсами камеры при повороте экрана и смене состояний Activity
  • CameraX Extensions добавляют портретный режим, HDR и ночную съёмку на совместимых устройствах
  • Совместимость с 99% устройств Android начиная с API 21 без device-specific кода
  • Интеграция с ML Kit через ImageAnalysis позволяет анализировать каждый кадр в реальном времени
  • Для стандартных задач CameraX — оптимальный выбор, для полного контроля используйте Camera2

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также