Photo Library Permission è un'autorizzazione necessaria per un'app per accedere a foto e video memorizzati sul dispositivo dell'utente. È richiesta per selezionare immagini dalla galleria, salvare file multimediali e gestire album fotografici. Secondo Apple Developer Documentation, 2024, a partire da iOS 14, le app devono richiedere l'accesso a una libreria limitata, non a tutte le foto in una volta.
Punti Chiave
Photo Library Permission è un'autorizzazione di sistema che regola l'accesso di un'app ai file multimediali memorizzati sul dispositivo. Copre sia la lettura (visualizzazione e selezione di foto e video) che la scrittura (salvataggio di nuovi file nella galleria). Le piattaforme mobili considerano la libreria multimediale come dati sensibili perché le foto possono contenere informazioni personali e private.
Su Android 13 (API 33), Google ha suddiviso l'autorizzazione unica READ_EXTERNAL_STORAGE in tre separate: READ_MEDIA_IMAGES per le foto, READ_MEDIA_VIDEO per i video e READ_MEDIA_AUDIO per l'audio. Ciò consente agli utenti di concedere l'accesso solo a un tipo specifico di file multimediale. Su iOS, a partire da iOS 14, PhotoKit consente agli utenti di selezionare foto specifiche per l'accesso invece di aprire l'intera libreria.
Secondo Counterpoint Research (2024), oltre il 70% delle app mobili nelle categorie di social network, comunicazione e editor fotografici richiedono Photo Library Permission. Allo stesso tempo, il 32% degli utenti nega l'accesso alla galleria se non capisce perché l'app ha bisogno delle loro foto. Apple e Google raccomandano di utilizzare il PhotoPicker di sistema per selezionare file individuali senza richiedere l'accesso completo.
L'accesso alla galleria su Android è cambiato significativamente con il rilascio di Android 13. Invece di un'unica autorizzazione READ_EXTERNAL_STORAGE, sono state introdotte autorizzazioni granulari per ogni tipo di supporto, dando agli utenti più controllo.
A partire da Android 13, READ_MEDIA_IMAGES viene utilizzato per l'accesso alle foto e READ_MEDIA_VIDEO per l'accesso ai video. L'autorizzazione READ_EXTERNAL_STORAGE non fornisce più accesso ai file multimediali — viene mantenuta solo per leggere file non multimediali dall'archivio condiviso. La dichiarazione nel manifest è la seguente:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
Per la compatibilità con le versioni precedenti di Android 12 e inferiori, è necessario dichiarare anche READ_EXTERNAL_STORAGE. Tuttavia, Android 13 ignora automaticamente questa autorizzazione quando sono presenti quelle granulari più nuove. Utilizzare l'attributo android:maxSdkVersion="32" nel manifest per l'autorizzazione precedente per nasconderla sulle versioni più recenti. Ciò previene richieste ridondanti sui dispositivi con Android 13+.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
La richiesta in fase di esecuzione per Photo Library Permission su Android viene eseguita tramite Activity Result API. Esempio per richiedere l'accesso alle immagini:
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'accesso alla galleria su iOS è gestito tramite il framework PhotoKit e le chiavi NSPhotoLibraryUsageDescription e NSPhotoLibraryAddUsageDescription in Info.plist. A partire da iOS 14, gli utenti possono concedere l'accesso solo a foto selezionate (Limited Photo Library).
La lettura di foto dalla libreria richiede NSPhotoLibraryUsageDescription, mentre la scrittura (salvataggio di foto) richiede NSPhotoLibraryAddUsageDescription. Se l'app salva solo media ma non li legge, la seconda chiave è sufficiente.
<key>NSPhotoLibraryUsageDescription</key>
<string>L'app ha bisogno di accedere alle foto per selezionare un'immagine del profilo e pubblicare istantanee.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>L'app ha bisogno di accesso per salvare le foto elaborate nella tua galleria.</string>
La richiesta di accesso alle foto su iOS viene eseguita tramite PHPhotoLibrary.requestAuthorization. A partire da iOS 14, lo stato .limited indica che l'utente ha concesso l'accesso a un insieme limitato di foto.
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)
// Gestione dei risultati della richiesta
}
Lo stato .limited su iOS 14+ significa che l'utente ha concesso l'accesso solo ad alcune foto selezionate. L'app può richiedere un accesso esteso tramite un dialogo di sistema chiamando PHPhotoLibrary.shared().presentLimitedLibraryPicker. Si consiglia di mostrare questo dialogo solo quando l'utente richiede esplicitamente una funzionalità che richiede foto aggiuntive.
PhotoPicker è un componente di sistema per la selezione di file multimediali che non richiede l'autorizzazione per accedere all'intera libreria. A partire da Android 13 e iOS 14, Google e Apple raccomandano di utilizzare PhotoPicker invece di richiedere Photo Library Permission se l'app deve solo selezionare una o più foto.
Su Android 13+, il PhotoPicker integrato (ActivityResultContracts.PickVisualMedia) consente agli utenti di selezionare una foto o un video senza concedere l'accesso all'intera galleria. L'app riceve solo l'URI dei file selezionati. PhotoPicker funziona senza dichiarare alcuna autorizzazione nel manifest.
private val pickMedia =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) {
// URI del file selezionato, senza accesso all'intera libreria
showImage(uri)
}
}
fun selectPhoto() {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
Su iOS 14+ è stato introdotto PHPickerViewController — un selettore di sistema che anch'esso non richiede l'accesso all'intera libreria. PHPicker viene eseguito in un processo separato e non ha accesso alla libreria dell'app. Questo è il metodo preferito per selezionare le foto nella maggior parte degli scenari.
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 non è adatto se l'app ha bisogno di accedere all'intera libreria per operazioni di massa: backup, sincronizzazione cloud, app galleria, gestore file. In questi casi, è necessario richiedere Photo Library Permission e gestire il caso di accesso limitato (Limited). Per iOS, è obbligatorio includere la gestione dello stato .limited e offrire agli utenti l'opzione di estendere l'accesso.
Le migliori pratiche per lavorare con Photo Library Permission aiutano a ridurre il numero di rifiuti e a rispettare i requisiti di privacy delle piattaforme.
Per selezionare una o più foto, utilizzare il PhotoPicker o PHPicker di sistema. Questi componenti non richiedono autorizzazioni e offrono la migliore esperienza utente. Richiedere l'accesso completo alla galleria solo se la funzionalità dell'app richiede l'accesso all'intera libreria multimediale. Google e Apple raccomandano esplicitamente questo approccio nella loro documentazione per sviluppatori.
Se l'app ha realmente bisogno dell'accesso completo alla galleria, mostrare una schermata preliminare con una spiegazione. Spiegare perché sono necessarie tutte le foto e non solo una. Ad esempio, un'app di backup dovrebbe spiegare che scannerizzerà tutti i file multimediali per creare una copia. La schermata di pre-autorizzazione è particolarmente importante per iOS a causa del meccanismo di Accesso Limitato.
Se l'app salva solo foto ma non le legge (ad esempio, un editor di foto che salva il risultato), richiedere solo l'autorizzazione di scrittura nella galleria. Su Android, questo è WRITE_EXTERNAL_STORAGE (per Android 12 e versioni precedenti) o l'API MediaStore senza autorizzazioni (per Android 10+). Su iOS, utilizzare NSPhotoLibraryAddUsageDescription senza NSPhotoLibraryUsageDescription.
Domande Frequenti
A partire da Android 10 (API 29), il salvataggio di foto tramite MediaStore non richiede l'autorizzazione WRITE_EXTERNAL_STORAGE. Il sistema fornisce l'accesso all'archivio condiviso per la scrittura senza un'autorizzazione esplicita. La lettura dei file di altri utenti richiede ancora l'autorizzazione appropriata.
READ_EXTERNAL_STORAGE è la vecchia autorizzazione per leggere tutti i file dall'archivio condiviso (fino ad Android 12). READ_MEDIA_IMAGES è una nuova autorizzazione granulare per leggere solo immagini (Android 13+). Gli utenti possono concedere l'accesso solo alle foto, negando l'accesso a video e audio.
Lo stato .limited significa che l'utente ha selezionato alcune foto per l'accesso. L'app può visualizzare un dialogo di estensione del sistema tramite PHPhotoLibrary.shared().presentLimitedLibraryPicker. Si consiglia di mostrare questo dialogo solo su richiesta esplicita dell'utente, ad esempio, toccando un pulsante “Aggiungi altre foto”.
Sì, con Photo Library Permission, l'app può leggere i dati EXIF, inclusi geotag, data di scatto e modello della fotocamera. Su iOS, l'accesso ai geotag potrebbe richiedere un'autorizzazione di posizione aggiuntiva, poiché Apple considera le coordinate GPS come dati riservati.
Utilizzare il selettore di sistema: PHPicker con filter = .videos su iOS, PickVisualMedia con VideoOnly su Android. Su Android, è anche possibile utilizzare Intent(Intent.ACTION_PICK) con MediaStore.Video.Media.EXTERNAL_CONTENT_URI per selezionare un video dalla galleria, ma questo richiede l'autorizzazione READ_EXTERNAL_STORAGE sulle versioni precedenti ad Android 13.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche