Photo Library Permission — este permisiunea necesară aplicației pentru a accesa fotografiile și videoclipurile stocate pe dispozitivul utilizatorului. Este necesară pentru selectarea imaginilor din galerie, salvarea fișierelor media și gestionarea albumelor foto. Conform Apple Developer Documentation, 2024, începând cu iOS 14 aplicațiile trebuie să solicite acces la biblioteca limitată, nu la toate fotografiile simultan.
Puncte principale
Photo Library Permission — este permisiunea de sistem care reglementează accesul aplicației la fișierele media stocate pe dispozitiv. Acoperă atât citirea (vizualizarea și selectarea fotografiilor și videoclipurilor), cât și scrierea (salvarea fișierelor noi în galerie). Platformele mobile consideră biblioteca media ca date confidențiale, deoarece fotografiile pot conține informații personale și sensibile.
Pe Android 13 (API 33) Google a împărțit permisiunea unică READ_EXTERNAL_STORAGE în trei separate: READ_MEDIA_IMAGES pentru fotografii, READ_MEDIA_VIDEO pentru videoclipuri și READ_MEDIA_AUDIO pentru audio. Acest lucru permite utilizatorului să acorde acces doar la un anumit tip de fișiere media. Pe iOS, începând cu iOS 14, PhotoKit oferă utilizatorului posibilitatea de a selecta anumite fotografii pentru acces, în loc să deschidă întreaga bibliotecă.
Conform Counterpoint Research (2024), peste 70% dintre aplicațiile mobile din categoriile rețele sociale, comunicare și editoare foto solicită Photo Library Permission. În același timp, 32% dintre utilizatori refuză accesul la galerie dacă nu înțeleg de ce aplicația are nevoie de fotografiile lor. Apple și Google recomandă utilizarea PhotoPicker-ului de sistem pentru selectarea fișierelor individuale fără a solicita acces complet.
Accesul la galerie pe Android s-a schimbat semnificativ odată cu lansarea Android 13. În locul unei singure permisiuni READ_EXTERNAL_STORAGE, au apărut permisiuni granulare pentru fiecare tip de fișier media, oferind utilizatorului mai mult control.
Începând cu Android 13, pentru accesul la fotografii se folosește READ_MEDIA_IMAGES, iar pentru videoclipuri — READ_MEDIA_VIDEO. Permisiunea READ_EXTERNAL_STORAGE nu mai oferă acces la fișierele media — a rămas doar pentru citirea fișierelor non-media din stocarea partajată. Declarația în manifest arată astfel:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
Pentru compatibilitate inversă cu Android 12 și versiuni anterioare, trebuie declarat și READ_EXTERNAL_STORAGE. Cu toate acestea, Android 13 ignoră automat această permisiune în prezența noilor permisiuni granulare. Utilizați atributul android:maxSdkVersion="32" în manifest pentru permisiunea veche, pentru a o ascunde pe versiunile noi. Acest lucru previne solicitarea inutilă pe dispozitivele cu Android 13+.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
Solicitarea la runtime pentru Photo Library Permission pe Android se realizează prin Activity Result API. Exemplu pentru solicitarea accesului la imagini:
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)
}
}
Accesul la galerie pe iOS este gestionat prin framework-ul PhotoKit și cheile NSPhotoLibraryUsageDescription și NSPhotoLibraryAddUsageDescription din Info.plist. Începând cu iOS 14, utilizatorul poate acorda acces doar la fotografiile selectate (Limited Photo Library).
Pentru citirea fotografiilor din bibliotecă este necesar NSPhotoLibraryUsageDescription, iar pentru scriere (salvarea fotografiilor) — NSPhotoLibraryAddUsageDescription. Dacă aplicația doar salvează media, dar nu le citește, este suficientă a doua cheie.
<key>NSPhotoLibraryUsageDescription</key>
<string>Aplicația are nevoie de acces la fotografii pentru a selecta imaginea de profil și a publica imagini.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Aplicația are nevoie de acces pentru a salva fotografiile procesate în galeria dvs.</string>
Solicitarea accesului la fotografii pe iOS se realizează prin PHPhotoLibrary.requestAuthorization. Începând cu iOS 14, statusul .limited indică faptul că utilizatorul a acordat acces la un set limitat de fotografii.
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)
// Lucrul cu rezultatele solicitării
}
Statusul .limited pe iOS 14+ înseamnă că utilizatorul a oferit acces doar la câteva fotografii selectate. Aplicația poate solicita extinderea accesului prin dialogul de sistem, apelând PHPhotoLibrary.shared().presentLimitedLibraryPicker. Se recomandă afișarea acestui dialog doar atunci când utilizatorul solicită explicit o funcție care necesită fotografii suplimentare.
PhotoPicker — este o componentă de sistem pentru selectarea fișierelor media care nu necesită permisiunea de acces la întreaga bibliotecă. Începând cu Android 13 și iOS 14, Google și Apple recomandă utilizarea PhotoPicker în locul solicitării Photo Library Permission, dacă aplicația trebuie doar să selecteze una sau câteva fotografii.
Pe Android 13+, PhotoPicker-ul încorporat (ActivityResultContracts.PickVisualMedia) permite utilizatorului să selecteze o fotografie sau un videoclip fără a acorda acces la întreaga galerie. Aplicația primește doar URI-ul fișierelor selectate. PhotoPicker funcționează fără a declara vreo permisiune în manifest.
private val pickMedia =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) {
// URI-ul fișierului selectat, fără acces la întreaga bibliotecă
showImage(uri)
}
}
fun selectPhoto() {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
Pe iOS 14+ a apărut PHPickerViewController — un picker de sistem care, de asemenea, nu necesită acces la întreaga bibliotecă. PHPicker funcționează într-un proces separat și nu are acces la biblioteca aplicației. Aceasta este metoda preferată de selectare a fotografiilor pentru majoritatea scenariilor.
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 nu este potrivit dacă aplicația necesită acces la întreaga bibliotecă pentru operații în masă: backup, sincronizare cu cloudul, aplicație-galerie, manager de fișiere. În aceste cazuri, trebuie solicitată Photo Library Permission și gestionat cazul de acces limitat (Limited). Pentru iOS, este obligatorie gestionarea statusului .limited și oferirea utilizatorului posibilitatea de a extinde accesul.
Cele mai bune practici de lucru cu Photo Library Permission ajută la reducerea numărului de refuzuri și la respectarea cerințelor platformelor privind protejarea confidențialității.
Pentru selectarea uneia sau mai multor fotografii, utilizați PhotoPicker sau PHPicker de sistem. Aceste componente nu necesită permisiuni și oferă cea mai bună experiență de utilizare. Solicitați permisiunea completă de acces la galerie doar dacă funcționalitatea aplicației necesită acces la întreaga bibliotecă media. Google și Apple recomandă în mod explicit această abordare în documentația pentru dezvoltatori.
Dacă aplicația are într-adevăr nevoie de acces complet la galerie, afișați un ecran preliminar cu explicații. Explicați de ce sunt necesare toate fotografiile, nu doar una. De exemplu, o aplicație de backup ar trebui să explice că va scana toate fișierele media pentru a crea o copie. Pre-permission screen este deosebit de important pe iOS din cauza mecanismului Limited Access.
Dacă aplicația doar salvează fotografii, dar nu le citește (de exemplu, un editor foto care salvează rezultatul), solicitați doar permisiunea de scriere în galerie. Pe Android aceasta este WRITE_EXTERNAL_STORAGE (pentru Android 12 și versiuni anterioare) sau MediaStore API fără permisiuni (pentru Android 10+). Pe iOS, utilizați NSPhotoLibraryAddUsageDescription fără NSPhotoLibraryUsageDescription.
Întrebări frecvente
Începând cu Android 10 (API 29), salvarea fotografiilor prin MediaStore nu necesită permisiunea WRITE_EXTERNAL_STORAGE. Sistemul oferă acces la stocarea partajată pentru scriere fără permisiune explicită. Pentru citirea fișierelor altora este încă necesară permisiunea corespunzătoare.
READ_EXTERNAL_STORAGE — permisiunea veche pentru citirea tuturor fișierelor din stocarea partajată (până la Android 12). READ_MEDIA_IMAGES — noua permisiune granulară pentru citirea doar a imaginilor (Android 13+). Utilizatorul poate acorda acces doar la fotografii, refuzând accesul la videoclipuri și audio.
Statusul .limited înseamnă că utilizatorul a selectat câteva fotografii pentru acces. Aplicația poate afișa dialogul de sistem de extindere prin PHPhotoLibrary.shared().presentLimitedLibraryPicker. Se recomandă afișarea acestui dialog doar la solicitarea explicită a utilizatorului, de exemplu, la apăsarea butonului „Adăugați mai multe fotografii”.
Da, având Photo Library Permission, aplicația poate citi datele EXIF, inclusiv geotagurile, data capturii și modelul camerei. Pe iOS, pentru accesul la geotaguri poate fi necesară o Location Permission suplimentară, deoarece Apple consideră coordonatele GPS drept date confidențiale.
Utilizați pickerul de sistem: PHPicker cu filter = .videos pe iOS, PickVisualMedia cu VideoOnly pe Android. Pe Android, pentru selectarea unui videoclip din galerie se poate folosi și Intent(Intent.ACTION_PICK) cu MediaStore.Video.Media.EXTERNAL_CONTENT_URI, dar aceasta necesită permisiunea READ_EXTERNAL_STORAGE pe versiunile sub Android 13.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și