Photo Library Permission — is de toestemming die een app nodig heeft om toegang te krijgen tot foto's en video's op het apparaat van de gebruiker. Het is vereist voor het selecteren van afbeeldingen uit de galerij, het opslaan van mediabestanden en het beheren van fotoalbums. Volgens Apple Developer Documentation, 2024 moeten apps vanaf iOS 14 toegang vragen tot een beperkte bibliotheek, niet tot alle foto's tegelijk.
Belangrijkste punten
Photo Library Permission — is de systeemtoestemming die de toegang van een app tot mediabestanden op het apparaat regelt. Het omvat zowel lezen (bekijken en selecteren van foto's en video's) als schrijven (opslaan van nieuwe bestanden in de galerij). Mobiele platforms beschouwen de mediabibliotheek als vertrouwelijke gegevens, omdat foto's persoonlijke en gevoelige informatie kunnen bevatten.
Op Android 13 (API 33) heeft Google de enkele toestemming READ_EXTERNAL_STORAGE opgesplitst in drie aparte: READ_MEDIA_IMAGES voor foto's, READ_MEDIA_VIDEO voor video's en READ_MEDIA_AUDIO voor audio. Hiermee kan de gebruiker alleen toegang geven tot een specifiek type mediabestanden. Op iOS biedt PhotoKit vanaf iOS 14 de gebruiker de mogelijkheid om specifieke foto's te selecteren voor toegang, in plaats van de hele bibliotheek open te stellen.
Volgens Counterpoint Research (2024) vraagt meer dan 70% van de mobiele apps in de categorieën sociale media, communicatie en fotobewerkers om Photo Library Permission. Tegelijkertijd weigert 32% van de gebruikers toegang tot de galerij als ze niet begrijpen waarom de app hun foto's nodig heeft. Apple en Google raden aan om de systeem-PhotoPicker te gebruiken voor het selecteren van afzonderlijke bestanden zonder volledige toegang te vragen.
Toegang tot de galerij op Android is aanzienlijk veranderd met de komst van Android 13. In plaats van één READ_EXTERNAL_STORAGE-toestemming zijn er granulaire toestemmingen voor elk type mediabestand gekomen, wat de gebruiker meer controle geeft.
Vanaf Android 13 wordt READ_MEDIA_IMAGES gebruikt voor toegang tot foto's en READ_MEDIA_VIDEO voor video's. De toestemming READ_EXTERNAL_STORAGE biedt geen toegang meer tot mediabestanden — deze is alleen behouden voor het lezen van niet-media bestanden uit de gedeelde opslag. De declaratie in het manifest ziet er als volgt uit:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
Voor achterwaartse compatibiliteit met Android 12 en lager moet ook READ_EXTERNAL_STORAGE worden gedeclareerd. Android 13 negeert deze toestemming echter automatisch wanneer de nieuwe granulaire toestemmingen aanwezig zijn. Gebruik het attribuut android:maxSdkVersion="32" in het manifest voor de oude toestemming om deze te verbergen op nieuwe versies. Dit voorkomt een overbodige aanvraag op apparaten met Android 13+.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
De runtime-aanvraag voor Photo Library Permission op Android wordt uitgevoerd via de Activity Result API. Voorbeeld voor het aanvragen van toegang tot afbeeldingen:
private val photoPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) {
loadGalleryImages()
} else {
showPermissionDenied()
}
}
fun pickPhoto() {
val permission = if (Build.version.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
Manifest.permission.READ_MEDIA_IMAGES
} else {
Manifest.permission.READ_EXTERNAL_STORAGE
}
if (ContextCompat.checkSelfPermission(this, permission)
== PackageManager.PERMISSION_GRANTED) {
loadGalleryImages()
} else {
photoPermissionLauncher.launch(permission)
}
}
Toegang tot de galerij op iOS wordt beheerd via het PhotoKit-framework en de sleutels NSPhotoLibraryUsageDescription en NSPhotoLibraryAddUsageDescription in Info.plist. Vanaf iOS 14 kan de gebruiker alleen toegang geven tot geselecteerde foto's (Limited Photo Library).
Voor het lezen van foto's uit de bibliotheek is NSPhotoLibraryUsageDescription vereist, voor schrijven (foto's opslaan) — NSPhotoLibraryAddUsageDescription. Als de app alleen media opslaat maar niet leest, is de tweede sleutel voldoende.
<key>NSPhotoLibraryUsageDescription</key>
<string>De app heeft toegang tot foto's nodig om een profielfoto te selecteren en afbeeldingen te publiceren.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>De app heeft toegang nodig om bewerkte foto's op te slaan in uw galerij.</string>
De toegangsaanvraag voor foto's op iOS wordt uitgevoerd via PHPhotoLibrary.requestAuthorization. Vanaf iOS 14 geeft de status .limited aan dat de gebruiker toegang heeft verleend tot een beperkte set foto's.
import PhotosUI
func requestPhotoLibraryAccess() {
PHPhotoLibrary.requestAuthorization { status in
DispatchQueue.main.async {
switch status {
case .authorized:
self.loadPhotoLibrary()
case .limited:
self.loadSelectedPhotos()
case .denied, .restricted:
self.showSettingsAlert()
case .notDetermined:
break
}
}
}
}
private func loadPhotoLibrary() {
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let assets = PHAsset.fetchAssets(with: .image, options: fetchOptions)
// Werken met aanvraagresultaten
}
De status .limited op iOS 14+ betekent dat de gebruiker alleen toegang heeft gegeven tot enkele geselecteerde foto's. De app kan uitbreiding van toegang aanvragen via een systeemdialoog door PHPhotoLibrary.shared().presentLimitedLibraryPicker aan te roepen. Het wordt aanbevolen deze dialoog alleen te tonen wanneer de gebruiker expliciet een functie aanvraagt waarvoor extra foto's nodig zijn.
PhotoPicker — is een systeemcomponent voor het selecteren van mediabestanden die geen toestemming vereist voor toegang tot de volledige bibliotheek. Vanaf Android 13 en iOS 14 raden Google en Apple aan om PhotoPicker te gebruiken in plaats van Photo Library Permission aan te vragen, als de app slechts één of enkele foto's hoeft te selecteren.
Op Android 13+ stelt de ingebouwde PhotoPicker (ActivityResultContracts.PickVisualMedia) de gebruiker in staat een foto of video te selecteren zonder toegang tot de volledige galerij te verlenen. De app ontvangt alleen de URI van de geselecteerde bestanden. PhotoPicker werkt zonder enige toestemming in het manifest te declareren.
private val pickMedia =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) {
// URI van het geselecteerde bestand, zonder toegang tot de volledige bibliotheek
showImage(uri)
}
}
fun selectPhoto() {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
Op iOS 14+ is PHPickerViewController geïntroduceerd — een systeempicker die ook geen toegang tot de volledige bibliotheek vereist. PHPicker werkt in een apart proces en heeft geen toegang tot de bibliotheek van de app. Dit is de voorkeursmethode voor het selecteren van foto's in de meeste scenario's.
import PhotosUI
func presentPhotoPicker() {
var config = PHPickerConfiguration()
config.selectionLimit = 1
config.filter = .images
let picker = PHPickerViewController(configuration: config)
picker.delegate = self
present(picker, animated: true)
}
PhotoPicker is niet geschikt als de app toegang tot de volledige bibliotheek nodig heeft voor massa-operaties: back-up, synchronisatie met de cloud, galerij-app, bestandsbeheer. In deze gevallen moet Photo Library Permission worden aangevraagd en moet het geval van beperkte toegang (Limited) worden afgehandeld. Voor iOS is het verplicht om de status .limited te verwerken en de gebruiker de mogelijkheid te bieden de toegang uit te breiden.
Beste praktijken voor het werken met Photo Library Permission helpen het aantal weigeringen te verminderen en te voldoen aan de privacyvereisten van de platforms.
Gebruik voor het selecteren van een of meerdere foto's de systeem-PhotoPicker of PHPicker. Deze componenten hebben geen toestemming nodig en bieden de beste gebruikerservaring. Vraag alleen volledige toegang tot de galerij aan als de functionaliteit van de app toegang tot de volledige mediabibliotheek vereist. Google en Apple raden deze aanpak expliciet aan in de documentatie voor ontwikkelaars.
Als de app echt volledige toegang tot de galerij nodig heeft, toon dan een voorafgaand scherm met uitleg. Leg uit waarom alle foto's nodig zijn, niet slechts één. Een back-up-app moet bijvoorbeeld uitleggen dat het alle mediabestanden scant om een kopie te maken. Pre-permission screen is vooral belangrijk op iOS vanwege het Limited Access-mechanisme.
Als de app alleen foto's opslaat maar niet leest (bijv. een fotobewerker die het resultaat opslaat), vraag dan alleen toestemming voor schrijven naar de galerij. Op Android is dit WRITE_EXTERNAL_STORAGE (voor Android 12 en lager) of MediaStore API zonder toestemming (voor Android 10+). Op iOS gebruik je NSPhotoLibraryAddUsageDescription zonder NSPhotoLibraryUsageDescription.
Veelgestelde vragen
Vanaf Android 10 (API 29) vereist het opslaan van foto's via MediaStore geen toestemming WRITE_EXTERNAL_STORAGE. Het systeem biedt toegang tot de gedeelde opslag voor schrijven zonder expliciete toestemming. Voor het lezen van andermans bestanden is nog steeds de juiste toestemming vereist.
READ_EXTERNAL_STORAGE — de oude toestemming voor het lezen van alle bestanden uit de gedeelde opslag (tot Android 12). READ_MEDIA_IMAGES — de nieuwe granulaire toestemming voor het lezen van alleen afbeeldingen (Android 13+). De gebruiker kan alleen toegang geven tot foto's en toegang tot video's en audio weigeren.
De status .limited betekent dat de gebruiker enkele foto's heeft geselecteerd voor toegang. De app kan de systeemdialoog voor uitbreiding tonen via PHPhotoLibrary.shared().presentLimitedLibraryPicker. Het wordt aanbevolen deze dialoog alleen te tonen op expliciet verzoek van de gebruiker, bijvoorbeeld bij het klikken op de knop 'Voeg meer foto's toe'.
Ja, met Photo Library Permission kan de app EXIF-gegevens lezen, inclusief geotags, opnamedatum en cameramodel. Op iOS kan voor toegang tot geotags aanvullende Location Permission nodig zijn, omdat Apple GPS-coördinaten als vertrouwelijke gegevens beschouwt.
Gebruik de systeempicker: PHPicker met filter = .videos op iOS, PickVisualMedia met VideoOnly op Android. Op Android kan voor het selecteren van een video uit de galerij ook Intent(Intent.ACTION_PICK) met MediaStore.Video.Media.EXTERNAL_CONTENT_URI worden gebruikt, maar dit vereist toestemming READ_EXTERNAL_STORAGE op versies onder Android 13.
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