Photo Library Permission — är den behörighet som en app behöver för att få åtkomst till foton och videor som lagras på användarens enhet. Den krävs för att välja bilder från galleriet, spara mediafiler och hantera fotoalbum. Enligt Apple Developer Documentation, 2024 måste appar från och med iOS 14 begära åtkomst till ett begränsat bibliotek, inte till alla foton på en gång.
Huvudpunkter
Photo Library Permission — är systembehörigheten som reglerar en apps åtkomst till mediafiler som lagras på enheten. Den omfattar både läsning (visning och val av foton och videor) och skrivning (spara nya filer i galleriet). Mobila plattformar betraktar mediebiblioteket som konfidentiell data eftersom foton kan innehålla personlig och känslig information.
På Android 13 (API 33) delade Google upp den enda behörigheten READ_EXTERNAL_STORAGE i tre separata: READ_MEDIA_IMAGES för foton, READ_MEDIA_VIDEO för videor och READ_MEDIA_AUDIO för ljud. Detta gör att användaren kan ge åtkomst endast till en specifik typ av mediafiler. På iOS, från och med iOS 14, ger PhotoKit användaren möjlighet att välja specifika foton för åtkomst, istället för att öppna hela biblioteket.
Enligt Counterpoint Research (2024) begär över 70% av mobilapparna inom kategorierna sociala nätverk, kommunikation och fotoredigerare Photo Library Permission. Samtidigt nekar 32% av användarna åtkomst till galleriet om de inte förstår varför appen behöver deras foton. Apple och Google rekommenderar att använda systemets PhotoPicker för att välja enskilda filer utan att begära full åtkomst.
Åtkomst till galleriet på Android förändrades avsevärt med lanseringen av Android 13. Istället för en enda behörighet READ_EXTERNAL_STORAGE har granulära behörigheter för varje mediafiltyp införts, vilket ger användaren mer kontroll.
Från och med Android 13 används READ_MEDIA_IMAGES för åtkomst till foton och READ_MEDIA_VIDEO för videor. Behörigheten READ_EXTERNAL_STORAGE ger inte längre åtkomst till mediafiler — den finns kvar endast för läsning av icke-mediafiler från delad lagring. Deklarationen i manifestet ser ut så här:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
För bakåtkompatibilitet med Android 12 och äldre måste även READ_EXTERNAL_STORAGE deklareras. Android 13 ignorerar dock automatiskt denna behörighet när de nya granulära behörigheterna finns. Använd attributet android:maxSdkVersion="32" i manifestet för den gamla behörigheten för att dölja den på nya versioner. Detta förhindrar onödig begäran på enheter med Android 13+.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
Runtime-begäran för Photo Library Permission på Android utförs via Activity Result API. Exempel på begäran om åtkomst till bilder:
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)
}
}
Åtkomst till galleriet på iOS hanteras via PhotoKit-ramverket och nycklarna NSPhotoLibraryUsageDescription och NSPhotoLibraryAddUsageDescription i Info.plist. Från och med iOS 14 kan användaren ge åtkomst endast till valda foton (Limited Photo Library).
För läsning av foton från biblioteket krävs NSPhotoLibraryUsageDescription, för skrivning (spara foton) — NSPhotoLibraryAddUsageDescription. Om appen bara sparar media men inte läser dem räcker den andra nyckeln.
<key>NSPhotoLibraryUsageDescription</key>
<string>Appen behöver åtkomst till foton för att välja profilbild och publicera bilder.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Appen behöver åtkomst för att spara bearbetade foton i ditt galleri.</string>
Begäran om åtkomst till foton på iOS utförs via PHPhotoLibrary.requestAuthorization. Från och med iOS 14 anger statusen .limited att användaren har gett åtkomst till en begränsad uppsättning foton.
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)
// Arbeta med förfrågningsresultat
}
Statusen .limited på iOS 14+ innebär att användaren endast har gett åtkomst till några få valda foton. Appen kan begära utökad åtkomst via en systemdialog genom att anropa PHPhotoLibrary.shared().presentLimitedLibraryPicker. Det rekommenderas att visa denna dialog endast när användaren uttryckligen begär en funktion som kräver ytterligare foton.
PhotoPicker — är en systemkomponent för att välja mediafiler som inte kräver behörighet att få åtkomst till hela biblioteket. Från och med Android 13 och iOS 14 rekommenderar Google och Apple att använda PhotoPicker istället för att begära Photo Library Permission, om appen bara behöver välja ett eller några få foton.
På Android 13+ låter den inbyggda PhotoPicker (ActivityResultContracts.PickVisualMedia) användaren välja ett foto eller en video utan att ge åtkomst till hela galleriet. Appen får endast URI för de valda filerna. PhotoPicker fungerar utan att deklarera några behörigheter i manifestet.
private val pickMedia =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) {
// URI för den valda filen, utan åtkomst till hela biblioteket
showImage(uri)
}
}
fun selectPhoto() {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
På iOS 14+ introducerades PHPickerViewController — en systemväljare som inte heller kräver åtkomst till hela biblioteket. PHPicker fungerar i en separat process och har inte åtkomst till appens bibliotek. Detta är den föredragna metoden för att välja foton i de flesta scenarier.
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 är inte lämpligt om appen behöver åtkomst till hela biblioteket för massoperationer: säkerhetskopiering, synkronisering med molnet, galleriapp, filhanterare. I dessa fall måste Photo Library Permission begäras och fallet med begränsad åtkomst (Limited) hanteras. För iOS är det obligatoriskt att hantera statusen .limited och erbjuda användaren att utöka åtkomsten.
Bästa praxis för att arbeta med Photo Library Permission hjälper till att minska antalet avvisningar och uppfylla plattformarnas integritetskrav.
För att välja ett eller flera foton, använd systemets PhotoPicker eller PHPicker. Dessa komponenter kräver inga behörigheter och ger bästa användarupplevelse. Begär full åtkomst till galleriet endast om appens funktionalitet kräver åtkomst till hela mediebiblioteket. Google och Apple rekommenderar uttryckligen detta tillvägagångssätt i dokumentationen för utvecklare.
Om appen verkligen behöver full åtkomst till galleriet, visa en förberedande skärm med en förklaring. Förklara varför alla foton behövs, inte bara ett. Till exempel bör en säkerhetskopieringsapp förklara att den kommer att skanna alla mediafiler för att skapa en kopia. Pre-permission screen är särskilt viktig på iOS på grund av Limited Access-mekanismen.
Om appen bara sparar foton men inte läser dem (t.ex. en fotoredigerare som sparar resultatet), begär endast behörighet att skriva till galleriet. På Android är detta WRITE_EXTERNAL_STORAGE (för Android 12 och äldre) eller MediaStore API utan behörighet (för Android 10+). På iOS använder du NSPhotoLibraryAddUsageDescription utan NSPhotoLibraryUsageDescription.
Vanliga frågor
Från och med Android 10 (API 29) kräver sparande av foton via MediaStore inte behörigheten WRITE_EXTERNAL_STORAGE. Systemet ger åtkomst till delad lagring för skrivning utan uttrycklig behörighet. För att läsa andras filer krävs fortfarande motsvarande behörighet.
READ_EXTERNAL_STORAGE — gammal behörighet för att läsa alla filer från delad lagring (fram till Android 12). READ_MEDIA_IMAGES — ny granulär behörighet för att läsa endast bilder (Android 13+). Användaren kan ge åtkomst endast till foton och neka åtkomst till videor och ljud.
Statusen .limited innebär att användaren har valt några foton för åtkomst. Appen kan visa systemdialogrutan för utökning via PHPhotoLibrary.shared().presentLimitedLibraryPicker. Det rekommenderas att visa denna dialog endast på uttrycklig begäran av användaren, till exempel när knappen "Lägg till fler foton" trycks.
Ja, med Photo Library Permission kan appen läsa EXIF-data inklusive geotaggar, datum för tagning och kameramodell. På iOS kan ytterligare Location Permission krävas för åtkomst till geotaggar, eftersom Apple betraktar GPS-koordinater som konfidentiell data.
Använd systemväljaren: PHPicker med filter = .videos på iOS, PickVisualMedia med VideoOnly på Android. På Android kan man även använda Intent(Intent.ACTION_PICK) med MediaStore.Video.Media.EXTERNAL_CONTENT_URI för att välja en video från galleriet, men detta kräver behörigheten READ_EXTERNAL_STORAGE på versioner under Android 13.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också