Photo Library Permission — základy, typy přístupu a princip fungování

Autor: IT Sectr Publikováno: 2026-05-21 Doba čtení: 8 min

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 — oprávnění ke čtení a zápisu mediálních souborů v galerii zařízení, povinné pro práci s fotografiemi a videem.
  • Android používá READ_MEDIA_IMAGES, READ_MEDIA_VIDEO (Android 13+) nebo READ_EXTERNAL_STORAGE pro přístup do galerie.
  • iOS používá PHPhotoLibrary s omezeným přístupem (Limited Photo Library Access) od iOS 14.
  • Výběr jednotlivých fotek přes systémový výběr (PhotoPicker) nevyžaduje oprávnění k přístupu do celé knihovny.
  • Zápis do galerie vyžaduje samostatné oprávnění k zápisu (WRITE_EXTERNAL_STORAGE na Androidu, PHPhotoLibrary na iOS).

Základy Photo Library Permission

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

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.

Oprávnění na Android 13+

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:

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

Kompatibilita s Android 12 a nižšími

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

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

Runtime žádost v Kotlin

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:

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

Přístup do galerie na iOS

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

Konfigurace Info.plist

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íč.

xml
<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 ve Swift

Žá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í.

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)
    // Práce s výsledky požadavku
}

Zpracování omezeného přístupu

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 vs systémové oprávnění

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

PhotoPicker na Androidu

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.

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

PHPicker na iOS

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ářů.

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

Kdy je potřeba plné oprávnění

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 přístupu do galerie

Nejlepší postupy práce s Photo Library Permission pomáhají snížit počet odmítnutí a splnit požadavky platforem na ochranu soukromí.

Používejte PhotoPicker ve výchozím nastavení

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.

Vysvětlete důvod plného přístupu

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.

Žádejte pouze nezbytná oprávnění

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

Je potřeba oprávnění pro ukládání fotografií na Android 10+?

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

Čím se liší READ_EXTERNAL_STORAGE od READ_MEDIA_IMAGES?

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.

Jak zpracovat stav .limited na iOS?

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

Lze číst EXIF metadata z fotografií?

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.

Jak vybrat video z galerie bez oprávnění?

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í

  • Photo Library Permission — oprávnění ke čtení a zápisu mediálních souborů, povinné pro aplikace pracující s galerií zařízení.
  • Android 13+ používá granulární oprávnění READ_MEDIA_IMAGES a READ_MEDIA_VIDEO místo jediného READ_EXTERNAL_STORAGE.
  • iOS 14+ umožňuje uživateli poskytnout přístup pouze k vybraným fotografiím (Limited) přes PhotoKit.
  • PhotoPicker — doporučený způsob výběru jednotlivých souborů bez žádosti o plný přístup do knihovny.
  • Zápis do galerie na Android 10+ nevyžaduje oprávnění přes MediaStore, na iOS vyžaduje NSPhotoLibraryAddUsageDescription.
  • Pre-permission screen s vysvětlením účelu sběru fotografií zvyšuje míru schválení a snižuje počet odmítnutí.
  • Limited Access na iOS vyžaduje dodatečné zpracování a možnost požádat o rozšíření přístupu prostřednictvím systémového dialogu.

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

Prodiskutovat projekt

Přečtěte si také