Камера у мобилним апликацијама — хардверски модул уређаја доступан програмеру преко системских API-ја за снимање слика и видеа. Према Google Android Developers (2025), CameraX се користи у преко 85% апликација за Android које захтевају рад са камером. AVFoundation на iOS-у и CameraX на Android-у пружају високо нивоске интерфејсе који скривају сложеност хардверског управљања.
Главне тачке
Мобилна камера је уграђени оптички модул који се састоји од сочива, матрице (сензора) и процесора за обраду слике (ISP). Програмер добија приступ камери преко оперативног система помоћу посебних framework-а. На 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-у се у 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", "Повезивање није успело", 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-у приступ камери обезбеђује framework 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 креиран за камеру уређаја. Након додавања улаза и излаза, сесија се покреће у позадинској нити путем 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође