Камера в мобильной разработке: что это, типы API и как использовать

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

Камера в мобильных приложениях — это аппаратный модуль устройства, доступный разработчику через системные API для захвата изображений и видео. По данным Google Android Developers (2025), CameraX используется в более чем 85% приложений для Android, требующих работы с камерой. AVFoundation на iOS и CameraX на Android предоставляют высокоуровневые интерфейсы, скрывающие сложность аппаратного управления.

Главное

  • Камера в мобильных приложениях управляется через системные API: CameraX и Camera2 на Android, AVFoundation на iOS.
  • CameraX — современная библиотека Jetpack с жизненным циклом, поддерживающая 95% устройств Android.
  • AVFoundation — фреймворк iOS для захвата видео и фото с настройкой Exposure, ISO и Focus.
  • Разрешения на доступ к камере обязательны на обеих платформах и запрашиваются через системные диалоги.
  • Производительность камеры зависит от аппаратных возможностей устройства и версии ОС.

Что такое камера в мобильных приложениях

Мобильная камера — это встроенный оптический модуль, состоящий из объектива, матрицы (сенсора) и процессора обработки изображений (ISP). Разработчик получает доступ к камере через операционную систему с помощью специальных фреймворков. На Android это Camera2 API (низкоуровневый) и CameraX (высокоуровневый на основе Camera2), на iOS — AVFoundation и UIKit для простых сценариев. Каждая платформа предоставляет свой набор инструментов, но общая концепция одинакова: приложение инициализирует сессию захвата, настраивает параметры (разрешение, фокус, экспозиция) и получает поток кадров или отдельные изображения.

Аппаратные возможности современных камер

Современные мобильные камеры поддерживают множество режимов съёмки: HDR, ночной режим, портретный с размытием фона, замедленное видео и запись в формате RAW. Для разработчика доступны программные настройки: ISO (чувствительность матрицы), выдержка (экспозиция), баланс белого, фокус (автоматический и ручной) и стабилизация изображения. На флагманских устройствах доступно до 4 камер с разными фокусными расстояниями, и приложение может выбирать конкретную камеру по ID.

Типы API для работы с камерой

На мобильных платформах существует несколько API для работы с камерой, различающихся по уровню абстракции и функциональности. Выбор конкретного API зависит от требований проекта: для простого захвата фото достаточно CameraX или UIImagePickerController, для профессиональных приложений необходим Camera2 или AVFoundation с прямым управлением сенсором. Ниже приведено сравнение основных API.

APIПлатформаУровеньОсобенности
CameraXAndroidВысокийLifecycle-aware, 95% устройств
Camera2AndroidНизкийПолный контроль, RAW, Burst
AVFoundationiOSСреднийПолный контроль захвата
UIKit (UIImagePickerController)iOSВысокийГотовый UI, без кастомизации

Когда выбирать CameraX

CameraX — оптимальный выбор для большинства Android-приложений, которым нужна камера без углублённой кастомизации. Библиотека автоматически обрабатывает жизненный цикл Activity и Fragment, поддерживает разрешения и совместимость с разными версиями Android. CameraX гарантирует одинаковое поведение на 95% устройств Android благодаря слою совместимости. Если требуется предпросмотр камеры (Preview), захват фото (ImageCapture) или анализ потока (ImageAnalysis) — CameraX справляется со всеми тремя сценариями без написания сложного кода.

Когда выбирать Camera2

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

Запрос разрешений на доступ к камере

Доступ к камере требует явного разрешения пользователя на обеих платформах. На Android в манифест добавляется CAMERA permission, а начиная с Android 6.0 необходимо также запрашивать разрешение во время выполнения через ActivityCompat.requestPermissions. На iOS в Info.plist добавляется ключ NSCameraUsageDescription с описанием причины использования камеры. Без этого описания приложение будет аварийно завершено при попытке доступа к камере. Начиная с iOS 14, в диалоге разрешений отображается не только название приложения, но и указанная причина — формулировка должна быть понятной пользователю.

Реализация на Android с CameraX

CameraX упрощает работу с камерой до нескольких строк кода. Для запуска предпросмотра необходимо создать экземпляр Preview, привязать его к LifecycleOwner и получить SurfaceProvider для отображения. Для захвата фото используется ImageCapture с таргетом сохранения. Ниже приведён полный пример запуска камеры и съёмки фотографии с помощью CameraX на Kotlin.

Настройка Preview и ImageCapture

kotlin
val preview = Preview.Builder()
    .build()
    .also {
        it.surfaceProvider = viewFinder.surfaceProvider
    }

val imageCapture = ImageCapture.Builder()
    .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
    .build()

val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(Runnable {
    val cameraProvider = cameraProviderFuture.get()
    val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

    try {
        cameraProvider.unbindAll()
        cameraProvider.bindToLifecycle(
            this, cameraSelector, preview, imageCapture
        )
    } catch (e: Exception) {
        Log.e("CameraX", "Bind failed", e)
    }
}, ContextCompact.getMainExecutor(this))

Метод bindToLifecycle связывает камеру с жизненным циклом Activity — при повороте экрана или уходе в фон камера автоматически освобождается. CameraSelector.DEFAULT_BACK_CAMERA выбирает тыловую камеру, для фронтальной используется DEFAULT_FRONT_CAMERA. После связывания Preview начинает отображать изображение с камеры в PreviewView, и пользователь видит картинку с камеры на экране.

Захват фотографии

kotlin
val photoFile = File(
    externalMediaDirs.firstOrNull(),
    "IMG_${System.currentTimeMillis()}.jpg"
)
val outputOptions = ImageCapture.OutputFileOptions
    .Builder(photoFile)
    .build()

