Photo Library Permission — je oprávnění potřebné pro aplikaci k přístupu k fotografiím a videím uloženým na zařízení uživatele. Je vyžadováno pro výběr obrázků z galerie, ukládání mediálních souborů a správu fotoalb. Podle Apple Developer Documentation, 2024, od iOS 14 musí aplikace žádat o přístup k omezené knihovně, nikoli ke všem fotkám najednou.
Hlavní body
Photo Library Permission — je systémové oprávnění, které reguluje přístup aplikace k mediálním souborům uloženým na zařízení. Pokrývá jak čtení (prohlížení a výběr fotografií a videí), tak zápis (ukládání nových souborů do galerie). Mobilní platformy považují mediální knihovnu za důvěrná data, protože fotografie mohou obsahovat osobní a citlivé informace.
Na Androidu 13 (API 33) Google rozdělil jediné oprávnění READ_EXTERNAL_STORAGE na tři samostatná: READ_MEDIA_IMAGES pro fotografie, READ_MEDIA_VIDEO pro videa a READ_MEDIA_AUDIO pro audio. To umožňuje uživateli poskytnout přístup pouze k určitému typu mediálních souborů. Na iOS, od iOS 14, PhotoKit poskytuje uživateli možnost vybrat konkrétní fotografie pro přístup, místo otevření celé knihovny.
Podle Counterpoint Research (2024), více než 70% mobilních aplikací v kategoriích sociálních sítí, komunikace a fotoeditorů žádá o Photo Library Permission. Přitom 32% uživatelů odepírá přístup do galerie, pokud nerozumí, proč aplikace potřebuje jejich fotografie. Apple a Google doporučují používat systémový PhotoPicker pro výběr jednotlivých souborů bez žádosti o plný přístup.
Přístup do galerie na Androidu se výrazně změnil s vydáním Android 13. Místo jednoho oprávnění READ_EXTERNAL_STORAGE se objevila granulární oprávnění pro každý typ mediálního souboru, což uživateli poskytuje větší kontrolu.
Od Android 13 se pro přístup k fotografiím používá READ_MEDIA_IMAGES, pro videa — READ_MEDIA_VIDEO. Oprávnění READ_EXTERNAL_STORAGE již neposkytuje přístup k mediálním souborům — zůstalo pouze pro čtení ne-mediálních souborů ze sdíleného úložiště. Deklarace v manifestu vypadá takto:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
Pro zpětnou kompatibilitu s Android 12 a nižšími je třeba deklarovat také READ_EXTERNAL_STORAGE. Android 13 však toto oprávnění automaticky ignoruje, pokud jsou přítomna nová granulární oprávnění. Použijte atribut android:maxSdkVersion="32" v manifestu pro staré oprávnění, abyste jej skryli na nových verzích. Tím se zabrání zbytečnému požadavku na zařízeních s Android 13+.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
Runtime žádost o Photo Library Permission na Androidu se provádí přes Activity Result API. Příklad žádosti o přístup k obrázkům:
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)
}
}
Přístup do galerie na iOS je řízen prostřednictvím frameworku PhotoKit a klíčů NSPhotoLibraryUsageDescription a NSPhotoLibraryAddUsageDescription v Info.plist. Od iOS 14 může uživatel poskytnout přístup pouze k vybraným fotografiím (Limited Photo Library).
Pro čtení fotografií z knihovny je vyžadován NSPhotoLibraryUsageDescription, pro zápis (ukládání fotografií) — NSPhotoLibraryAddUsageDescription. Pokud aplikace pouze ukládá média, ale nečte je, stačí druhý klíč.
<key>NSPhotoLibraryUsageDescription</key>
<string>Aplikace potřebuje přístup k fotografiím pro výběr profilového obrázku a publikování snímků.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Aplikace potřebuje přístup pro uložení zpracovaných fotografií do vaší galerie.</string>
Žádost o přístup k fotografiím na iOS se provádí přes PHPhotoLibrary.requestAuthorization. Od iOS 14 stav .limited označuje, že uživatel poskytl přístup k omezené sadě fotografií.
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)
// Práce s výsledky požadavku
}
Stav .limited na iOS 14+ znamená, že uživatel poskytl přístup pouze k několika vybraným fotografiím. Aplikace může požádat o rozšíření přístupu prostřednictvím systémového dialogu voláním PHPhotoLibrary.shared().presentLimitedLibraryPicker. Doporučuje se zobrazovat tento dialog pouze tehdy, když uživatel výslovně požádá o funkci, která vyžaduje další fotografie.
PhotoPicker — je systémová komponenta pro výběr mediálních souborů, která nevyžaduje oprávnění k přístupu do celé knihovny. Od Android 13 a iOS 14 Google a Apple doporučují používat PhotoPicker místo žádosti o Photo Library Permission, pokud aplikace potřebuje pouze vybrat jednu nebo několik fotografií.
Na Android 13+ vestavěný PhotoPicker (ActivityResultContracts.PickVisualMedia) umožňuje uživateli vybrat fotografii nebo video bez poskytnutí přístupu do celé galerie. Aplikace obdrží pouze URI vybraných souborů. PhotoPicker funguje bez deklarování jakýchkoli oprávnění v manifestu.
private val pickMedia =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) {
// URI vybraného souboru, bez přístupu k celé knihovně
showImage(uri)
}
}
fun selectPhoto() {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
Na iOS 14+ se objevil PHPickerViewController — systémový výběr, který také nevyžaduje přístup do celé knihovny. PHPicker pracuje v samostatném procesu a nemá přístup ke knihovně aplikace. Toto je preferovaný způsob výběru fotografií pro většinu scénářů.
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 není vhodný, pokud aplikace potřebuje přístup do celé knihovny pro hromadné operace: zálohování, synchronizace s cloudem, galerijní aplikace, správce souborů. V těchto případech je třeba žádat o Photo Library Permission a zpracovat případ omezeného přístupu (Limited). Pro iOS je povinné přidat zpracování stavu .limited a nabídnout uživateli rozšíření přístupu.
Nejlepší postupy práce s Photo Library Permission pomáhají snížit počet odmítnutí a splnit požadavky platforem na ochranu soukromí.
Pro výběr jedné nebo více fotografií používejte systémový PhotoPicker nebo PHPicker. Tyto komponenty nevyžadují oprávnění a poskytují nejlepší uživatelský zážitek. Plné oprávnění k přístupu do galerie požadujte pouze v případě, že funkčnost aplikace vyžaduje přístup k celé mediální knihovně. Google a Apple výslovně doporučují tento přístup v dokumentaci pro vývojáře.
Pokud aplikace skutečně potřebuje plný přístup do galerie, zobrazte předběžnou obrazovku s vysvětlením. Vysvětlete, proč jsou potřeba všechny fotografie, ne jen jedna. Například zálohovací aplikace by měla vysvětlit, že bude skenovat všechny mediální soubory pro vytvoření kopie. Pre-permission screen je obzvláště důležitý na iOS kvůli mechanismu Limited Access.
Pokud aplikace pouze ukládá fotografie, ale nečte je (např. fotoeditor, který ukládá výsledek), žádejte pouze oprávnění k zápisu do galerie. Na Androidu je to WRITE_EXTERNAL_STORAGE (pro Android 12 a nižší) nebo MediaStore API bez oprávnění (pro Android 10+). Na iOS používejte NSPhotoLibraryAddUsageDescription bez NSPhotoLibraryUsageDescription.
Často kladené otázky
Od Android 10 (API 29) ukládání fotografií přes MediaStore nevyžaduje oprávnění WRITE_EXTERNAL_STORAGE. Systém poskytuje přístup ke sdílenému úložišti pro zápis bez explicitního oprávnění. Pro čtení cizích souborů je stále vyžadováno odpovídající oprávnění.
READ_EXTERNAL_STORAGE — staré oprávnění pro čtení všech souborů ze sdíleného úložiště (do Android 12). READ_MEDIA_IMAGES — nové granulární oprávnění pro čtení pouze obrázků (Android 13+). Uživatel může poskytnout přístup pouze k fotografiím a odepřít přístup k videím a audiu.
Stav .limited znamená, že uživatel vybral několik fotografií pro přístup. Aplikace může zobrazit systémový dialog rozšíření přes PHPhotoLibrary.shared().presentLimitedLibraryPicker. Doporučuje se zobrazovat tento dialog pouze na výslovnou žádost uživatele, například při kliknutí na tlačítko „Přidat další fotografie".
Ano, s Photo Library Permission může aplikace číst EXIF data včetně geotagů, data pořízení a modelu fotoaparátu. Na iOS může být pro přístup ke geotagům vyžadována dodatečná Location Permission, protože Apple považuje GPS souřadnice za důvěrná data.
Použijte systémový výběr: PHPicker s filter = .videos na iOS, PickVisualMedia s VideoOnly na Androidu. Na Androidu lze pro výběr videa z galerie také použít Intent(Intent.ACTION_PICK) s MediaStore.Video.Media.EXTERNAL_CONTENT_URI, ale to vyžaduje oprávnění READ_EXTERNAL_STORAGE na verzích nižších než Android 13.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také