Камерата в мобилните приложения — хардуерен модул на устройството, достъпен за разработчика чрез системни 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 се добавя към манифеста, а от Android 6.0 разрешението трябва да се изисква и по време на изпълнение чрез ActivityCompat.requestPermissions. На iOS ключът NSCameraUsageDescription с описание на причината за използване на камерата се добавя към Info.plist. Без това описание приложението ще се срине при опит за достъп до камерата. От 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", "Неуспешно свързване", 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", "Грешка при заснемане", 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 MP на съвременни устройства). Входът е AVCaptureDeviceInput, създаден за камерата на устройството. След добавяне на входа и изхода сесията се стартира в background нишка чрез startRunning — стартирането на сесията може да отнеме до 200 ms на по-стари устройства. За заснемане на снимка се извиква 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, серийно снимане или ръчно управление на сензора.
На Android добавете разрешението CAMERA в манифеста и го поискайте по време на изпълнение чрез ActivityCompat.requestPermissions. На iOS добавете NSCameraUsageDescription в Info.plist с ясно описание на причината за използване на камерата.
На iOS използването на камера на заден план е строго ограничено — изисква се специално разрешение от Apple. На Android камерата може да работи на заден план чрез foreground service, но това се отразява негативно на нивото на батерията и нагряването на устройството.
iOS симулаторите и Android емулаторите нямат достъп до хардуерна камера — те не емулират физически сензор. За тестване на функционалността на камерата винаги използвайте физическо устройство или външна камера, свързана към компютъра.
ImageAnalysis — анализатор на потока от кадри от CameraX, който предава всеки кадър на ImageAnalysis.Analyzer за обработка. Използва се за разпознаване на QR кодове, откриване на лица, сканиране на документи и други задачи на компютърното зрение.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също