imageCapture.takePicture(
    outputOptions,
    ContextCompact.getMainExecutor(this),
    object : ImageCapture.OnImageSavedCallback {
        override fun onImageSaved(output: ImageCapture.OutputFileResults) {
            Log.d("CameraX", "Photo saved: ${photoFile.absolutePath}")
        }
        override fun onError(exception: ImageCaptureException) {
            Log.e("CameraX", "Capture error", exception)
        }
    }
)

Метод takePicture выполняет захват кадра с камеры и сохраняет его в файл. OutputFileOptions поддерживает запись в File, ContentResolver и MediaStore. В callback onImageSaved приложение получает уведомление об успешном сохранении и может обновить UI. CAPTURE_MODE_MINIMIZE_LATENCY обеспечивает максимальную скорость срабатывания затвора за счёт уменьшения постобработки.

Реализация на iOS с AVFoundation

На iOS доступ к камере предоставляет фреймворк AVFoundation через класс AVCaptureSession. Разработчик создаёт сессию захвата, добавляет необходимые входы (AVCaptureDeviceInput) и выходы (AVCapturePhotoOutput, AVCaptureVideoDataOutput) и запускает сессию. Для отображения предпросмотра используется AVCaptureVideoPreviewLayer. Ниже приведён пример настройки сессии для захвата фото на Swift.

swift
import AVFoundation

let captureSession = AVCaptureSession()
captureSession.sessionPreset = .photo

guard let camera = AVCaptureDevice.default(
    for: .video
) else { return }

guard let input = try? AVCaptureDeviceInput(device: camera)
else { return }

let output = AVCapturePhotoOutput()
captureSession.addInput(input)
captureSession.addOutput(output)

DispatchQueue.global(qos: .userInitiated).async {
    captureSession.startRunning()
}

AVCaptureSessionPreset.photo устанавливает оптимальное разрешение для фото (обычно 12 МП на современных устройствах). Входом является AVCaptureDeviceInput, созданный для камеры устройства. После добавления входа и выхода сессия запускается в фоновом потоке через startRunning — запуск сессии может занимать до 200 мс на старых устройствах. Для захвата фото вызывается capturePhoto(with:delegate:), и результат возвращается через делегат AVCapturePhotoCaptureDelegate.

Особенности и ограничения

При работе с камерой на мобильных устройствах необходимо учитывать аппаратные ограничения: нагрев устройства при длительной съёмке, разряд батареи при работе с высоким разрешением и различное качество камер на разных устройствах. На Android фрагментация экосистемы приводит к тому, что одна и та же CameraX-конфигурация может работать по-разному на разных моделях. На iOS ограничения касаются в основном лицензирования: при использовании камеры в фоне требуется отдельное разрешение Apple. Также важно помнить, что симуляторы не имеют доступа к реальной камере — тестирование возможно только на физическом устройстве.

Совместимость с разными версиями ОС

CameraX решает проблему фрагментации Android через слой совместимости CameraXConfig — библиотека автоматически применяет обходные пути для известных багов производителей. На iOS AVFoundation работает единообразно на всех устройствах, начиная с iOS 6, но некоторые функции (например, Portrait Mode или LiDAR) доступны только на моделях iPhone 12 и новее. При разработке кроссплатформенного приложения рекомендуется использовать Flutter или React Native с плагинами камеры — они абстрагируют платформенные различия и предоставляют единый API для обеих ОС.

Часто задаваемые вопросы

Какое API для камеры лучше выбрать на Android?

Для большинства приложений рекомендуется CameraX из-за простоты использования, встроенной обработки жизненного цикла и совместимости с 95% устройств. Camera2 стоит выбирать только при необходимости RAW, burst-съёмки или ручного управления сенсором.

Как запросить разрешение на доступ к камере?

На Android добавьте CAMERA permission в манифест и запросите его во время выполнения через ActivityCompat.requestPermissions. На iOS добавьте NSCameraUsageDescription в Info.plist с понятным описанием причины использования камеры.

Можно ли использовать камеру в фоновом режиме?

На iOS использование камеры в фоне строго ограничено — требуется специальное разрешение Apple. На Android камера может работать в фоне через foreground service, но это негативно влияет на заряд батареи и нагрев устройства.

Почему камера не работает на симуляторе?

Симуляторы iOS и эмуляторы Android не имеют доступа к аппаратной камере — они не эмулируют физический сенсор. Для тестирования функциональности камеры всегда используйте физическое устройство или внешнюю камеру, подключённую к компьютеру.

Что такое CameraX ImageAnalysis?

ImageAnalysis — это анализатор потока кадров из CameraX, который передаёт каждый кадр в ImageAnalysis.Analyzer для обработки. Используется для распознавания QR-кодов, обнаружения лиц, сканирования документов и других задач компьютерного зрения.

Итоги

  • Камера в мобильных приложениях управляется через CameraX/Camera2 (Android) и AVFoundation (iOS).
  • CameraX — высокоуровневая библиотека Jetpack с поддержкой жизненного цикла и совместимостью с 95% устройств Android.
  • AVFoundation предоставляет AVCaptureSession для гибкого управления захватом изображений и видео на iOS.
  • Разрешения обязательны на обеих платформах — CAMERA на Android, NSCameraUsageDescription на iOS.
  • Camera2 — низкоуровневый API для профессиональных сценариев: RAW, ручные настройки, burst-съёмка.
  • Ограничения — нагрев устройства, фрагментация Android, отсутствие эмуляции камеры в симуляторах.
  • Рекомендация — начинайте с CameraX на Android и AVFoundation на iOS, переходите на Camera2 только при необходимости.

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

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

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

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