Photo Library Permission ist eine Berechtigung, die eine App benötigt, um auf Fotos und Videos zuzugreifen, die auf dem Gerät des Benutzers gespeichert sind. Sie wird benötigt, um Bilder aus der Galerie auszuwählen, Mediendateien zu speichern und Fotoalben zu verwalten. Laut Apple Developer Documentation, 2024 müssen Apps ab iOS 14 Zugriff auf eine begrenzte Bibliothek anfordern, nicht auf alle Fotos auf einmal.
Wichtige Punkte
Photo Library Permission ist eine Systemberechtigung, die den Zugriff einer App auf auf dem Gerät gespeicherte Mediendateien regelt. Sie umfasst sowohl das Lesen (Anzeigen und Auswählen von Fotos und Videos) als auch das Schreiben (Speichern neuer Dateien in der Galerie). Mobile Plattformen betrachten die Medienbibliothek als sensible Daten, da Fotos persönliche und private Informationen enthalten können.
Unter Android 13 (API 33) hat Google die einzelne READ_EXTERNAL_STORAGE-Berechtigung in drei separate aufgeteilt: READ_MEDIA_IMAGES für Fotos, READ_MEDIA_VIDEO für Videos und READ_MEDIA_AUDIO für Audio. Dies ermöglicht Benutzern, nur Zugriff auf einen bestimmten Medientyp zu gewähren. Unter iOS ermöglicht PhotoKit ab iOS 14 Benutzern, bestimmte Fotos für den Zugriff auszuwählen, anstatt die gesamte Bibliothek zu öffnen.
Laut Counterpoint Research (2024) fordern über 70% der mobilen Apps in den Kategorien soziale Netzwerke, Kommunikation und Foto-Editoren Photo Library Permission an. Gleichzeitig verweigern 32% der Benutzer den Galeriezugriff, wenn sie nicht verstehen, warum die App ihre Fotos benötigt. Apple und Google empfehlen, die systemeigene PhotoPicker-Auswahl zum Auswählen einzelner Dateien zu verwenden, ohne vollständigen Zugriff anzufordern.
Der Galeriezugriff unter Android hat sich mit der Veröffentlichung von Android 13 erheblich geändert. Anstelle einer einzigen READ_EXTERNAL_STORAGE-Berechtigung wurden granulare Berechtigungen für jeden Medientyp eingeführt, die den Benutzern mehr Kontrolle geben.
Ab Android 13 wird READ_MEDIA_IMAGES für den Foto-Zugriff und READ_MEDIA_VIDEO für den Video-Zugriff verwendet. Die READ_EXTERNAL_STORAGE-Berechtigung gewährt keinen Zugriff mehr auf Mediendateien — sie bleibt nur zum Lesen von Nicht-Medien-Dateien aus dem gemeinsamen Speicher erhalten. Die Deklaration im Manifest sieht so aus:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
Für Abwärtskompatibilität mit Android 12 und niedriger müssen Sie auch READ_EXTERNAL_STORAGE deklarieren. Android 13 ignoriert diese Berechtigung jedoch automatisch, wenn die neuen granularen Berechtigungen vorhanden sind. Verwenden Sie das Attribut android:maxSdkVersion="32" im Manifest für die alte Berechtigung, um sie auf neueren Versionen auszublenden. Dies verhindert redundante Anfragen auf Geräten mit Android 13+.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
Die Laufzeitanfrage für Photo Library Permission unter Android erfolgt über die Activity Result API. Beispiel für die Anfrage zum Zugriff auf Bilder:
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)
}
}
Der Galeriezugriff unter iOS wird über das PhotoKit-Framework und die Schlüssel NSPhotoLibraryUsageDescription und NSPhotoLibraryAddUsageDescription in Info.plist verwaltet. Ab iOS 14 können Benutzer nur ausgewählten Fotos Zugriff gewähren (Limited Photo Library).
Zum Lesen von Fotos aus der Bibliothek ist NSPhotoLibraryUsageDescription erforderlich, zum Schreiben (Speichern von Fotos) ist NSPhotoLibraryAddUsageDescription erforderlich. Wenn die App nur Medien speichert, aber nicht liest, ist der zweite Schlüssel ausreichend.
<key>NSPhotoLibraryUsageDescription</key>
<string>Die App benötigt Zugriff auf Fotos, um ein Profilbild auszuwählen und Schnappschüsse zu veröffentlichen.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Die App benötigt Zugriff, um bearbeitete Fotos in Ihrer Galerie zu speichern.</string>
Die Foto-Zugriffsanfrage unter iOS erfolgt über PHPhotoLibrary.requestAuthorization. Ab iOS 14 zeigt der Status .limited an, dass der Benutzer Zugriff auf eine begrenzte Anzahl von Fotos gewährt hat.
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)
// Behandlung der Anforderungsergebnisse
}
Der Status .limited unter iOS 14+ bedeutet, dass der Benutzer nur Zugriff auf einige ausgewählte Fotos gewährt hat. Die App kann über einen Systemdialog erweiterten Zugriff anfordern, indem sie PHPhotoLibrary.shared().presentLimitedLibraryPicker aufruft. Es wird empfohlen, diesen Dialog nur anzuzeigen, wenn der Benutzer explizit eine Funktion anfordert, die zusätzliche Fotos benötigt.
PhotoPicker ist eine Systemkomponente zum Auswählen von Mediendateien, die keine Berechtigung zum Zugriff auf die gesamte Bibliothek erfordert. Ab Android 13 und iOS 14 empfehlen Google und Apple die Verwendung von PhotoPicker anstelle der Anforderung von Photo Library Permission, wenn die App nur ein oder mehrere Fotos auswählen muss.
Unter Android 13+ ermöglicht der integrierte PhotoPicker (ActivityResultContracts.PickVisualMedia) Benutzern, ein Foto oder Video auszuwählen, ohne Zugriff auf die gesamte Galerie zu gewähren. Die App erhält nur die URI der ausgewählten Dateien. PhotoPicker funktioniert ohne Deklaration von Berechtigungen im Manifest.
private val pickMedia =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) {
// URI der ausgewählten Datei, ohne Zugriff auf die gesamte Bibliothek
showImage(uri)
}
}
fun selectPhoto() {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
Ab iOS 14+ wurde PHPickerViewController eingeführt — eine Systemauswahl, die ebenfalls keinen Zugriff auf die gesamte Bibliothek erfordert. PHPicker wird in einem separaten Prozess ausgeführt und hat keinen Zugriff auf die App-Bibliothek. Dies ist die bevorzugte Methode zum Auswählen von Fotos für die meisten Szenarien.
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 ist nicht geeignet, wenn die App für Massenoperationen Zugriff auf die gesamte Bibliothek benötigt: Backup, Cloud-Synchronisation, Galerie-App, Dateimanager. In diesen Fällen müssen Sie Photo Library Permission anfordern und den Fall des eingeschränkten Zugriffs (Limited) behandeln. Für iOS ist die Behandlung des .limited-Status und das Angebot an Benutzer, den Zugriff zu erweitern, obligatorisch.
Best Practices für die Arbeit mit Photo Library Permission helfen, die Anzahl der Ablehnungen zu reduzieren und die Datenschutzanforderungen der Plattformen zu erfüllen.
Verwenden Sie zum Auswählen eines oder mehrerer Fotos die systemeigene PhotoPicker- oder PHPicker-Auswahl. Diese Komponenten benötigen keine Berechtigungen und bieten die beste Benutzererfahrung. Fordern Sie vollständigen Galeriezugriff nur an, wenn die App-Funktionalität Zugriff auf die gesamte Medienbibliothek erfordert. Google und Apple empfehlen diesen Ansatz ausdrücklich in ihrer Entwicklerdokumentation.
Wenn die App wirklich vollständigen Galeriezugriff benötigt, zeigen Sie einen vorbereitenden Bildschirm mit einer Erklärung an. Erklären Sie, warum alle Fotos benötigt werden und nicht nur eines. Beispielsweise sollte eine Backup-App erklären, dass sie alle Mediendateien scannt, um eine Kopie zu erstellen. Der Pre-Permission-Bildschirm ist aufgrund des Mechanismus für eingeschränkten Zugriff besonders wichtig für iOS.
Wenn die App nur Fotos speichert, aber nicht liest (z. B. ein Foto-Editor, der das Ergebnis speichert), fordern Sie nur die Schreibberechtigung für die Galerie an. Unter Android ist dies WRITE_EXTERNAL_STORAGE (für Android 12 und niedriger) oder die MediaStore-API ohne Berechtigungen (für Android 10+). Unter iOS verwenden Sie NSPhotoLibraryAddUsageDescription ohne NSPhotoLibraryUsageDescription.
Häufig gestellte Fragen
Ab Android 10 (API 29) erfordert das Speichern von Fotos über MediaStore keine WRITE_EXTERNAL_STORAGE-Berechtigung. Das System gewährt Zugriff auf den gemeinsamen Speicher zum Schreiben ohne explizite Berechtigung. Zum Lesen von Dateien anderer Benutzer ist weiterhin die entsprechende Berechtigung erforderlich.
READ_EXTERNAL_STORAGE ist die alte Berechtigung zum Lesen aller Dateien aus dem gemeinsamen Speicher (bis Android 12). READ_MEDIA_IMAGES ist eine neue granulare Berechtigung zum Lesen nur von Bildern (Android 13+). Benutzer können nur Zugriff auf Fotos gewähren, während der Zugriff auf Videos und Audio verweigert wird.
Der Status .limited bedeutet, dass der Benutzer einige Fotos für den Zugriff ausgewählt hat. Die App kann einen Systemerweiterungsdialog über PHPhotoLibrary.shared().presentLimitedLibraryPicker anzeigen. Es wird empfohlen, diesen Dialog nur auf explizite Anfrage des Benutzers anzuzeigen, z. B. beim Tippen auf eine Schaltfläche „Weitere Fotos hinzufügen“.
Ja, mit Photo Library Permission kann die App EXIF-Daten lesen, einschließlich Geotags, Aufnahmedatum und Kameramodell. Unter iOS kann für den Zugriff auf Geotags eine zusätzliche Standortberechtigung erforderlich sein, da Apple GPS-Koordinaten als vertrauliche Daten betrachtet.
Verwenden Sie die Systemauswahl: PHPicker mit filter = .videos unter iOS, PickVisualMedia mit VideoOnly unter Android. Unter Android können Sie auch Intent(Intent.ACTION_PICK) mit MediaStore.Video.Media.EXTERNAL_CONTENT_URI verwenden, aber dies erfordert die READ_EXTERNAL_STORAGE-Berechtigung auf Versionen unter Android 13.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch