Camera Permission — ez az engedély, amelyet a mobilalkalmazás kér a felhasználótól az eszköz kamerájához való hozzáféréshez. Enélkül az alkalmazás nem tud fényképeket készíteni, QR-kódokat beolvasni vagy videohívásokat indítani. A Android Developers, 2024 adatai szerint az Android 6.0 és újabb verziókon a kamerát használó összes alkalmazásnak futásidőben kell engedélyt kérnie egy rendszerpárbeszédablakon keresztül.
Főbb pontok
Camera Permission — ez egy rendszerengedély, amely szabályozza az alkalmazások hozzáférését a mobileszköz kamerájához. A mobil platformok a kamerát bizalmas erőforrásnak tekintik, mivel lehetővé teszi a videófelvételt és a felhasználó környezetének valós idejű fényképezését.
Androidon a CAMERA engedély a veszélyes engedélyek (dangerous permissions) kategóriájába tartozik, és kötelező futásidejű kérést igényel. iOS-en az NSCameraUsageDescription kulcs hozzáadása az Info.plist fájlhoz kötelező feltétel minden olyan alkalmazás számára, amely hozzáfér a kamerához. E kulcs nélkül az alkalmazás összeomlik a kamera megnyitásának kísérletekor.
A Statista (2024) kutatása szerint az App Store top-100-as listáján szereplő mobilalkalmazások körülbelül 68%-a használja a kamerát valamilyen formában: a QR-kódok beolvasásától a teljes fénykép- és videókészítésig. Ugyanakkor a felhasználók 37%-a megtagadja a hozzáférést a kamerához, ha nem érti, miért van szüksége az alkalmazásnak erre az engedélyre.
Camera Permission Androidon a manifest-ben történő deklarálással és az azt követő futásidejű kéréssel történik. Az Android 6.0-tól kezdve a CAMERA engedély nem szerezhető meg csak a telepítési szakaszban — a felhasználónak kifejezetten meg kell erősítenie a hozzáférést.
A kamera Androidon történő használatához hozzá kell adni a megfelelő deklarációt a manifest fájlhoz. Enélkül a rendszer nem engedélyezi az alkalmazásnak a kamera megnyitását még futásidejű kérés esetén sem.
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
A android:required=false attribútum a uses-feature számára lehetővé teszi az alkalmazás telepítését kamera nélküli eszközökre. Ez akkor fontos, ha a kamera nem kötelező összetevője a teljes alkalmazás működésének.
A Camera Permission kérése az Activity Result API-n keresztül történik. A válasz kézhezvétele után az alkalmazás ellenőrzi az állapotot, és elindítja a kamerát vagy megjelenít egy magyarázatot.
private val cameraLauncher =
registerForActivityResult(ActivityResultContracts.TakePicture()) { success ->
if (success) {
// Fotó elmentve
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)
}
}
Az Android 11-től kezdve, ha a felhasználó kétszer megtagadta a hozzáférést a kamerához, a rendszerpárbeszédablak többé nem jelenik meg. A Never Ask Again jelző automatikusan beállításra kerül, és az alkalmazás csak az Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) segítségével irányíthatja át a felhasználót a rendszerbeállításokhoz. A fejlesztőnek elő kell látnia a shouldShowRequestPermissionRationale ellenőrzését az előkészítő képernyő időben történő megjelenítéséhez.
Camera Permission iOS-en az Info.plist fájlban található NSCameraUsageDescription kulcson és az AVCaptureDevice.requestAccess híváson keresztül történik. Az Apple szigorúan ellenőrzi a kérés indokoltságát: ha az alkalmazás a felhasználó számára nem nyilvánvaló módon használja a kamerát, az App Store elutasíthatja az alkalmazást.
A kamera iOS-en történő elérésének kötelező feltétele az NSCameraUsageDescription kulcs hozzáadása az Info.plist fájlhoz. A sztring értéke a rendszerpárbeszédablakban jelenik meg a kérés indokaként.
<key>NSCameraUsageDescription</key>
<string>Az alkalmazásnak hozzáférésre van szüksége a kamerához profilképek készítéséhez és QR-kódok beolvasásához.</string>
Swiftben a kérés az AVCaptureDevice.requestAccess statikus metóduson keresztül történik. A válasz kézhezvétele után az alkalmazás feldolgozza az állapotot és elindítja a rögzítési munkamenetet.
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)")
}
}
A kamera elérésének kérése előtt ajánlott ellenőrizni az aktuális engedélyezési állapotot az AVCaptureDevice.authorizationStatus(for: .video) segítségével. Ez lehetővé teszi a rendszerpárbeszédablak szükségtelen meghívásának elkerülését és azon esetek helyes kezelését, amikor a felhasználó már döntött. Az állapot lehet .notDetermined, .restricted, .denied vagy .authorized.
Camera Permission különböző forgatókönyvekben alkalmazható, az egyszerű beolvasástól a teljes videófelvételig. Minden forgatókönyv saját követelményeket támaszt az engedélyek megvalósításával és kezelésével szemben.
iOS-en a QR-kódok beolvasásához az AVFoundation keretrendszer AVCaptureMetadataOutput elemét használják, amely Camera Permission-t igényel. Androidon a Google ML Kit Barcode Scanning használata ajánlott. Fontos megjegyezni, hogy a QR-kódok beolvasásához magát a kamerát használják, nem egy képfeldolgozó könyvtárat — ezért a Camera Permission kötelező.
A szabványos fényképezés vagy videófelvétel Camera Permission-t igényel mind iOS-en, mind Androidon. Androidon használható az Intent(MediaStore.ACTION_IMAGE_CAPTURE), amely megnyitja a rendszer kameraalkalmazását — ebben az esetben az engedélyt a rendszeralkalmazás kéri, nem az Öné. Az alkalmazáson belüli kamera előnézethez (CameraX, Camera2 API) azonban saját engedély szükséges.
A videohívás alkalmazások (Zoom, Google Meet) és a kiterjesztett valóság (ARCore, ARKit) Camera Permission-t kérnek az első vagy hátsó kameráról történő videó rögzítéséhez. Ebben az esetben a kérést különösen alaposan meg kell magyarázni, mert a felhasználó nem feltétlenül várja el, hogy egy AR-próba bútor alkalmazás kamerát kérjen.
A kamerával iOS-en végzett munka során a rögzítési paraméterek az AVCaptureDeviceInput és az AVCapturePhotoOutput segítségével konfigurálhatók. Androidon a CameraX leegyszerűsíti a konfigurációt az ImageCapture, VideoCapture és Preview visszahívásokon keresztül. Minden konfigurációhoz meg kell adni a kívánt felbontást, zoom szintet és fókusz módot. A megfelelő rögzítési konfiguráció kiválasztása közvetlenül befolyásolja az alkalmazás teljesítményét és az akkumulátorfogyasztást.
A kamerával való munka során különböző hibák léphetnek fel. A kamera lehet, hogy egy másik alkalmazás foglalja el, ki van kapcsolva a rendszer adatvédelmi beállításaiban, vagy nem található az eszközön. Androidon ajánlott a CameraAccessException kezelése a CameraManager.openCamera hívásakor. iOS-en ellenőrizni kell az AVCaptureDevice.authorizationStatus értékét, és helyesen kell kezelni a megtagadást, lehetőséget kínálva a felhasználónak a beállításokba való navigálásra a hozzáférés engedélyezéséhez. Mindig ellenőrizze a kamera jelenlétét az eszközön az engedély kérése előtt a PackageManager.hasSystemFeature segítségével. Az ilyen ellenőrzés megakadályozza a szükségtelen kéréseket a kamera nélküli eszközökön és javítja a felhasználói élményt.
A teljesítmény optimalizálása a kamerával való munka során fontos az alkalmazás zökkenőmentes működéséhez. A nagy felbontású videófelvétel jelentős processzor- és akkumulátorerőforrásokat fogyaszt.
iOS-en használja az AVCaptureSessionPresetMedium értéket a maximális felbontás helyett, ha az alkalmazás nem igényel 4K felvételt. Androidon a CameraX lehetővé teszi az ImageCapture konfigurálását célfelbontással az ImageCaptureConfig.Builder segítségével. Szintén fontos a kamera felszabadítása, amikor az alkalmazás háttérbe kerül, és annak újbóli lefoglalása visszatéréskor. Ez a Google és az Apple által az akkumulátor kímélése érdekében ajánlott általános gyakorlat.
Legjobb gyakorlatok segítenek növelni a Camera Permission jóváhagyási arányát és elkerülni az alkalmazás App Store vagy Google Play általi elutasítását.
A rendszerpárbeszédablak meghívása előtt jelenítsen meg egy képernyőt a kamera használatának példájával: a beolvasási felület képét, egy keretet a profilfotóhoz, egy felismert QR-kód példáját. A vizuális magyarázat hatékonyabb, mint a szöveges magyarázat. Az UX Movement (2024) adatai szerint a vizuális előnézet hozzáadása 72%-ra növeli a jóváhagyási arányt.
Soha ne kérjen Camera Permission-t az alkalmazás első indításakor. Az a felhasználó, aki éppen megnyitotta az alkalmazást, nagyobb valószínűséggel utasítja el, ha nem érti a kontextust. Kérjen hozzáférést szigorúan abban a pillanatban, amikor a felhasználó megnyom egy, a kamerát igénylő gombot: „Profilfotó készítése”, „Kód beolvasása”, „Videohívás indítása”. A kontextuális trigger növeli a kérés indokoltságát.
Ha a felhasználó megtagadta a Camera Permission-t, kínáljon alternatív módot a művelet végrehajtására: fénykép kiválasztása a galériából, a QR-kód adatainak manuális bevitele, kép feltöltése az eszközről. A megtagadás nem blokkolhatja teljesen az alkalmazás funkcionalitását — ez a Google Play és az App Store alkalmazástervezési ajánlásainak követelménye.
Gyakran ismételt kérdések
A kamera engedély nélküli megnyitásának kísérletekor hibát kap. Előzetesen ellenőrizni kell az állapotot a checkSelfPermission segítségével Androidon vagy az authorizationStatus segítségével iOS-en, és alternatív forgatókönyvet kell felajánlani.
Igen, a QR-kódok kamerán keresztüli beolvasása Camera Permission-t igényel. Alternatív megközelítés — QR-kód felismerő könyvtárak használata képből kamera nélkül (például egy kódot tartalmazó fotó letöltése a galériából) — de ehhez Photo Library Permission szükséges.
A Jetpack Compose architektúrában használhatja a rememberLauncherForActivityResult elemet az ActivityResultContracts.RequestPermission paraméterrel egy composable függvényben. A felhasználói felület nélküli szolgáltatások esetén közvetlen engedélykérés nem lehetséges — át kell adni a vezérlést az Activity-nek.
A legvalószínűbb ok az NSCameraUsageDescription kulcs hiánya az Info.plist fájlban. Az iOS 10 óta bármilyen AVCaptureDevice-hez való hozzáférés e kulcs nélkül az alkalmazás összeomlását (crash) okozza NSInvalidArgumentException kivétellel.
Androidon állítsa vissza az alkalmazás beállításait a Settings → Apps → [Alkalmazás] → Engedélyek útvonalon. iOS-en használja a Settings → [Alkalmazás] → Camera kapcsolót. A tesztek iOS-en történő automatizálásához használhatja a XCUITest elemet a resetAuthorizationStatus funkcióval.
Összegzés
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is