Camera Permission — ово је дозвола коју мобилна апликација тражи од корисника за приступ камери уређаја. Без ње, апликација не може да слика, скенира QR кодове или покреће видео позиве. Према подацима Android Developers, 2024, све апликације које користе камеру на Android 6.0 и новијим обавезне су да траже дозволу у реалном времену путем системског дијалога.
Главно
Camera Permission — ово је системска дозвола која регулише приступ апликација камери мобилног уређаја. Мобилне платформе сматрају камеру поверљивим ресурсом, јер омогућава снимање видеа и фотографисање окружења корисника у реалном времену.
На Android, дозвола CAMERA спада у категорију опасних дозвола (dangerous permissions) и захтева обавезан захтев у реалном времену. На iOS, додавање кључа NSCameraUsageDescription у Info.plist је обавезан услов за сваку апликацију која приступа камери. Без овог кључа, апликација ће се нагло зауставити при покушају отварања камере.
Према истраживању Statista (2024), око 68% мобилних апликација у топ-100 App Store користи камеру у неком облику: од скенирања QR кодова до потпуног снимања фотографија и видеа. Притом, 37% корисника одбија приступ камери ако не разуме зашто апликацији треба ова дозвола.
Camera Permission на Android се захтева кроз декларацију у манифесту и накнадни захтев у реалном времену. Почев од Android 6.0, дозвола CAMERA се не може добити само у фази инсталације — корисник мора експлицитно потврдити приступ.
За коришћење камере на Android потребно је додати одговарајућу декларацију у датотеку манифеста. Без тога, систем неће дозволити апликацији да отвори камеру чак и уз захтев у реалном времену.
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
Атрибут android:required=false за uses-feature омогућава инсталацију апликације на уређајима без камере. Ово је важно ако камера није обавезна компонента за рад целе апликације.
Захтев за Camera Permission се извршава преко Activity Result API. Након добијања одговора, апликација проверава статус и покреће камеру или приказује објашњење.
private val cameraLauncher =
registerForActivityResult(ActivityResultContracts.TakePicture()) { success ->
if (success) {
// Фото сачуван
showPhoto(photoUri)
}
}
private val permissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) {
openCamera()
} else {
showPermissionDenied()
}
}
fun capturePhoto() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
openCamera()
} else {
permissionLauncher.launch(Manifest.permission.CAMERA)
}
}
Почев од Android 11, ако корисник двапут одбије приступ камери, системски дијалог се више не приказује. Заставица Never Ask Again се поставља аутоматски, а апликација може само да преусмери корисника на системска подешавања путем Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS). Програмер треба да предвиди проверу shouldShowRequestPermissionRationale за благовремено приказивање припремног екрана.
Camera Permission на iOS се управља преко кључа NSCameraUsageDescription у Info.plist и позива AVCaptureDevice.requestAccess. Apple стриктно проверава оправданост захтева: ако апликација користи камеру на начин који није очигледан кориснику, App Store може одбити апликацију.
Обавезан услов за приступ камери на iOS је додавање кључа NSCameraUsageDescription у датотеку Info.plist. Вредност низа ће бити приказана у системском дијалогу као разлог захтева.
<key>NSCameraUsageDescription</key>
<string>Апликацији је потребан приступ камери за прављење профилних фотографија и скенирање QR кодова.</string>
У Swift, захтев се извршава преко статичке методе AVCaptureDevice.requestAccess. Након добијања одговора, апликација обрађује статус и покреће сесију снимања.
import AVFoundation
func requestCameraAccess() {
AVCaptureDevice.requestAccess(for: .video) { granted in
DispatchQueue.main.async {
if granted {
self.setupCameraSession()
} else {
self.showSettingsAlert()
}
}
}
}
private func setupCameraSession() {
guard let device = AVCaptureDevice.default(.for: .video)
else { return }
do {
let input = try AVCaptureDeviceInput(device: device)
let session = AVCaptureSession()
session.addInput(input)
session.startRunning()
} catch {
print("Camera error: \(error)")
}
}
Пре захтева за приступ камери препоручује се провера тренутног статуса ауторизације путем AVCaptureDevice.authorizationStatus(for: .video). Ово омогућава избегавање непотребног позивања системског дијалога и правилно обраду случајева када је корисник већ донео одлуку. Статус може бити .notDetermined, .restricted, .denied или .authorized.
Camera Permission се примењује у различитим сценаријима, од једноставног скенирања до потпуног видео снимања. Сваки сценариј поставља своје захтеве за имплементацију и обраду дозвола.
На iOS за скенирање QR кодова користи се AVCaptureMetadataOutput из фрејмворка AVFoundation, који захтева Camera Permission. На Android препоручује се коришћење ML Kit Barcode Scanning од Google. Важно је напоменути да се за скенирање QR кодова користи сама камера, а не библиотека за анализу слике — зато је Camera Permission обавезан.
Стандардно сликање или снимање видеа захтева Camera Permission и на iOS и на Android. На Android може се користити Intent(MediaStore.ACTION_IMAGE_CAPTURE), који отвара системску апликацију камере — у овом случају дозволу тражи системска апликација, а не ваша. Међутим, за преглед камере унутар апликације (CameraX, Camera2 API) потребна је сопствена дозвола.
Апликације за видео позиве (Zoom, Google Meet) и проширену реалност (ARCore, ARKit) траже Camera Permission за снимање видеа са предње или задње камере. У овом случају, захтев треба посебно пажљиво објаснити, јер корисник можда не очекује да апликација за AR-пробање намештаја тражи приступ камери.
При раду са камером на iOS могуће је подесити параметре снимања кроз AVCaptureDeviceInput и AVCapturePhotoOutput. На Android CameraX поједностављује конфигурацију кроз повратне позиве ImageCapture, VideoCapture и Preview. За сваку конфигурацију потребно је навести жељену резолуцију, ниво зума и режим фокусирања. Избор исправне конфигурације снимања директно утиче на перформансе апликације и потрошњу батерије.
При раду са камером могу настати различите грешке. Камера може бити заузета другом апликацијом, искључена у системским подешавањима приватности или одсутна на уређају. На Android препоручује се обрада CameraAccessException при позиву CameraManager.openCamera. На iOS треба проверити AVCaptureDevice.authorizationStatus и правилно обрадити одбијање, нудећи кориснику да пређе у подешавања ради укључивања приступа. Увек проверавајте присуство камере на уређају пре захтева за дозволу помоћу PackageManager.hasSystemFeature. Таква провера спречава непотребне захтеве на уређајима без камере и побољшава корисничко искуство.
Оптимизација перформанси при раду са камером је важна за несметан рад апликације. Снимање видеа у високој резолуцији троши значајне ресурсе процесора и батерије.
На iOS користите AVCaptureSessionPresetMedium уместо максималне резолуције, ако апликацији није потребно снимање у 4K. На Android CameraX омогућава конфигурацију ImageCapture са циљаном резолуцијом путем ImageCaptureConfig.Builder. Такође је важно ослободити камеру када апликација пређе у позадину и поново је преузети при повратку. Ово је стандардна пракса коју препоручују Google и Apple за уштеду батерије.
Најбоље праксе помажу у повећању стопе одобравања Camera Permission и избегавању одбијања апликације од стране App Store или Google Play.
Пре позивања системског дијалога покажите екран са примером коришћења камере: слику интерфејса за скенирање, оквир за профилну фотографију, пример препознатог QR кода. Визуелно објашњење делује боље од текстуалног. Према подацима UX Movement (2024), додавање визуелног прегледа повећава стопу одобравања до 72%.
Никада не тражите Camera Permission при првом покретању апликације. Корисник који је управо отворио апликацију ће вероватније одбити ако не разуме контекст. Захтевајте приступ искључиво у тренутку када корисник притисне дугме које захтева камеру: „Сликај профил”, „Скенирај код”, „Започни видео позив”. Контекстуални окидач повећава смисленост захтева.
Ако је корисник одбио Camera Permission, понудите алтернативни начин извршења радње: избор фотографије из галерије, ручни унос података QR кода, отпремање слике са уређаја. Одбијање не би требало у потпуности да блокира функционалност апликације — то је захтев препорука Google Play и App Store за дизајн апликација.
Често постављана питања
При покушају отварања камере без дозволе добићете грешку. Потребно је унапред проверити статус путем checkSelfPermission на Android или authorizationStatus на iOS и понудити алтернативни сценариј.
Да, скенирање QR кодова путем камере захтева Camera Permission. Алтернативни приступ — коришћење библиотека за препознавање QR кода са слике без камере (нпр. преузимање фотографије са кодом из галерије), али то захтева Photo Library Permission.
У архитектури Jetpack Compose можете користити rememberLauncherForActivityResult са ActivityResultContracts.RequestPermission у composable функцији. За сервисе без корисничког интерфејса директно захтевање дозволе није могуће — потребно је пренети контролу на Activity.
Највероватнији разлог је недостатак кључа NSCameraUsageDescription у Info.plist. Од iOS 10, сваки приступ AVCaptureDevice без овог кључа изазива пад апликације (crash) са изузетком NSInvalidArgumentException.
На Android ресетујте подешавања апликације кроз Settings → Apps → [Апликација] → Дозволе. На iOS користите Settings → [Апликација] → прекидач Camera. За аутоматизацију тестова на iOS можете користити XCUITest са resetAuthorizationStatus.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође