Photo Library Permission — temeller, erişim türleri ve çalışma prensibi

Yazar: IT Sectr Yayınlanma: 2026-05-21 Okuma süresi: 8 dk

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 — cihaz galerisinde medya dosyalarını okuma ve yazma izni, fotoğraf ve videolarla çalışmak için zorunludur.
  • Android galeri erişimi için READ_MEDIA_IMAGES, READ_MEDIA_VIDEO (Android 13+) veya READ_EXTERNAL_STORAGE kullanır.
  • iOS iOS 14'ten itibaren sınırlı erişimle (Limited Photo Library Access) PHPhotoLibrary kullanır.
  • Bireysel fotoğraf seçimi sistem seçici (PhotoPicker) aracılığıyla yapılır ve tüm kitaplığa erişim izni gerektirmez.
  • Galeriye yazma ayrı bir yazma izni gerektirir (Android'de WRITE_EXTERNAL_STORAGE, iOS'te PHPhotoLibrary).

Photo Library Permission Temelleri

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'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+ İzinleri

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:

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

Android 12 ve Altı ile Uyumluluk

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.

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

Kotlin'de Çalışma Zamanı Talebi

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:

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

iOS'te Galeri Erişimi

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

Info.plist Yapılandırması

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.

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

Swift'te Talep

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.

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)
    // Talep sonuçlarının işlenmesi
}

Sınırlı Erişimin İş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 vs Sistem İzni

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'de PhotoPicker

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.

kotlin
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'te PHPicker

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.

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

Tam İzin Ne Zaman Gerekir

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.

Galeri Erişimi için En İyi Uygulamalar

En iyi uygulamalar, Photo Library Permission ile çalışırken reddetme sayısını azaltmaya ve platformların gizlilik gereksinimlerine uymaya yardımcı olur.

Varsayılan Olarak PhotoPicker Kullanın

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.

Tam Erişimin Nedenini Açıklayın

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.

Yalnızca Gerekli İzinleri Talep Edin

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+'ta fotoğraf kaydetmek için izin gerekli mi?

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 ve READ_MEDIA_IMAGES arasındaki fark nedir?

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.

iOS'te .limited durumu nasıl işlenir?

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

Fotoğraflardan EXIF meta verileri okunabilir mi?

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.

İzin olmadan galeriden video nasıl seçilir?

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

  • Photo Library Permission — medya dosyalarını okuma ve yazma izni, cihaz galerisiyle çalışan uygulamalar için zorunludur.
  • Android 13+ tek READ_EXTERNAL_STORAGE yerine ayrıntılı READ_MEDIA_IMAGES ve READ_MEDIA_VIDEO izinlerini kullanır.
  • iOS 14+ PhotoKit aracılığıyla kullanıcıların yalnızca seçilen fotoğraflara (Limited) erişim izni vermesine olanak tanır.
  • PhotoPicker tam kitaplık erişimi talep etmeden bireysel dosyaları seçmek için önerilen yöntemdir.
  • Galeriye yazma Android 10+'ta MediaStore aracılığıyla izin gerektirmez, iOS'te NSPhotoLibraryAddUsageDescription gerektirir.
  • Ön izin ekranı ile fotoğraf toplama amacının açıklanması onay dönüşümünü artırır ve reddetmeleri azaltır.
  • Sınırlı Erişim iOS'te ek işleme ve sistem diyalogu aracılığıyla genişletilmiş erişim talep etme yeteneği gerektirir.

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.

Projeyi tartış

Ayrıca okuyun