Camera Permission — dit is de toestemming die een mobiele app aan de gebruiker vraagt voor toegang tot de camera van het apparaat. Zonder dit kan de app geen foto’s maken, QR-codes scannen of videogesprekken starten. Volgens gegevens van Android Developers, 2024, moeten alle apps die de camera gebruiken op Android 6.0 en hoger toestemming vragen via een systeemdialoog.
Belangrijkste punten
Camera Permission — dit is een systeemtoestemming die de toegang van apps tot de camera van een mobiel apparaat regelt. Mobiele platforms beschouwen de camera als een vertrouwelijke bron, omdat deze video kan opnemen en de omgeving van de gebruiker in realtime kan fotograferen.
Op Android behoort de CAMERA-toestemming tot de categorie gevaarlijke toestemmingen (dangerous permissions) en vereist een verplichte runtime-aanvraag. Op iOS is het toevoegen van de sleutel NSCameraUsageDescription in Info.plist een verplichte voorwaarde voor elke app die toegang krijgt tot de camera. Zonder deze sleutel crasht de app bij het openen van de camera.
Volgens onderzoek van Statista (2024) gebruikt ongeveer 68% van de mobiele apps in de top-100 van de App Store de camera in een of andere vorm: van het scannen van QR-codes tot het volledig maken van foto’s en video’s. Tegelijkertijd weigert 37% van de gebruikers toegang tot de camera als ze niet begrijpen waarom de app deze toestemming nodig heeft.
Camera Permission op Android wordt aangevraagd via een declaratie in het manifest en een daaropvolgende runtime-aanvraag. Vanaf Android 6.0 kan CAMERA-toestemming niet alleen in de installatiefase worden verkregen — de gebruiker moet expliciet toegang bevestigen.
Om de camera op Android te gebruiken, moet u de bijbehorende declaratie toevoegen aan het manifestbestand. Zonder dit staat het systeem de app niet toe de camera te openen, zelfs niet met een runtime-aanvraag.
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
Het kenmerk android:required=false voor uses-feature maakt het mogelijk de app te installeren op apparaten zonder camera. Dit is belangrijk als de camera geen verplicht onderdeel is voor de werking van de hele app.
De Camera Permission-aanvraag wordt uitgevoerd via de Activity Result API. Na ontvangst van het antwoord controleert de app de status en start de camera of toont een uitleg.
private val cameraLauncher =
registerForActivityResult(ActivityResultContracts.TakePicture()) { success ->
if (success) {
// Foto opgeslagen
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)
}
}
Vanaf Android 11, als de gebruiker twee keer de toegang tot de camera heeft geweigerd, wordt de systeemdialoog niet meer getoond. De vlag Never Ask Again wordt automatisch ingesteld en de app kan de gebruiker alleen naar de systeeminstellingen leiden via Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS). De ontwikkelaar moet voorzien in een controle van shouldShowRequestPermissionRationale om tijdig een voorbereidend scherm weer te geven.
Camera Permission op iOS wordt beheerd via de sleutel NSCameraUsageDescription in Info.plist en de aanroep van AVCaptureDevice.requestAccess. Apple controleert streng de rechtvaardiging van de aanvraag: als de app de camera op een voor de gebruiker niet voor de hand liggende manier gebruikt, kan de App Store de app afwijzen.
Een verplichte voorwaarde voor toegang tot de camera op iOS is het toevoegen van de sleutel NSCameraUsageDescription in het Info.plist-bestand. De tekenreekswaarde wordt in de systeemdialoog weergegeven als reden voor de aanvraag.
<key>NSCameraUsageDescription</key>
<string>De app heeft toegang tot de camera nodig om profielfoto's te maken en QR-codes te scannen.</string>
In Swift wordt de aanvraag uitgevoerd via de statische methode AVCaptureDevice.requestAccess. Na ontvangst van het antwoord verwerkt de app de status en start de opnamesessie.
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)")
}
}
Voordat u toegang tot de camera aanvraagt, wordt aanbevolen de huidige autorisatiestatus te controleren via AVCaptureDevice.authorizationStatus(for: .video). Dit voorkomt onnodige aanroepen van de systeemdialoog en behandelt correct gevallen waarin de gebruiker al een beslissing heeft genomen. De status kan .notDetermined, .restricted, .denied of .authorized zijn.
Camera Permission wordt toegepast in verschillende scenario’s, van eenvoudig scannen tot volledige video-opname. Elk scenario stelt zijn eigen eisen aan de implementatie en afhandeling van toestemmingen.
Op iOS wordt voor het scannen van QR-codes AVCaptureMetadataOutput gebruikt uit het AVFoundation-framework, dat Camera Permission vereist. Op Android wordt aanbevolen ML Kit Barcode Scanning van Google te gebruiken. Het is belangrijk op te merken dat voor het scannen van QR-codes de camera zelf wordt gebruikt, niet een beeldanalysebibliotheek — daarom is Camera Permission verplicht.
Standaard foto’s maken of video’s opnemen vereist Camera Permission op zowel iOS als Android. Op Android kunt u Intent(MediaStore.ACTION_IMAGE_CAPTURE) gebruiken, dat de systeemcamera-app opent — in dit geval wordt de toestemming aangevraagd door de systeemapp, niet door de uwe. Voor een cameravoorbeeld in de app (CameraX, Camera2 API) is echter een eigen toestemming nodig.
Apps voor videogesprekken (Zoom, Google Meet) en augmented reality (ARCore, ARKit) vragen Camera Permission voor het vastleggen van video van de voor- of achtercamera. In dit geval moet de aanvraag bijzonder zorgvuldig worden uitgelegd, omdat de gebruiker mogelijk niet verwacht dat een app voor AR-passen van meubels de camera aanvraagt.
Bij het werken met de camera op iOS kunt u de opnameparameters configureren via AVCaptureDeviceInput en AVCapturePhotoOutput. Op Android vereenvoudigt CameraX de configuratie via callbacks ImageCapture, VideoCapture en Preview. Voor elke configuratie moeten de gewenste resolutie, zoomniveau en focusmodus worden opgegeven. De juiste keuze van de opnameconfiguratie beïnvloedt direct de prestaties van de app en het batterijverbruik.
Bij het werken met de camera kunnen verschillende fouten optreden. De camera kan bezet zijn door een andere app, uitgeschakeld in de systeemprivacy-instellingen of niet aanwezig zijn op het apparaat. Op Android wordt aanbevolen CameraAccessException af te handelen bij het aanroepen van CameraManager.openCamera. Op iOS moet AVCaptureDevice.authorizationStatus worden gecontroleerd en moet een weigering correct worden afgehandeld door de gebruiker voor te stellen naar de instellingen te gaan om toegang in te schakelen. Controleer altijd of er een camera op het apparaat aanwezig is voordat u toestemming vraagt met PackageManager.hasSystemFeature. Een dergelijke controle voorkomt onnodige aanvragen op apparaten zonder camera en verbetert de gebruikerservaring.
Prestatie-optimalisatie bij het werken met de camera is belangrijk voor een soepele werking van de app. Video-opname in hoge resolutie verbruikt aanzienlijke processor- en batterijbronnen.
Gebruik op iOS AVCaptureSessionPresetMedium in plaats van de maximale resolutie als de app geen 4K-opname vereist. Op Android biedt CameraX de mogelijkheid ImageCapture te configureren met een doelresolutie via ImageCaptureConfig.Builder. Het is ook belangrijk de camera vrij te geven wanneer de app naar de achtergrond gaat en deze opnieuw vast te leggen bij terugkeer. Dit is een standaardpraktijk aanbevolen door Google en Apple om batterij te besparen.
Beste praktijken helpen het goedkeuringspercentage van Camera Permission te verhogen en afwijzing van de app door de App Store of Google Play te voorkomen.
Voordat u de systeemdialoog oproept, toont u een scherm met een voorbeeld van hoe de camera wordt gebruikt: een afbeelding van de scaninterface, een kader voor de profielfoto, een voorbeeld van een herkende QR-code. Visuele uitleg werkt beter dan tekstuele uitleg. Volgens gegevens van UX Movement (2024) verhoogt het toevoegen van een visueel voorbeeld de goedkeuringsconversie tot 72%.
Vraag nooit Camera Permission bij de eerste keer opstarten van de app. Een gebruiker die de app net heeft geopend, zal eerder weigeren als hij de context niet begrijpt. Vraag toegang strikt op het moment dat de gebruiker op een knop drukt die de camera vereist: „Profielfoto maken”, „Code scannen”, „Videogesprek starten”. Contextuele trigger verhoogt de relevantie van de aanvraag.
Als de gebruiker Camera Permission heeft geweigerd, bied dan een alternatieve manier om de actie uit te voeren: een foto selecteren uit de galerij, handmatig invoeren van QR-codegegevens, een afbeelding uploaden van het apparaat. Weigering mag de functionaliteit van de app niet volledig blokkeren — dit is een vereiste van de aanbevelingen van Google Play en App Store voor app-ontwerp.
Veelgestelde vragen
Bij een poging de camera te openen zonder toestemming krijgt u een foutmelding. Het is noodzakelijk om vooraf de status te controleren via checkSelfPermission op Android of authorizationStatus op iOS en een alternatief scenario aan te bieden.
Ja, het scannen van QR-codes via de camera vereist Camera Permission. Een alternatieve benadering — het gebruik van bibliotheken voor QR-codeherkenning uit een afbeelding zonder camera (bijvoorbeeld het downloaden van een foto met een code uit de galerij) — maar dit vereist Photo Library Permission.
In de Jetpack Compose-architectuur kunt u rememberLauncherForActivityResult gebruiken met ActivityResultContracts.RequestPermission in een composable-functie. Voor services zonder UI is een directe toestemmingsaanvraag niet mogelijk — de controle moet worden overgedragen aan de Activity.
De meest waarschijnlijke oorzaak is het ontbreken van de sleutel NSCameraUsageDescription in Info.plist. Sinds iOS 10 veroorzaakt elke toegang tot AVCaptureDevice zonder deze sleutel een crash van de app met een NSInvalidArgumentException.
Op Android reset u de app-instellingen via Settings → Apps → [App] → Toestemmingen. Op iOS gebruikt u Settings → [App] → Camera-schakelaar. Voor het automatiseren van tests op iOS kunt u XCUITest gebruiken met resetAuthorizationStatus.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook