Camera Permission — to uprawnienie, które aplikacja mobilna prosi użytkownika o dostęp do aparatu urządzenia. Bez niego aplikacja nie może robić zdjęć, skanować kodów QR ani uruchamiać połączeń wideo. Według danych Android Developers, 2024, wszystkie aplikacje korzystające z aparatu na Android 6.0 i nowszych muszą prosić o uprawnienie w czasie wykonania poprzez systemowy dialog.
Najważniejsze
Camera Permission — to systemowe uprawnienie regulujące dostęp aplikacji do aparatu urządzenia mobilnego. Platformy mobilne traktują aparat jako poufny zasób, ponieważ umożliwia nagrywanie wideo i fotografowanie otoczenia użytkownika w czasie rzeczywistym.
Na Android uprawnienie CAMERA należy do kategorii niebezpiecznych (dangerous permissions) i wymaga obowiązkowego zapytania w czasie wykonania. Na iOS dodanie klucza NSCameraUsageDescription w Info.plist jest warunkiem koniecznym dla każdej aplikacji, która uzyskuje dostęp do aparatu. Bez tego klucza aplikacja ulegnie awaryjnemu zakończeniu przy próbie otwarcia aparatu.
Według badań Statista (2024), około 68% aplikacji mobilnych w top-100 App Store korzysta z aparatu w tej lub innej formie: od skanowania kodów QR po pełnoprawne robienie zdjęć i nagrywanie wideo. Przy tym 37% użytkowników odmawia dostępu do aparatu, jeśli nie rozumieją, po co aplikacji to uprawnienie.
Camera Permission na Android jest proszone przez deklarację w manifeście i następne zapytanie w czasie wykonania. Począwszy od Android 6.0, uprawnienia CAMERA nie można uzyskać tylko na etapie instalacji — użytkownik musi wyraźnie potwierdzić dostęp.
Do użycia aparatu na Android należy dodać odpowiednią deklarację w pliku manifestu. Bez tego system nie pozwoli aplikacji otworzyć aparatu nawet przy zapytaniu w czasie wykonania.
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
Atrybut android:required=false dla uses-feature pozwala zainstalować aplikację na urządzeniach bez aparatu. Jest to ważne, jeśli aparat nie jest obowiązkowym komponentem do działania całej aplikacji.
Prośba o Camera Permission jest wykonywana przez Activity Result API. Po otrzymaniu odpowiedzi aplikacja sprawdza status i uruchamia aparat lub pokazuje wyjaśnienie.
private val cameraLauncher =
registerForActivityResult(ActivityResultContracts.TakePicture()) { success ->
if (success) {
// Zdjęcie zapisane
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)
}
}
Począwszy od Android 11, jeśli użytkownik dwukrotnie odmówił dostępu do aparatu, systemowy dialog nie będzie już wyświetlany. Flaga Never Ask Again jest ustawiana automatycznie, a aplikacja może tylko przekierować użytkownika do ustawień systemowych przez Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS). Deweloper powinien przewidzieć sprawdzenie shouldShowRequestPermissionRationale w celu terminowego wyświetlenia ekranu wstępnego.
Camera Permission na iOS jest zarządzane przez klucz NSCameraUsageDescription w Info.plist i wywołanie AVCaptureDevice.requestAccess. Apple ściśle sprawdza zasadność prośby: jeśli aplikacja korzysta z aparatu w sposób nieoczywisty dla użytkownika, App Store może odrzucić aplikację.
Obowiązkowym warunkiem dostępu do aparatu na iOS jest dodanie klucza NSCameraUsageDescription w pliku Info.plist. Wartość stringa zostanie wyświetlona w systemowym dialogu jako powód prośby.
<key>NSCameraUsageDescription</key>
<string>Aplikacja potrzebuje dostępu do aparatu, aby robić zdjęcia profilowe i skanować kody QR.</string>
W Swift prośba jest wykonywana przez statyczną metodę AVCaptureDevice.requestAccess. Po otrzymaniu odpowiedzi aplikacja przetwarza status i uruchamia sesję przechwytywania.
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)")
}
}
Przed prośbą o dostęp do aparatu zaleca się sprawdzić bieżący status autoryzacji przez AVCaptureDevice.authorizationStatus(for: .video). Pozwala to uniknąć zbędnego wywołania systemowego dialogu i poprawnie obsłużyć przypadki, gdy użytkownik już podjął decyzję. Status może być .notDetermined, .restricted, .denied lub .authorized.
Camera Permission znajduje zastosowanie w różnych scenariuszach, od prostego skanowania po pełnoprawne nagrywanie wideo. Każdy scenariusz stawia własne wymagania co do implementacji i obsługi uprawnień.
Na iOS do skanowania kodów QR używa się AVCaptureMetadataOutput z frameworka AVFoundation, który wymaga Camera Permission. Na Android zaleca się używać ML Kit Barcode Scanning od Google. Ważne jest, że do skanowania kodów QR używa się właśnie aparatu, a nie biblioteki analizy obrazu — dlatego Camera Permission jest obowiązkowy.
Standardowe robienie zdjęć lub nagrywanie wideo wymaga Camera Permission zarówno na iOS, jak i na Android. Na Android można użyć Intent(MediaStore.ACTION_IMAGE_CAPTURE), który otwiera systemową aplikację aparatu — w tym przypadku uprawnienia prosi aplikacja systemowa, a nie wasza. Jednak do podglądu aparatu wewnątrz aplikacji (CameraX, Camera2 API) potrzebne jest własne uprawnienie.
Aplikacje do połączeń wideo (Zoom, Google Meet) i rzeczywistości rozszerzonej (ARCore, ARKit) proszą o Camera Permission do przechwytywania wideo z przedniego lub tylnego aparatu. W tym przypadku prośba powinna być szczególnie dokładnie wyjaśniona, ponieważ użytkownik może nie spodziewać się, że aplikacja do AR-przymierzania mebli prosi o dostęp do aparatu.
Przy pracy z aparatem na iOS można skonfigurować parametry przechwytywania przez AVCaptureDeviceInput i AVCapturePhotoOutput. Na Android CameraX upraszcza konfigurację przez wywołania zwrotne ImageCapture, VideoCapture i Preview. Dla każdej konfiguracji należy określić pożądaną rozdzielczość, poziom zoomu i tryb ustawiania ostrości. Wybór właściwej konfiguracji przechwytywania bezpośrednio wpływa na wydajność aplikacji i zużycie baterii.
Przy pracy z aparatem mogą wystąpić różne błędy. Aparat może być zajęty przez inną aplikację, wyłączony w systemowych ustawieniach prywatności lub nieobecny na urządzeniu. Na Android zaleca się obsługę CameraAccessException przy wywołaniu CameraManager.openCamera. Na iOS należy sprawdzić AVCaptureDevice.authorizationStatus i poprawnie obsłużyć odmowę, proponując użytkownikowi przejście do ustawień w celu włączenia dostępu. Zawsze sprawdzaj obecność aparatu na urządzeniu przed prośbą o uprawnienie za pomocą PackageManager.hasSystemFeature. Taka kontrola zapobiega zbędnym prośbom na urządzeniach bez aparatu i poprawia doświadczenie użytkownika.
Optymalizacja wydajności przy pracy z aparatem jest ważna dla płynnego działania aplikacji. Przechwytywanie wideo w wysokiej rozdzielczości zużywa znaczne zasoby procesora i baterii.
Na iOS używaj AVCaptureSessionPresetMedium zamiast maksymalnej rozdzielczości, jeśli aplikacja nie wymaga nagrywania w 4K. Na Android CameraX pozwala skonfigurować ImageCapture z docelową rozdzielczością przez ImageCaptureConfig.Builder. Ważne jest również zwalnianie aparatu przy przejściu aplikacji w tło i ponowne przechwytywanie go po powrocie. Jest to standardowa praktyka zalecana przez Google i Apple w celu oszczędzania baterii.
Najlepsze praktyki pomagają zwiększyć odsetek zgód na Camera Permission i uniknąć odrzucenia aplikacji przez App Store lub Google Play.
Przed wywołaniem systemowego dialogu pokaż ekran z przykładem użycia aparatu: obraz interfejsu skanowania, ramkę do zdjęcia profilowego, przykład rozpoznanego kodu QR. Wizualne wyjaśnienie działa lepiej niż tekstowe. Według danych UX Movement (2024), dodanie wizualnego podglądu zwiększa konwersję zgody do 72%.
Nigdy nie proś o Camera Permission przy pierwszym uruchomieniu aplikacji. Użytkownik, który właśnie otworzył aplikację, częściej odrzuci prośbę, jeśli nie rozumie kontekstu. Proś o dostęp ściśle w momencie, gdy użytkownik naciska przycisk wymagający aparatu: „Zrobić zdjęcie profilowe”, „Skanować kod”, „Rozpocząć połączenie wideo”. Contextual trigger zwiększa sensowność prośby.
Jeśli użytkownik odmówił Camera Permission, zaproponuj alternatywny sposób wykonania działania: wybór zdjęcia z galerii, ręczne wpisanie danych kodu QR, przesłanie obrazu z urządzenia. Odmowa nie powinna całkowicie blokować funkcjonalności aplikacji — to wymaganie zaleceń Google Play i App Store dotyczących projektowania aplikacji.
Często zadawane pytania
Przy awaryjnym zakończeniu próby otwarcia aparatu bez uprawnienia otrzymasz błąd. Należy wcześniej sprawdzić status przez checkSelfPermission na Android lub authorizationStatus na iOS i zaproponować alternatywny scenariusz.
Tak, skanowanie kodów QR przez aparat wymaga Camera Permission. Alternatywnym podejściem jest użycie bibliotek rozpoznawania kodu QR z obrazu bez aparatu (np. pobranie zdjęcia z kodem z galerii), ale to wymaga Photo Library Permission.
W architekturze Jetpack Compose można użyć rememberLauncherForActivityResult z ActivityResultContracts.RequestPermission w funkcji composable. Dla usług bez UI bezpośrednie zapytanie o uprawnienie nie jest możliwe — należy przekazać kontrolę do Activity.
Najbardziej prawdopodobną przyczyną jest brak klucza NSCameraUsageDescription w Info.plist. Od iOS 10 każde odwołanie do AVCaptureDevice bez tego klucza powoduje awaryjne zakończenie aplikacji (crash) z wyjątkiem NSInvalidArgumentException.
Na Android zresetuj ustawienia aplikacji przez Settings → Apps → [Aplikacja] → Uprawnienia. Na iOS użyj Settings → [Aplikacja] → przełącznik Camera. Do automatyzacji testów na iOS można użyć XCUITest z resetAuthorizationStatus.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również