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 — 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 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.
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:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
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.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
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:
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 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).
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ő.
<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>
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.
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
}
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 — 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.
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.
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))
}
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.
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)
}
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 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.
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.
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.
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
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.
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.
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.
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.
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
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.
Olvassa el is