Photo Library Permission — adalah izin yang diperlukan aplikasi untuk mengakses foto dan video yang disimpan di perangkat pengguna. Diperlukan untuk memilih gambar dari galeri, menyimpan file media, dan mengelola album foto. Menurut Apple Developer Documentation, 2024, mulai iOS 14 aplikasi harus meminta akses ke perpustakaan terbatas, bukan ke semua foto sekaligus.
Poin utama
Photo Library Permission — adalah izin sistem yang mengatur akses aplikasi ke file media yang disimpan di perangkat. Mencakup baik pembacaan (melihat dan memilih foto dan video) maupun penulisan (menyimpan file baru ke galeri). Platform mobile menganggap perpustakaan media sebagai data rahasia, karena foto dapat berisi informasi pribadi dan sensitif.
Di Android 13 (API 33) Google membagi izin tunggal READ_EXTERNAL_STORAGE menjadi tiga terpisah: READ_MEDIA_IMAGES untuk foto, READ_MEDIA_VIDEO untuk video, dan READ_MEDIA_AUDIO untuk audio. Ini memungkinkan pengguna memberikan akses hanya ke jenis file media tertentu. Di iOS, mulai iOS 14, PhotoKit memberi pengguna kemampuan untuk memilih foto tertentu untuk diakses, alih-alih membuka seluruh perpustakaan.
Menurut Counterpoint Research (2024), lebih dari 70% aplikasi mobile di kategori jejaring sosial, komunikasi, dan editor foto meminta Photo Library Permission. Sementara itu, 32% pengguna menolak akses ke galeri jika mereka tidak mengerti mengapa aplikasi membutuhkan foto mereka. Apple dan Google merekomendasikan penggunaan PhotoPicker sistem untuk memilih file individual tanpa meminta akses penuh.
Akses ke galeri di Android berubah secara signifikan dengan dirilisnya Android 13. Alih-alih satu izin READ_EXTERNAL_STORAGE, muncul izin granular untuk setiap jenis file media, memberikan pengguna kontrol lebih besar.
Mulai Android 13, untuk akses ke foto digunakan READ_MEDIA_IMAGES, untuk video — READ_MEDIA_VIDEO. Izin READ_EXTERNAL_STORAGE tidak lagi memberikan akses ke file media — hanya tersisa untuk membaca file non-media dari penyimpanan bersama. Deklarasi dalam manifes terlihat seperti ini:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
Untuk kompatibilitas mundur dengan Android 12 dan lebih rendah, READ_EXTERNAL_STORAGE juga harus dideklarasikan. Namun, Android 13 secara otomatis mengabaikan izin ini jika izin granular baru ada. Gunakan atribut android:maxSdkVersion="32" di manifes untuk izin lama, untuk menyembunyikannya di versi baru. Ini mencegah permintaan berlebihan di perangkat dengan Android 13+.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
Permintaan runtime untuk Photo Library Permission di Android dilakukan melalui Activity Result API. Contoh untuk meminta akses ke gambar:
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)
}
}
Akses ke galeri di iOS dikelola melalui framework PhotoKit dan kunci NSPhotoLibraryUsageDescription serta NSPhotoLibraryAddUsageDescription di Info.plist. Mulai iOS 14, pengguna dapat memberikan akses hanya ke foto yang dipilih (Limited Photo Library).
Untuk membaca foto dari perpustakaan diperlukan NSPhotoLibraryUsageDescription, untuk menulis (menyimpan foto) — NSPhotoLibraryAddUsageDescription. Jika aplikasi hanya menyimpan media tetapi tidak membacanya, kunci kedua sudah cukup.
<key>NSPhotoLibraryUsageDescription</key>
<string>Aplikasi memerlukan akses ke foto untuk memilih gambar profil dan mempublikasikan foto.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Aplikasi memerlukan akses untuk menyimpan foto yang diproses ke galeri Anda.</string>
Permintaan akses ke foto di iOS dilakukan melalui PHPhotoLibrary.requestAuthorization. Mulai iOS 14, status .limited menunjukkan bahwa pengguna telah memberikan akses ke kumpulan foto terbatas.
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)
// Bekerja dengan hasil permintaan
}
Status .limited di iOS 14+ berarti pengguna hanya memberikan akses ke beberapa foto yang dipilih. Aplikasi dapat meminta perluasan akses melalui dialog sistem dengan memanggil PHPhotoLibrary.shared().presentLimitedLibraryPicker. Disarankan untuk menampilkan dialog ini hanya ketika pengguna secara eksplisit meminta fitur yang membutuhkan foto tambahan.
PhotoPicker — adalah komponen sistem untuk memilih file media yang tidak memerlukan izin akses ke seluruh perpustakaan. Mulai Android 13 dan iOS 14, Google dan Apple merekomendasikan penggunaan PhotoPicker alih-alih meminta Photo Library Permission, jika aplikasi hanya perlu memilih satu atau beberapa foto.
Di Android 13+, PhotoPicker bawaan (ActivityResultContracts.PickVisualMedia) memungkinkan pengguna memilih foto atau video tanpa memberikan akses ke seluruh galeri. Aplikasi hanya menerima URI file yang dipilih. PhotoPicker berfungsi tanpa mendeklarasikan izin apa pun di manifes.
private val pickMedia =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) {
// URI file yang dipilih, tanpa akses ke seluruh perpustakaan
showImage(uri)
}
}
fun selectPhoto() {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
Di iOS 14+ muncul PHPickerViewController — picker sistem yang juga tidak memerlukan akses ke seluruh perpustakaan. PHPicker berfungsi di proses terpisah dan tidak memiliki akses ke perpustakaan aplikasi. Ini adalah cara yang lebih disukai untuk memilih foto di sebagian besar skenario.
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 tidak cocok jika aplikasi memerlukan akses ke seluruh perpustakaan untuk operasi massal: pencadangan, sinkronisasi dengan cloud, aplikasi galeri, manajer file. Dalam kasus ini, perlu meminta Photo Library Permission dan menangani kasus akses terbatas (Limited). Untuk iOS, wajib menambahkan penanganan status .limited dan menawarkan pengguna untuk memperluas akses.
Praktik terbaik bekerja dengan Photo Library Permission membantu mengurangi jumlah penolakan dan memenuhi persyaratan privasi platform.
Untuk memilih satu atau beberapa foto, gunakan PhotoPicker atau PHPicker sistem. Komponen ini tidak memerlukan izin dan memberikan pengalaman pengguna terbaik. Izin penuh akses ke galeri hanya diminta jika fungsionalitas aplikasi memerlukan akses ke seluruh perpustakaan media. Google dan Apple secara eksplisit merekomendasikan pendekatan ini dalam dokumentasi pengembang.
Jika aplikasi benar-benar memerlukan akses penuh ke galeri, tampilkan layar awal dengan penjelasan. Jelaskan mengapa semua foto diperlukan, bukan hanya satu. Misalnya, aplikasi pencadangan harus menjelaskan bahwa ia akan memindai semua file media untuk membuat salinan. Pre-permission screen sangat penting di iOS karena mekanisme Limited Access.
Jika aplikasi hanya menyimpan foto tetapi tidak membacanya (misalnya, editor foto yang menyimpan hasil), minta hanya izin menulis ke galeri. Di Android ini adalah WRITE_EXTERNAL_STORAGE (untuk Android 12 dan lebih rendah) atau MediaStore API tanpa izin (untuk Android 10+). Di iOS gunakan NSPhotoLibraryAddUsageDescription tanpa NSPhotoLibraryUsageDescription.
Pertanyaan yang sering diajukan
Mulai Android 10 (API 29), menyimpan foto melalui MediaStore tidak memerlukan izin WRITE_EXTERNAL_STORAGE. Sistem menyediakan akses ke penyimpanan bersama untuk menulis tanpa izin eksplisit. Untuk membaca file milik orang lain tetap diperlukan izin yang sesuai.
READ_EXTERNAL_STORAGE — izin lama untuk membaca semua file dari penyimpanan bersama (hingga Android 12). READ_MEDIA_IMAGES — izin granular baru untuk membaca hanya gambar (Android 13+). Pengguna dapat memberikan akses hanya ke foto, menolak akses ke video dan audio.
Status .limited berarti pengguna telah memilih beberapa foto untuk diakses. Aplikasi dapat menampilkan dialog sistem perluasan melalui PHPhotoLibrary.shared().presentLimitedLibraryPicker. Disarankan menampilkan dialog ini hanya atas permintaan eksplisit pengguna, misalnya saat menekan tombol "Tambahkan lebih banyak foto".
Ya, dengan Photo Library Permission aplikasi dapat membaca data EXIF termasuk geotag, tanggal pengambilan, dan model kamera. Di iOS, untuk akses ke geotag mungkin diperlukan Location Permission tambahan, karena Apple menganggap koordinat GPS sebagai data rahasia.
Gunakan picker sistem: PHPicker dengan filter = .videos di iOS, PickVisualMedia dengan VideoOnly di Android. Di Android, untuk memilih video dari galeri juga dapat menggunakan Intent(Intent.ACTION_PICK) dengan MediaStore.Video.Media.EXTERNAL_CONTENT_URI, tetapi ini memerlukan izin READ_EXTERNAL_STORAGE di versi di bawah Android 13.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga