Photo Library Permission — alapok, hozzáférési típusok és működési elv

Szerző: IT Sectr Megjelenés: 2026-05-21 Olvasási idő: 8 perc

Photo Library Permission — ez az engedély, amelyre az alkalmazásnak szüksége van a felhasználó eszközén tárolt fényképek és videók eléréséhez. Szükséges képek kiválasztásához a galériából, médiafájlok mentéséhez és fotóalbumok kezeléséhez. A Apple Developer Documentation, 2024 szerint iOS 14-től kezdve az alkalmazásoknak korlátozott könyvtárhoz kell hozzáférést kérniük, nem az összes fényképhez egyszerre.

Főbb pontok

  • Photo Library Permission — engedély médiafájlok olvasásához és írásához az eszköz galériájában, kötelező a fényképekkel és videókkal való munkához.
  • Android a READ_MEDIA_IMAGES, READ_MEDIA_VIDEO (Android 13+) vagy READ_EXTERNAL_STORAGE használja a galéria eléréséhez.
  • iOS a PHPhotoLibrary-t használja korlátozott hozzáféréssel (Limited Photo Library Access) iOS 14-től kezdve.
  • Egyedi fényképek kiválasztása a rendszer választón (PhotoPicker) keresztül nem igényel engedélyt a teljes könyvtár eléréséhez.
  • Írás a galériába külön írási engedélyt igényel (WRITE_EXTERNAL_STORAGE Androidon, PHPhotoLibrary iOS-en).

A Photo Library Permission alapjai

Photo Library Permission — ez a rendszerengedély, amely szabályozza az alkalmazás hozzáférését az eszközön tárolt médiafájlokhoz. Lefedi mind az olvasást (fényképek és videók megtekintése és kiválasztása), mind az írást (új fájlok mentése a galériába). A mobil platformok a médiakönyvtárat bizalmas adatként kezelik, mivel a fényképek személyes és érzékeny információkat tartalmazhatnak.

Android 13-on (API 33) a Google három részre osztotta az egységes READ_EXTERNAL_STORAGE engedélyt: READ_MEDIA_IMAGES a fényképekhez, READ_MEDIA_VIDEO a videókhoz és READ_MEDIA_AUDIO a hangfájlokhoz. Ez lehetővé teszi a felhasználó számára, hogy csak egy adott médiafájltípushoz adjon hozzáférést. iOS-en, iOS 14-től kezdve, a PhotoKit lehetőséget ad a felhasználónak, hogy meghatározott fényképeket válasszon ki a hozzáféréshez, ahelyett, hogy a teljes könyvtárat megnyitná.

A Counterpoint Research (2024) szerint a mobilalkalmazások több mint 70%-a a közösségi hálózatok, kommunikáció és fotószerkesztők kategóriákban kér Photo Library Permission-t. Ugyanakkor a felhasználók 32%-a megtagadja a hozzáférést a galériához, ha nem érti, miért van szüksége az alkalmazásnak a fényképeire. Az Apple és a Google a rendszer PhotoPicker használatát ajánlja az egyes fájlok kiválasztásához anélkül, hogy teljes hozzáférést kérne.

Hozzáférés a galériához Androidon

Hozzáférés a galériához Androidon jelentősen megváltozott az Android 13 megjelenésével. Az egyetlen READ_EXTERNAL_STORAGE engedély helyett granularis engedélyek jelentek meg minden médiafájltípushoz, ami nagyobb ellenőrzést biztosít a felhasználónak.

Engedélyek Android 13+ rendszeren

Android 13-tól kezdve a fényképek eléréséhez a READ_MEDIA_IMAGES, a videókhoz a READ_MEDIA_VIDEO használatos. A READ_EXTERNAL_STORAGE engedély már nem biztosít hozzáférést a médiafájlokhoz — csak a nem média fájlok olvasására maradt a megosztott tárhelyről. A deklaráció a manifestben így néz ki:

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

Kompatibilitás Android 12 és régebbi verziókkal

A visszafelé kompatibilitás érdekében Android 12 és régebbi verziókkal a READ_EXTERNAL_STORAGE-t is deklarálni kell. Az Android 13 azonban automatikusan figyelmen kívül hagyja ezt az engedélyt, ha az új granularis engedélyek jelen vannak. Használja a android:maxSdkVersion="32" attribútumot a manifestben a régi engedélyhez, hogy elrejtse az új verziókon. Ez megakadályozza a felesleges kérést Android 13+ eszközökön.

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

Runtime kérés Kotlinban

A runtime kérés a Photo Library Permission-hoz Androidon az Activity Result API-n keresztül történik. Példa a képek elérésének kérésére:

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

Hozzáférés a galériához iOS-en

Hozzáférés a galériához iOS-en a PhotoKit keretrendszeren és az NSPhotoLibraryUsageDescription valamint NSPhotoLibraryAddUsageDescription kulcsokon keresztül történik az Info.plist-ben. iOS 14-től kezdve a felhasználó csak a kiválasztott fényképekhez adhat hozzáférést (Limited Photo Library).

Info.plist konfiguráció

A fényképek olvasásához a könyvtárból NSPhotoLibraryUsageDescription szükséges, az íráshoz (fényképek mentése) — NSPhotoLibraryAddUsageDescription. Ha az alkalmazás csak médiát ment, de nem olvas, a második kulcs elegendő.

xml
<key>NSPhotoLibraryUsageDescription</key>
<string>Az alkalmazásnak hozzáférésre van szüksége a fényképekhez a profil kép kiválasztásához és képek közzétételéhez.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Az alkalmazásnak hozzáférésre van szüksége a feldolgozott fényképek elmentéséhez az Ön galériájába.</string>

Kérés Swiftben

A fényképek elérésének kérése iOS-en a PHPhotoLibrary.requestAuthorization-on keresztül történik. iOS 14-től kezdve a .limited állapot azt jelzi, hogy a felhasználó korlátozott fényképkészlethez adott hozzáférést.

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)
    // Munka a kérés eredményeivel
}

Korlátozott hozzáférés kezelése

A .limited állapot iOS 14+ rendszeren azt jelenti, hogy a felhasználó csak néhány kiválasztott fényképhez adott hozzáférést. Az alkalmazás kérheti a hozzáférés kiterjesztését a rendszer párbeszédablakán keresztül a PHPhotoLibrary.shared().presentLimitedLibraryPicker meghívásával. Ajánlott ezt a párbeszédablakot csak akkor megjeleníteni, amikor a felhasználó kifejezetten olyan funkciót kér, amelyhez további fényképek szükségesek.

PhotoPicker vs rendszerengedély

PhotoPicker — egy rendszerkomponens a médiafájlok kiválasztásához, amely nem igényel engedélyt a teljes könyvtár eléréséhez. Android 13 és iOS 14 óta a Google és az Apple a PhotoPicker használatát ajánlja a Photo Library Permission kérése helyett, ha az alkalmazásnak csak egy vagy néhány fényképet kell kiválasztania.

PhotoPicker Androidon

Android 13+ rendszeren a beépített PhotoPicker (ActivityResultContracts.PickVisualMedia) lehetővé teszi a felhasználónak, hogy fényképet vagy videót válasszon anélkül, hogy hozzáférést adna a teljes galériához. Az alkalmazás csak a kiválasztott fájlok URI-ját kapja meg. A PhotoPicker a manifestben való engedély deklarálása nélkül működik.

kotlin
private val pickMedia =
    registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
    if (uri != null) {
        // A kiválasztott fájl URI-ja, hozzáférés nélkül a teljes könyvtárhoz
        showImage(uri)
    }
}

fun selectPhoto() {
    pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}

PHPicker iOS-en

iOS 14+ rendszeren megjelent a PHPickerViewController — egy rendszerválasztó, amely szintén nem igényel hozzáférést a teljes könyvtárhoz. A PHPicker külön folyamatban működik, és nincs hozzáférése az alkalmazás könyvtárához. Ez az előnyben részesített módja a fényképek kiválasztásának a legtöbb forgatókönyvben.

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

Mikor van szükség teljes engedélyre

A PhotoPicker nem alkalmas, ha az alkalmazásnak a teljes könyvtárhoz kell hozzáférnie tömeges műveletekhez: biztonsági mentés, felhővel való szinkronizálás, galéria alkalmazás, fájlkezelő. Ezekben az esetekben Photo Library Permission-t kell kérni és kezelni a korlátozott hozzáférés (Limited) esetét. iOS esetén kötelező a .limited állapot kezelése és a hozzáférés kiterjesztésének felajánlása a felhasználónak.

Legjobb gyakorlatok a galéria eléréséhez

Legjobb gyakorlatok a Photo Library Permission-nal való munkához segítenek csökkenteni az elutasítások számát és megfelelni a platformok adatvédelmi követelményeinek.

Alapértelmezetten használja a PhotoPicker-t

Egy vagy több fénykép kiválasztásához használja a rendszer PhotoPicker vagy PHPicker komponensét. Ezek a komponensek nem igényelnek engedélyt és a legjobb felhasználói élményt nyújtják. Teljes hozzáférést a galériához csak akkor kérjen, ha az alkalmazás funkcionalitása megköveteli a teljes médiakönyvtár elérését. A Google és az Apple kifejezetten ajánlja ezt a megközelítést a fejlesztői dokumentációban.

