Photo Library Permission, bir uygulamanın kullanıcının cihazında depolanan fotoğraflara ve videolara erişmesi için gereken bir izindir. Galeriden görsel seçmek, medya dosyalarını kaydetmek ve fotoğraf albümlerini yönetmek için gereklidir. Apple Developer Documentation, 2024'e göre, iOS 14'ten itibaren uygulamalar tüm fotoğraflara aynı anda değil, sınırlı bir kitaplığa erişim talep etmelidir.
Önemli Noktalar
Photo Library Permission, bir uygulamanın cihazda depolanan medya dosyalarına erişimini düzenleyen bir sistem iznidir. Hem okumayı (fotoğraf ve videoları görüntüleme ve seçme) hem de yazmayı (galeriye yeni dosyalar kaydetme) kapsar. Mobil platformlar, fotoğraflar kişisel ve özel bilgiler içerebileceğinden medya kitaplığını hassas veri olarak kabul eder.
Android 13'te (API 33), Google tek READ_EXTERNAL_STORAGE iznini üç ayrı izne böldü: READ_MEDIA_IMAGES fotoğraflar için, READ_MEDIA_VIDEO videolar için ve READ_MEDIA_AUDIO ses için. Bu, kullanıcıların yalnızca belirli bir medya dosyası türüne erişim vermesini sağlar. iOS'te, iOS 14'ten itibaren PhotoKit, kullanıcıların tüm kitaplığı açmak yerine belirli fotoğrafları seçerek erişmesine olanak tanır.
Counterpoint Research (2024)'e göre, sosyal ağlar, iletişim ve fotoğraf düzenleyici kategorilerindeki mobil uygulamaların %70'inden fazlası Photo Library Permission talep eder. Aynı zamanda, kullanıcıların %32'si, uygulamanın neden fotoğraflarına ihtiyaç duyduğunu anlamazlarsa galeri erişimini reddeder. Apple ve Google, tam erişim talep etmeden bireysel dosyaları seçmek için sistem PhotoPicker'ını kullanmayı önerir.
Android'de galeri erişimi, Android 13'ün piyasaya sürülmesiyle önemli ölçüde değişti. Tek bir READ_EXTERNAL_STORAGE izni yerine, her medya türü için ayrıntılı izinler getirilerek kullanıcılara daha fazla kontrol sağlandı.
Android 13'ten itibaren, fotoğraf erişimi için READ_MEDIA_IMAGES ve video erişimi için READ_MEDIA_VIDEO kullanılır. READ_EXTERNAL_STORAGE izni artık medya dosyalarına erişim sağlamaz — yalnızca paylaşılan depolamadan medya dışı dosyaları okumak için korunur. Manifest dosyasındaki bildirim şöyle görünür:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
Android 12 ve altı ile geriye dönük uyumluluk için READ_EXTERNAL_STORAGE'ı da bildirmeniz gerekir. Ancak Android 13, yeni ayrıntılı izinler mevcut olduğunda bu izni otomatik olarak yok sayar. Eski izni yeni sürümlerde gizlemek için manifest dosyasında android:maxSdkVersion="32" özniteliğini kullanın. Bu, Android 13+ çalıştıran cihazlarda gereksiz talepleri önler.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
Android'de Photo Library Permission için çalışma zamanı talebi, Activity Result API aracılığıyla gerçekleştirilir. Görsellere erişim talebi örneği:
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)
}
}
iOS'te galeri erişimi, PhotoKit çerçevesi ve Info.plist'teki NSPhotoLibraryUsageDescription ile NSPhotoLibraryAddUsageDescription anahtarları aracılığıyla yönetilir. iOS 14'ten itibaren kullanıcılar yalnızca seçilen fotoğraflara erişim izni verebilir (Limited Photo Library).
Kitaplıktan fotoğraf okumak için NSPhotoLibraryUsageDescription gerekirken, yazma (fotoğraf kaydetme) için NSPhotoLibraryAddUsageDescription gerekir. Uygulama yalnızca medya kaydediyor ancak okumuyorsa, ikinci anahtar yeterlidir.
<key>NSPhotoLibraryUsageDescription</key>
<string>Uygulamanın profil resmi seçmesi ve anlık görüntüler yayınlaması için fotoğraflara erişmesi gerekir.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Uygulamanın işlenmiş fotoğrafları galerinize kaydetmesi için erişim gerekir.</string>
iOS'te fotoğraf erişim talebi, PHPhotoLibrary.requestAuthorization aracılığıyla gerçekleştirilir. iOS 14'ten itibaren .limited durumu, kullanıcının sınırlı bir fotoğraf kümesine erişim izni verdiğini gösterir.
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)
// Talep sonuçlarının işlenmesi
}
iOS 14+'teki .limited durumu, kullanıcının yalnızca seçili birkaç fotoğrafa erişim izni verdiği anlamına gelir. Uygulama, PHPhotoLibrary.shared().presentLimitedLibraryPicker çağrısı yaparak bir sistem diyalogu aracılığıyla genişletilmiş erişim talep edebilir. Bu diyalogun yalnızca kullanıcı ek fotoğraflar gerektiren bir özelliği açıkça talep ettiğinde gösterilmesi önerilir.
PhotoPicker, tüm kitaplığa erişim izni gerektirmeyen medya dosyası seçimi için bir sistem bileşenidir. Android 13 ve iOS 14'ten itibaren Google ve Apple, uygulamanın yalnızca bir veya birkaç fotoğraf seçmesi gerekiyorsa Photo Library Permission talep etmek yerine PhotoPicker kullanılmasını önerir.
Android 13+'te yerleşik PhotoPicker (ActivityResultContracts.PickVisualMedia), kullanıcıların tüm galeriye erişim izni vermeden fotoğraf veya video seçmesine olanak tanır. Uygulama yalnızca seçilen dosyaların URI'sini alır. PhotoPicker, manifest dosyasında herhangi bir izin bildirimi yapmadan çalışır.
private val pickMedia =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) {
// Seçilen dosyanın URI'si, tüm kitaplığa erişim olmadan
showImage(uri)
}
}
fun selectPhoto() {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
iOS 14+'te PHPickerViewController tanıtıldı — o da tüm kitaplığa erişim gerektirmeyen bir sistem seçicidir. PHPicker ayrı bir süreçte çalışır ve uygulamanın kitaplığına erişimi yoktur. Çoğu senaryoda fotoğraf seçmek için tercih edilen yöntemdir.
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, uygulamanın toplu işlemler için tüm kitaplığa erişmesi gerekiyorsa uygun değildir: yedekleme, bulut senkronizasyonu, galeri uygulaması, dosya yöneticisi. Bu durumlarda Photo Library Permission talep etmeniz ve sınırlı erişim (Limited) durumunu işlemeniz gerekir. iOS için .limited durumunun işlenmesi ve kullanıcılara erişimi genişletme seçeneği sunulması zorunludur.
En iyi uygulamalar, Photo Library Permission ile çalışırken reddetme sayısını azaltmaya ve platformların gizlilik gereksinimlerine uymaya yardımcı olur.
Bir veya birden fazla fotoğraf seçmek için sistem PhotoPicker veya PHPicker'ını kullanın. Bu bileşenler izin gerektirmez ve en iyi kullanıcı deneyimini sağlar. Yalnızca uygulamanın işlevselliği tüm medya kitaplığına erişim gerektiriyorsa tam galeri erişimi talep edin. Google ve Apple, geliştirici dokümantasyonlarında bu yaklaşımı açıkça önermektedir.
Uygulama gerçekten tam galeri erişimine ihtiyaç duyuyorsa, bir açıklama içeren ön ekran gösterin. Tüm fotoğraflara neden ihtiyaç duyulduğunu açıklayın. Örneğin, bir yedekleme uygulaması, kopya oluşturmak için tüm medya dosyalarını tarayacağını açıklamalıdır. Ön izin ekranı, Sınırlı Erişim mekanizması nedeniyle iOS için özellikle önemlidir.
Uygulama yalnızca fotoğraf kaydediyor ancak okumuyorsa (örneğin, sonucu kaydeden bir fotoğraf düzenleyici), yalnızca galeriye yazma izni talep edin. Android'de bu WRITE_EXTERNAL_STORAGE (Android 12 ve altı için) veya izinsiz MediaStore API'sidir (Android 10+ için). iOS'te NSPhotoLibraryUsageDescription olmadan NSPhotoLibraryAddUsageDescription kullanın.
Sıkça Sorulan Sorular
Android 10'dan (API 29) itibaren, MediaStore aracılığıyla fotoğraf kaydetmek WRITE_EXTERNAL_STORAGE izni gerektirmez. Sistem, açık bir izin olmadan yazma için paylaşılan depolamaya erişim sağlar. Diğer kullanıcıların dosyalarını okumak için hala uygun izin gerekir.
READ_EXTERNAL_STORAGE paylaşılan depolamadaki tüm dosyaları okumak için eski izindir (Android 12'ye kadar). READ_MEDIA_IMAGES yalnızca görselleri okumak için yeni ayrıntılı izindir (Android 13+). Kullanıcılar video ve sese erişimi reddederek yalnızca fotoğraflara erişim izni verebilir.
.limited durumu, kullanıcının erişim için bazı fotoğraflar seçtiği anlamına gelir. Uygulama, PHPhotoLibrary.shared().presentLimitedLibraryPicker aracılığıyla bir sistem genişletme diyalogu görüntüleyebilir. Bu diyalogun yalnızca kullanıcının açık talebi üzerine, örneğin “Daha fazla fotoğraf ekle” düğmesine tıklandığında gösterilmesi önerilir.
Evet, Photo Library Permission ile uygulama, coğrafi etiketler, çekim tarihi ve kamera modeli dahil EXIF verilerini okuyabilir. iOS'te, Apple GPS koordinatlarını gizli veri olarak kabul ettiğinden, coğrafi etiketlere erişmek ek konum izni gerektirebilir.
Sistem seçiciyi kullanın: iOS'te filter = .videos ile PHPicker, Android'de VideoOnly ile PickVisualMedia. Android'de, MediaStore.Video.Media.EXTERNAL_CONTENT_URI ile Intent(Intent.ACTION_PICK) da kullanabilirsiniz, ancak bu Android 13'ün altındaki sürümlerde READ_EXTERNAL_STORAGE izni gerektirir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun