Photo Library Permission — bazele, tipurile de acces și principiul de funcționare

Autor: IT Sectr Publicat: 2026-05-21 Timp de citire: 8 min

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 — permisiunea de citire și scriere a fișierelor media în galeria dispozitivului, obligatorie pentru lucrul cu fotografii și videoclipuri.
  • Android folosește READ_MEDIA_IMAGES, READ_MEDIA_VIDEO (Android 13+) sau READ_EXTERNAL_STORAGE pentru accesul la galerie.
  • iOS folosește PHPhotoLibrary cu acces limitat (Limited Photo Library Access) începând cu iOS 14.
  • Selectarea fotografiilor individuale prin pickerul de sistem (PhotoPicker) nu necesită permisiunea de acces la întreaga bibliotecă.
  • Scrierea în galerie necesită o permisiune separată de scriere (WRITE_EXTERNAL_STORAGE pe Android, PHPhotoLibrary pe iOS).

Bazele Photo Library Permission

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

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.

Permisiuni pe Android 13+

Î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:

xml
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

Compatibilitatea cu Android 12 și versiuni anterioare

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+.

xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="32" />

Solicitarea la runtime în Kotlin

Solicitarea la runtime pentru Photo Library Permission pe Android se realizează prin Activity Result API. Exemplu pentru solicitarea accesului la imagini:

kotlin
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

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).

Configurarea Info.plist

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.

xml
<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 în Swift

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.

swift
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
}

Gestionarea accesului limitat

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 vs permisiunea de sistem

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.

PhotoPicker pe Android

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.

kotlin
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))
}

PHPicker pe iOS

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.

swift
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)
}

Când este necesară permisiunea completă

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 acces la galerie

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.

Utilizați PhotoPicker în mod implicit

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.

Explicați motivul accesului complet

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.

Solicitați doar permisiunile necesare

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

Este necesară permisiunea pentru salvarea fotografiilor pe Android 10+?

Î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.

Cu ce diferă READ_EXTERNAL_STORAGE de READ_MEDIA_IMAGES?

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.

Cum se gestionează statusul .limited pe iOS?

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”.

Se pot citi metadatele EXIF din 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.

Cum se selectează un videoclip din galerie fără permisiune?

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

  • Photo Library Permission — permisiunea de citire și scriere a fișierelor media, obligatorie pentru aplicațiile care lucrează cu galeria dispozitivului.
  • Android 13+ folosește permisiunile granulare READ_MEDIA_IMAGES și READ_MEDIA_VIDEO în locul permisiunii unice READ_EXTERNAL_STORAGE.
  • iOS 14+ permite utilizatorului să acorde acces doar la fotografiile selectate (Limited) prin PhotoKit.
  • PhotoPicker — metoda recomandată pentru selectarea fișierelor individuale fără a solicita acces complet la bibliotecă.
  • Scrierea în galerie pe Android 10+ nu necesită permisiune prin MediaStore, pe iOS necesită NSPhotoLibraryAddUsageDescription.
  • Pre-permission screen cu explicarea scopului colectării fotografiilor crește rata de aprobare și reduce numărul de refuzuri.
  • Limited Access pe iOS necesită gestionare suplimentară și posibilitatea de a solicita extinderea accesului prin dialogul de sistem.

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.

Discutați proiectul

Citiți și