Magyarázza el a teljes hozzáférés okát

Ha az alkalmazásnak valóban teljes hozzáférésre van szüksége a galériához, jelenítsen meg egy előzetes képernyőt magyarázattal. Magyarázza el, miért van szükség az összes fényképre, nem csak egyre. Például egy biztonsági mentés alkalmazásnak el kell magyaráznia, hogy az összes médiafájlt be fogja szkennelni a másolat készítéséhez. A Pre-permission screen különösen fontos iOS-en a Limited Access mechanizmus miatt.

Csak a szükséges engedélyeket kérje

Ha az alkalmazás csak fényképeket ment, de nem olvas (pl. fotószerkesztő, amely elmenti az eredményt), csak a galériába írási engedélyt kérjen. Androidon ez WRITE_EXTERNAL_STORAGE (Android 12 és régebbi verziók esetén) vagy MediaStore API engedély nélkül (Android 10+ esetén). iOS-en használja az NSPhotoLibraryAddUsageDescription-t NSPhotoLibraryUsageDescription nélkül.

Gyakran ismételt kérdések

Szükséges-e engedély a fényképek mentéséhez Android 10+ rendszeren?

Android 10-től (API 29) kezdve a fényképek MediaStore-on keresztüli mentése nem igényel WRITE_EXTERNAL_STORAGE engedélyt. A rendszer hozzáférést biztosít a megosztott tárhelyhez írásra kifejezett engedély nélkül. Mások fájljainak olvasásához továbbra is szükség van a megfelelő engedélyre.

Miben különbözik a READ_EXTERNAL_STORAGE a READ_MEDIA_IMAGES-től?

READ_EXTERNAL_STORAGE — régi engedély az összes fájl olvasásához a megosztott tárhelyről (Android 12-ig). READ_MEDIA_IMAGES — új granularis engedély csak képek olvasásához (Android 13+). A felhasználó csak a fényképekhez adhat hozzáférést, megtagadva a hozzáférést a videókhoz és a hangfájlokhoz.

Hogyan kezeljük a .limited állapotot iOS-en?

A .limited állapot azt jelenti, hogy a felhasználó néhány fényképet választott ki a hozzáféréshez. Az alkalmazás megjelenítheti a rendszer kiterjesztési párbeszédablakát a PHPhotoLibrary.shared().presentLimitedLibraryPicker hívásával. Ajánlott ezt a párbeszédablakot csak a felhasználó kifejezett kérésére megjeleníteni, például a "További fényképek hozzáadása" gomb megnyomásakor.

Lehet-e EXIF metaadatokat olvasni a fényképekből?

Igen, Photo Library Permission birtokában az alkalmazás olvashatja az EXIF adatokat, beleértve a geocímkéket, a felvétel dátumát és a kamera modelljét. iOS-en a geocímkék eléréséhez további Location Permission lehet szükséges, mivel az Apple a GPS koordinátákat bizalmas adatnak tekinti.

Hogyan válasszunk videót a galériából engedély nélkül?

Használja a rendszer választót: PHPicker filter = .videos paraméterrel iOS-en, PickVisualMedia VideoOnly paraméterrel Androidon. Androidon a galériából videó kiválasztásához használható az Intent(Intent.ACTION_PICK) MediaStore.Video.Media.EXTERNAL_CONTENT_URI-val is, de ez READ_EXTERNAL_STORAGE engedélyt igényel Android 13 alatti verziókon.

Összefoglalás

  • Photo Library Permission — engedély médiafájlok olvasásához és írásához, kötelező az eszköz galériájával dolgozó alkalmazások számára.
  • Android 13+ granularis READ_MEDIA_IMAGES és READ_MEDIA_VIDEO engedélyeket használ az egységes READ_EXTERNAL_STORAGE helyett.
  • iOS 14+ lehetővé teszi a felhasználónak, hogy csak a kiválasztott fényképekhez adjon hozzáférést (Limited) a PhotoKit-en keresztül.
  • PhotoPicker — ajánlott módszer az egyes fájlok kiválasztásához anélkül, hogy teljes hozzáférést kérne a könyvtárhoz.
  • Írás a galériába Android 10+ rendszeren nem igényel engedélyt a MediaStore-on keresztül, iOS-en NSPhotoLibraryAddUsageDescription-t igényel.
  • Pre-permission screen a fényképgyűjtés céljának magyarázatával növeli a jóváhagyási arányt és csökkenti az elutasítások számát.
  • Limited Access iOS-en további kezelést és a hozzáférés kiterjesztésének lehetőségét igényli a rendszer párbeszédablakán keresztül.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is