Photo Library Permission est une autorisation nécessaire pour qu'une application accède aux photos et vidéos stockées sur l'appareil de l'utilisateur. Elle est requise pour sélectionner des images de la galerie, enregistrer des fichiers multimédia et gérer des albums photos. Selon Apple Developer Documentation, 2024, à partir d'iOS 14, les applications doivent demander l'accès à une bibliothèque limitée, et non à toutes les photos à la fois.
Points Clés
Photo Library Permission est une autorisation système qui régule l'accès d'une application aux fichiers multimédia stockés sur l'appareil. Elle couvre à la fois la lecture (visualisation et sélection de photos et vidéos) et l'écriture (enregistrement de nouveaux fichiers dans la galerie). Les plateformes mobiles considèrent la bibliothèque multimédia comme des données sensibles car les photos peuvent contenir des informations personnelles et privées.
Sur Android 13 (API 33), Google a divisé l'autorisation unique READ_EXTERNAL_STORAGE en trois autorisations distinctes : READ_MEDIA_IMAGES pour les photos, READ_MEDIA_VIDEO pour les vidéos et READ_MEDIA_AUDIO pour l'audio. Cela permet aux utilisateurs d'accorder l'accès uniquement à un type spécifique de fichier multimédia. Sur iOS, à partir d'iOS 14, PhotoKit permet aux utilisateurs de sélectionner des photos spécifiques pour l'accès plutôt que d'ouvrir toute la bibliothèque.
Selon Counterpoint Research (2024), plus de 70% des applications mobiles dans les catégories des réseaux sociaux, de la communication et des éditeurs de photos demandent Photo Library Permission. Dans le même temps, 32% des utilisateurs refusent l'accès à la galerie s'ils ne comprennent pas pourquoi l'application a besoin de leurs photos. Apple et Google recommandent d'utiliser le PhotoPicker système pour sélectionner des fichiers individuels sans demander un accès complet.
L'accès à la galerie sur Android a considérablement changé avec la sortie d'Android 13. Au lieu d'une seule autorisation READ_EXTERNAL_STORAGE, des autorisations granulaires pour chaque type de média ont été introduites, donnant aux utilisateurs plus de contrôle.
À partir d'Android 13, READ_MEDIA_IMAGES est utilisé pour l'accès aux photos et READ_MEDIA_VIDEO pour l'accès aux vidéos. L'autorisation READ_EXTERNAL_STORAGE ne fournit plus l'accès aux fichiers multimédia — elle est conservée uniquement pour lire les fichiers non multimédia du stockage partagé. La déclaration dans le manifeste ressemble à ceci :
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
Pour la compatibilité descendante avec Android 12 et versions antérieures, vous devez également déclarer READ_EXTERNAL_STORAGE. Cependant, Android 13 ignore automatiquement cette autorisation lorsque les nouvelles autorisations granulaires sont présentes. Utilisez l'attribut android:maxSdkVersion="32" dans le manifeste pour l'ancienne autorisation afin de la masquer sur les versions plus récentes. Cela évite les demandes redondantes sur les appareils sous Android 13+.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
La demande d'exécution pour Photo Library Permission sur Android s'effectue via l'Activity Result API. Exemple pour demander l'accès aux images :
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)
}
}
L'accès à la galerie sur iOS est géré via le framework PhotoKit et les clés NSPhotoLibraryUsageDescription et NSPhotoLibraryAddUsageDescription dans Info.plist. À partir d'iOS 14, les utilisateurs peuvent accorder l'accès uniquement à des photos sélectionnées (Limited Photo Library).
La lecture de photos depuis la bibliothèque nécessite NSPhotoLibraryUsageDescription, tandis que l'écriture (enregistrement de photos) nécessite NSPhotoLibraryAddUsageDescription. Si l'application enregistre uniquement des médias sans les lire, la seconde clé est suffisante.
<key>NSPhotoLibraryUsageDescription</key>
<string>L'application a besoin d'accès aux photos pour sélectionner une image de profil et publier des instantanés.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>L'application a besoin d'accès pour enregistrer les photos traitées dans votre galerie.</string>
La demande d'accès aux photos sur iOS s'effectue via PHPhotoLibrary.requestAuthorization. À partir d'iOS 14, le statut .limited indique que l'utilisateur a accordé l'accès à un ensemble limité de photos.
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)
// Gestion des résultats de la demande
}
Le statut .limited sur iOS 14+ signifie que l'utilisateur a accordé l'accès uniquement à quelques photos sélectionnées. L'application peut demander un accès étendu via une boîte de dialogue système en appelant PHPhotoLibrary.shared().presentLimitedLibraryPicker. Il est recommandé d'afficher cette boîte de dialogue uniquement lorsque l'utilisateur demande explicitement une fonction nécessitant des photos supplémentaires.
PhotoPicker est un composant système de sélection de fichiers multimédia qui ne nécessite pas d'autorisation pour accéder à l'ensemble de la bibliothèque. À partir d'Android 13 et d'iOS 14, Google et Apple recommandent d'utiliser PhotoPicker plutôt que de demander Photo Library Permission si l'application a seulement besoin de sélectionner une ou plusieurs photos.
Sur Android 13+, le PhotoPicker intégré (ActivityResultContracts.PickVisualMedia) permet aux utilisateurs de sélectionner une photo ou une vidéo sans accorder l'accès à toute la galerie. L'application reçoit uniquement l'URI des fichiers sélectionnés. PhotoPicker fonctionne sans déclarer aucune autorisation dans le manifeste.
private val pickMedia =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) {
// URI du fichier sélectionné, sans accès à l'ensemble de la bibliothèque
showImage(uri)
}
}
fun selectPhoto() {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
Sur iOS 14+, PHPickerViewController a été introduit — un sélecteur système qui ne nécessite pas non plus l'accès à l'ensemble de la bibliothèque. PHPicker s'exécute dans un processus séparé et n'a pas accès à la bibliothèque de l'application. C'est la méthode préférée pour sélectionner des photos dans la plupart des scénarios.
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 n'est pas adapté si l'application a besoin d'accéder à l'ensemble de la bibliothèque pour des opérations en masse : sauvegarde, synchronisation cloud, application de galerie, gestionnaire de fichiers. Dans ces cas, vous devez demander Photo Library Permission et gérer le cas d'accès limité (Limited). Pour iOS, il est obligatoire d'inclure la gestion du statut .limited et d'offrir aux utilisateurs la possibilité d'étendre l'accès.
Les bonnes pratiques pour travailler avec Photo Library Permission aident à réduire le nombre de refus et à respecter les exigences de confidentialité des plateformes.
Pour sélectionner une ou plusieurs photos, utilisez le PhotoPicker ou PHPicker système. Ces composants ne nécessitent pas d'autorisations et offrent la meilleure expérience utilisateur. Demandez un accès complet à la galerie uniquement si la fonctionnalité de l'application nécessite l'accès à l'ensemble de la bibliothèque multimédia. Google et Apple recommandent explicitement cette approche dans leur documentation développeur.
Si l'application a vraiment besoin d'un accès complet à la galerie, affichez un écran préliminaire avec une explication. Expliquez pourquoi toutes les photos sont nécessaires et pas seulement une. Par exemple, une application de sauvegarde doit expliquer qu'elle analysera tous les fichiers multimédia pour créer une copie. L'écran de pré-autorisation est particulièrement important pour iOS en raison du mécanisme d'Accès Limité.
Si l'application enregistre uniquement des photos sans les lire (par exemple, un éditeur de photos qui enregistre le résultat), demandez seulement l'autorisation d'écriture dans la galerie. Sur Android, c'est WRITE_EXTERNAL_STORAGE (pour Android 12 et versions antérieures) ou l'API MediaStore sans autorisations (pour Android 10+). Sur iOS, utilisez NSPhotoLibraryAddUsageDescription sans NSPhotoLibraryUsageDescription.
Foire Aux Questions
À partir d'Android 10 (API 29), l'enregistrement de photos via MediaStore ne nécessite pas l'autorisation WRITE_EXTERNAL_STORAGE. Le système fournit l'accès au stockage partagé pour l'écriture sans autorisation explicite. La lecture des fichiers d'autres utilisateurs nécessite toujours l'autorisation appropriée.
READ_EXTERNAL_STORAGE est l'ancienne autorisation pour lire tous les fichiers du stockage partagé (jusqu'à Android 12). READ_MEDIA_IMAGES est une nouvelle autorisation granulaire pour lire uniquement les images (Android 13+). Les utilisateurs peuvent accorder l'accès uniquement aux photos tout en refusant l'accès aux vidéos et à l'audio.
Le statut .limited signifie que l'utilisateur a sélectionné quelques photos pour l'accès. L'application peut afficher une boîte de dialogue d'extension système via PHPhotoLibrary.shared().presentLimitedLibraryPicker. Il est recommandé d'afficher cette boîte de dialogue uniquement sur demande explicite de l'utilisateur, par exemple, en appuyant sur un bouton « Ajouter plus de photos ».
Oui, avec Photo Library Permission, l'application peut lire les données EXIF, y compris les géotags, la date de capture et le modèle de l'appareil photo. Sur iOS, l'accès aux géotags peut nécessiter une autorisation de localisation supplémentaire, car Apple considère les coordonnées GPS comme des données confidentielles.
Utilisez le sélecteur système : PHPicker avec filter = .videos sur iOS, PickVisualMedia avec VideoOnly sur Android. Sur Android, vous pouvez également utiliser Intent(Intent.ACTION_PICK) avec MediaStore.Video.Media.EXTERNAL_CONTENT_URI pour sélectionner une vidéo de la galerie, mais cela nécessite l'autorisation READ_EXTERNAL_STORAGE sur les versions antérieures à Android 13.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi