Camera Permission — to je oprávnění, které mobilní aplikace žádá od uživatele pro přístup ke kameře zařízení. Bez něj aplikace nemůže pořizovat snímky, skenovat QR kódy nebo spouštět videohovory. Podle údajů Android Developers, 2024, všechny aplikace používající kameru na Android 6.0 a vyšším musí žádat o oprávnění za běhu prostřednictvím systémového dialogu.
Hlavní body
Camera Permission — to je systémové oprávnění regulující přístup aplikací ke kameře mobilního zařízení. Mobilní platformy považují kameru za důvěrný zdroj, protože umožňuje nahrávání videa a fotografování okolí uživatele v reálném čase.
Na Androidu patří oprávnění CAMERA do kategorie nebezpečných oprávnění (dangerous permissions) a vyžaduje povinnou žádost za běhu. Na iOS je přidání klíče NSCameraUsageDescription do Info.plist povinnou podmínkou pro jakoukoli aplikaci, která přistupuje ke kameře. Bez tohoto klíče aplikace havaruje při pokusu o otevření kamery.
Podle výzkumu Statista (2024) přibližně 68 % mobilních aplikací v top 100 App Store používá kameru v té či oné formě: od skenování QR kódů až po plnohodnotné fotografování a natáčení videa. Přitom 37 % uživatelů odmítá přístup kameře, pokud nerozumí, proč aplikace toto oprávnění potřebuje.
Camera Permission na Android se žádá prostřednictvím deklarace v manifestu a následné žádosti za běhu. Od Android 6.0 nelze oprávnění CAMERA získat pouze ve fázi instalace — uživatel musí výslovně potvrdit přístup.
Pro použití kamery na Androidu je nutné přidat příslušnou deklaraci do souboru manifestu. Bez toho systém nedovolí aplikaci otevřít kameru ani při žádosti za běhu.
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
Atribut android:required=false pro uses-feature umožňuje instalaci aplikace na zařízeních bez kamery. To je důležité, pokud kamera není povinnou součástí pro fungování celé aplikace.
Žádost o Camera Permission se provádí prostřednictvím Activity Result API. Po obdržení odpovědi aplikace zkontroluje stav a spustí kameru nebo zobrazí vysvětlení.
private val cameraLauncher =
registerForActivityResult(ActivityResultContracts.TakePicture()) { success ->
if (success) {
// Fotografie uložena
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)
}
}
Od Android 11, pokud uživatel dvakrát odmítl přístup ke kameře, systémový dialog se již nezobrazuje. Příznak Never Ask Again se nastaví automaticky a aplikace může pouze přesměrovat uživatele do systémových nastavení pomocí Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS). Vývojář by měl předvídat kontrolu shouldShowRequestPermissionRationale pro včasné zobrazení přípravné obrazovky.
Camera Permission na iOS je spravováno prostřednictvím klíče NSCameraUsageDescription v Info.plist a volání AVCaptureDevice.requestAccess. Apple přísně kontroluje oprávněnost žádosti: pokud aplikace používá kameru způsobem, který není pro uživatele zřejmý, může App Store aplikaci odmítnout.
Povinnou podmínkou pro přístup ke kameře na iOS je přidání klíče NSCameraUsageDescription do souboru Info.plist. Hodnota řetězce bude zobrazena v systémovém dialogu jako důvod žádosti.
<key>NSCameraUsageDescription</key>
<string>Aplikace potřebuje přístup ke kameře pro pořizování profilových fotografií a skenování QR kódů.</string>
Ve Swift se žádost provádí prostřednictvím statické metody AVCaptureDevice.requestAccess. Po obdržení odpovědi aplikace zpracuje stav a spustí relaci snímání.
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)")
}
}
Před žádostí o přístup ke kameře se doporučuje zkontrolovat aktuální stav autorizace pomocí AVCaptureDevice.authorizationStatus(for: .video). To umožňuje vyhnout se zbytečnému volání systémového dialogu a správně zpracovat případy, kdy uživatel již rozhodl. Stav může být .notDetermined, .restricted, .denied nebo .authorized.
Camera Permission se uplatňuje v různých scénářích, od jednoduchého skenování až po plnohodnotné natáčení videa. Každý scénář má své vlastní požadavky na implementaci a zpracování oprávnění.
Na iOS se pro skenování QR kódů používá AVCaptureMetadataOutput z frameworku AVFoundation, který vyžaduje Camera Permission. Na Androidu se doporučuje používat ML Kit Barcode Scanning od Google. Je důležité poznamenat, že pro skenování QR kódů se používá samotná kamera, nikoli knihovna pro analýzu obrazu — proto je Camera Permission povinný.
Standardní fotografování nebo nahrávání videa vyžaduje Camera Permission jak na iOS, tak na Android. Na Androidu lze použít Intent(MediaStore.ACTION_IMAGE_CAPTURE), který otevře systémovou aplikaci kamery — v tomto případě o oprávnění žádá systémová aplikace, nikoli vaše. Pro náhled kamery uvnitř aplikace (CameraX, Camera2 API) je však nutné vlastní oprávnění.
Aplikace pro videohovory (Zoom, Google Meet) a rozšířenou realitu (ARCore, ARKit) žádají o Camera Permission pro snímání videa z přední nebo zadní kamery. V tomto případě by měla být žádost obzvláště pečlivě vysvětlena, protože uživatel nemusí očekávat, že aplikace pro AR-zkoušení nábytku žádá o kameru.
Při práci s kamerou na iOS lze nakonfigurovat parametry snímání pomocí AVCaptureDeviceInput a AVCapturePhotoOutput. Na Androidu CameraX zjednodušuje konfiguraci prostřednictvím zpětných volání ImageCapture, VideoCapture a Preview. Pro každou konfiguraci je třeba uvést požadované rozlišení, úroveň zoomu a režim zaostření. Výběr správné konfigurace snímání přímo ovlivňuje výkon aplikace a spotřebu baterie.
Při práci s kamerou mohou nastat různé chyby. Kamera může být obsazena jinou aplikací, vypnuta v systémových nastaveních soukromí nebo na zařízení chybět. Na Androidu se doporučuje zpracování CameraAccessException při volání CameraManager.openCamera. Na iOS je třeba zkontrolovat AVCaptureDevice.authorizationStatus a správně zpracovat odmítnutí, nabídnout uživateli přechod do nastavení pro povolení přístupu. Vždy před žádostí o oprávnění zkontrolujte přítomnost kamery na zařízení pomocí PackageManager.hasSystemFeature. Taková kontrola zabraňuje zbytečným žádostem na zařízeních bez kamery a zlepšuje uživatelský zážitek.
Optimalizace výkonu při práci s kamerou je důležitá pro plynulý chod aplikace. Nahrávání videa ve vysokém rozlišení spotřebovává značné zdroje procesoru a baterie.
Na iOS používejte AVCaptureSessionPresetMedium místo maximálního rozlišení, pokud aplikace nevyžaduje nahrávání ve 4K. Na Androidu CameraX umožňuje konfiguraci ImageCapture s cílovým rozlišením prostřednictvím ImageCaptureConfig.Builder. Důležité je také uvolnit kameru při přechodu aplikace na pozadí a znovu ji zachytit při návratu. To je standardní praxe doporučená Googlem a Applem pro úsporu baterie.
Nejlepší postupy pomáhají zvýšit procento schválení Camera Permission a vyhnout se odmítnutí aplikace App Store nebo Google Play.
Před vyvoláním systémového dialogu zobrazte obrazovku s příkladem použití kamery: obrázek rozhraní skenování, rámeček pro profilovou fotografii, příklad rozpoznaného QR kódu. Vizuální vysvětlení funguje lépe než textové. Podle údajů UX Movement (2024) zvyšuje přidání vizuálního náhledu konverzi schválení až na 72 %.
Nikdy nežádejte o Camera Permission při prvním spuštění aplikace. Uživatel, který právě otevřel aplikaci, pravděpodobněji odmítne, pokud nerozumí kontextu. Žádejte o přístup striktně v okamžiku, kdy uživatel stiskne tlačítko vyžadující kameru: „Vyfotit profil”, „Skenovat kód”, „Zahájit videohovor”. Kontextuální spouštěč zvyšuje smysluplnost žádosti.
Pokud uživatel odmítl Camera Permission, nabídněte alternativní způsob provedení akce: výběr fotografie z galerie, ruční zadání údajů QR kódu, nahrání obrázku ze zařízení. Odmítnutí by nemělo zcela blokovat funkčnost aplikace — to je požadavek doporučení Google Play a App Store pro návrh aplikací.
Často kladené otázky
Při pokusu o otevření kamery bez oprávnění obdržíte chybu. Je nutné předem zkontrolovat stav pomocí checkSelfPermission na Android nebo authorizationStatus na iOS a nabídnout alternativní scénář.
Ano, skenování QR kódů prostřednictvím kamery vyžaduje Camera Permission. Alternativní přístup — použití knihoven pro rozpoznání QR kódu z obrázku bez kamery (např. stažení fotografie s kódem z galerie) — ale to vyžaduje Photo Library Permission.
V architektuře Jetpack Compose můžete použít rememberLauncherForActivityResult s ActivityResultContracts.RequestPermission v composable funkci. Pro služby bez uživatelského rozhraní není přímá žádost o oprávnění možná — je nutné předat řízení Activity.
Nejpravděpodobnějším důvodem je absence klíče NSCameraUsageDescription v Info.plist. Od iOS 10 jakýkoli přístup k AVCaptureDevice bez tohoto klíče způsobuje pád aplikace (crash) s výjimkou NSInvalidArgumentException.
Na Android resetujte nastavení aplikace přes Settings → Apps → [Aplikace] → Oprávnění. Na iOS použijte Settings → [Aplikace] → přepínač Camera. Pro automatizaci testů na iOS můžete použít XCUITest s resetAuthorizationStatus.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také