Камера в мобильных приложениях — это аппаратный модуль устройства, доступный разработчику через системные API для захвата изображений и видео. По данным Google Android Developers (2025), CameraX используется в более чем 85% приложений для Android, требующих работы с камерой. AVFoundation на iOS и CameraX на Android предоставляют высокоуровневые интерфейсы, скрывающие сложность аппаратного управления.
Главное
Мобильная камера — это встроенный оптический модуль, состоящий из объектива, матрицы (сенсора) и процессора обработки изображений (ISP). Разработчик получает доступ к камере через операционную систему с помощью специальных фреймворков. На Android это Camera2 API (низкоуровневый) и CameraX (высокоуровневый на основе Camera2), на iOS — AVFoundation и UIKit для простых сценариев. Каждая платформа предоставляет свой набор инструментов, но общая концепция одинакова: приложение инициализирует сессию захвата, настраивает параметры (разрешение, фокус, экспозиция) и получает поток кадров или отдельные изображения.
Современные мобильные камеры поддерживают множество режимов съёмки: HDR, ночной режим, портретный с размытием фона, замедленное видео и запись в формате RAW. Для разработчика доступны программные настройки: ISO (чувствительность матрицы), выдержка (экспозиция), баланс белого, фокус (автоматический и ручной) и стабилизация изображения. На флагманских устройствах доступно до 4 камер с разными фокусными расстояниями, и приложение может выбирать конкретную камеру по ID.
На мобильных платформах существует несколько API для работы с камерой, различающихся по уровню абстракции и функциональности. Выбор конкретного API зависит от требований проекта: для простого захвата фото достаточно CameraX или UIImagePickerController, для профессиональных приложений необходим Camera2 или AVFoundation с прямым управлением сенсором. Ниже приведено сравнение основных API.
| API | Платформа | Уровень | Особенности |
|---|---|---|---|
| CameraX | Android | Высокий | Lifecycle-aware, 95% устройств |
| Camera2 | Android | Низкий | Полный контроль, RAW, Burst |
| AVFoundation | iOS | Средний | Полный контроль захвата |
| UIKit (UIImagePickerController) | iOS | Высокий | Готовый UI, без кастомизации |
CameraX — оптимальный выбор для большинства Android-приложений, которым нужна камера без углублённой кастомизации. Библиотека автоматически обрабатывает жизненный цикл Activity и Fragment, поддерживает разрешения и совместимость с разными версиями Android. CameraX гарантирует одинаковое поведение на 95% устройств Android благодаря слою совместимости. Если требуется предпросмотр камеры (Preview), захват фото (ImageCapture) или анализ потока (ImageAnalysis) — CameraX справляется со всеми тремя сценариями без написания сложного кода.
Camera2 — низкоуровневый API для профессиональных сценариев: запись в RAW, ручная настройка экспозиции, burst-съёмка, управление несколькими камерами одновременно. Camera2 требует от разработчика глубокого понимания конвейера захвата изображений, управления StateMachine и обработки callback-ов. Используйте Camera2 только если CameraX не покрывает требования: например, для приложений сканирования документов с ручной фокусировкой или кастомных камер с нестандартным разрешением.
Доступ к камере требует явного разрешения пользователя на обеих платформах. На Android в манифест добавляется CAMERA permission, а начиная с Android 6.0 необходимо также запрашивать разрешение во время выполнения через ActivityCompat.requestPermissions. На iOS в Info.plist добавляется ключ NSCameraUsageDescription с описанием причины использования камеры. Без этого описания приложение будет аварийно завершено при попытке доступа к камере. Начиная с iOS 14, в диалоге разрешений отображается не только название приложения, но и указанная причина — формулировка должна быть понятной пользователю.
CameraX упрощает работу с камерой до нескольких строк кода. Для запуска предпросмотра необходимо создать экземпляр Preview, привязать его к LifecycleOwner и получить SurfaceProvider для отображения. Для захвата фото используется ImageCapture с таргетом сохранения. Ниже приведён полный пример запуска камеры и съёмки фотографии с помощью CameraX на 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, и пользователь видит картинку с камеры на экране.
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 через класс AVCaptureSession. Разработчик создаёт сессию захвата, добавляет необходимые входы (AVCaptureDeviceInput) и выходы (AVCapturePhotoOutput, AVCaptureVideoDataOutput) и запускает сессию. Для отображения предпросмотра используется AVCaptureVideoPreviewLayer. Ниже приведён пример настройки сессии для захвата фото на 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 для обеих ОС.
Часто задаваемые вопросы
Для большинства приложений рекомендуется CameraX из-за простоты использования, встроенной обработки жизненного цикла и совместимости с 95% устройств. Camera2 стоит выбирать только при необходимости RAW, burst-съёмки или ручного управления сенсором.
На Android добавьте CAMERA permission в манифест и запросите его во время выполнения через ActivityCompat.requestPermissions. На iOS добавьте NSCameraUsageDescription в Info.plist с понятным описанием причины использования камеры.
На iOS использование камеры в фоне строго ограничено — требуется специальное разрешение Apple. На Android камера может работать в фоне через foreground service, но это негативно влияет на заряд батареи и нагрев устройства.
Симуляторы iOS и эмуляторы Android не имеют доступа к аппаратной камере — они не эмулируют физический сенсор. Для тестирования функциональности камеры всегда используйте физическое устройство или внешнюю камеру, подключённую к компьютеру.
ImageAnalysis — это анализатор потока кадров из CameraX, который передаёт каждый кадр в ImageAnalysis.Analyzer для обработки. Используется для распознавания QR-кодов, обнаружения лиц, сканирования документов и других задач компьютерного зрения.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также