Камера в мобилната разработка: какво е това, видове 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 се добавя към манифеста, а от Android 6.0 разрешението трябва да се изисква и по време на изпълнение чрез ActivityCompat.requestPermissions. На iOS ключът NSCameraUsageDescription с описание на причината за използване на камерата се добавя към Info.plist. Без това описание приложението ще се срине при опит за достъп до камерата. От 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", "Неуспешно свързване", 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", "Грешка при заснемане", 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 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 и за двете операционни системи.

Често задавани въпроси

Кое API за камера да избера на Android?

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

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

На Android добавете разрешението CAMERA в манифеста и го поискайте по време на изпълнение чрез 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, ръчни настройки, серийно снимане.
  • Ограничения — нагряване на устройството, фрагментация на Android, липса на емулация на камера в симулаторите.
  • Препоръка — започнете с CameraX на Android и AVFoundation на iOS, преминете на Camera2 само при необходимост.

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

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също