MediaStore API, cihazın paylaşılan medya dosyalarına (görseller, videolar, ses ve belgeler) erişmek için bir Android arayüzüdür. Doğrudan dosya erişiminin aksine MediaStore, merkezi bir medya veritabanı ve içerik sağlayıcı aracılığıyla çalışır. Android Developers Documentation'a (2025) göre, Android 10'dan itibaren API, kullanımdan kaldırılan READ_EXTERNAL_STORAGE'ın yerine medyayla çalışmanın ana mekanizması haline geldi. Geliştiriciler MediaStore'u galerilerde, müzik çalarlarda, kameralarda ve dosya yöneticilerinde kullanır.
Önemli Noktalar
MediaStore API, Android platformunda cihazın medya dosyalarını indekslemek, depolamak ve erişim sağlamak için tasarlanmış bir sistem içerik sağlayıcısıdır. API, Android SDK'nın bir parçasıdır ve API Level 1'den beri kullanılabilir.
MediaStore, cihazı otomatik olarak tarayan ve tüm medya dosyalarının meta verilerini toplayan birleşik bir medya veritabanı aracılığıyla çalışır. Veritabanı, dosyalar eklendiğinde, değiştirildiğinde veya silindiğinde sistem tarafından güncellenir, böylece uygulamalar manuel tarama olmadan her zaman güncel bilgi alır.
MediaStore'un ana tabloları şunlardır: Images (görseller), Video (videolar), Audio (ses) ve Files (genel dosyalar). Her tablo, meta veriler içeren sütunlar içerir: ad, oluşturma tarihi, boyut, MIME türü, GPS koordinatları ve diğer özellikler.
Android 10'dan önce, geliştiriciler tüm cihaz dosyalarına erişmek için READ_EXTERNAL_STORAGE kullanıyordu. Android 10 (API 29), Scoped Storage'ı tanıttı: uygulamalar yalnızca kendi dosyalarına ve MediaStore aracılığıyla erişebiliyordu. Android 11, politikayı daha da sıkılaştırarak paylaşılan dizinlere doğrudan yolu tamamen engelledi.
Android 13 (API 33)'ten itibaren Google, READ_EXTERNAL_STORAGE'ı ayrıntılı izinlerle değiştirdi: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO ve READ_MEDIA_AUDIO. Bu, kullanıcıların tüm depolama alanını açığa çıkarmadan yalnızca belirli medya türlerine erişim izni vermesini sağlar.
MediaStore, içerik sağlayıcı mimarisi üzerine kurulmuştur: her uygulama ona ContentResolver ve Uri aracılığıyla erişir. Sistem medya tarayıcısı — MediaScannerConnection — önyükleme, USB bağlantısı veya yeniden başlatma sırasında cihazdaki tüm dosyaları otomatik olarak indeksler.
Medya veritabanı, sistem veritabanında depolanır ve her medya dosyası için kayıtlar içerir. Sütunlar türe göre farklılık gösterir: görsellerde ORIENTATION ve DATE_TAKEN, videolarda DURATION, ses dosyalarında ARTIST ve ALBUM bulunur. Geliştiriciler, filtreleme için projection ve selection ile query kullanarak SQL benzeri sorgular çalıştırabilir.
val projection = arrayOf(
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATE_ADDED
)
val cursor = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
null,
null,
MediaStore.Images.Media.DATE_ADDED + " DESC"
)
cursor?.use {
while (moveToNext()) {
val name = getString(getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME))
}
}
Her medya dosyası, content://media/external/images/media/1234 gibi bir Content URI ile tanımlanır. Harici URI paylaşılan depolamayı, dahili URI ise sistem medya dosyalarını gösterir. Dosya yolları yerine URI kullanmak MediaStore'un önemli bir avantajıdır: uygulamanın dosya sistemi erişimine ihtiyacı yoktur ve güvenli bir içerik sağlayıcı aracılığıyla çalışır.
MediaStore dört ana medya türünü destekler, her biri kendi tablosu ve meta veri kümesiyle. Geliştiriciler, uygulamalarının çalıştığı içerik türüne göre uygun tabloyu seçer.
Standart sütunlara ek olarak, her tablo sistem alanları içerir: _ID, DATA (kullanımdan kaldırıldı), SIZE, MIME_TYPE, DATE_ADDED, DATE_MODIFIED. Android 10'dan itibaren DATA alanı kullanımdan kaldırıldı ve geliştiriciler URI üzerinden InputStream açarak çalışmalıdır.
MediaStore açık izinler gerektirir ve bunlar Android sürümüne göre farklılık gösterir. Android 13'ten önce tek READ_EXTERNAL_STORAGE izni kullanılıyordu. Android 13 (API 33)'ten itibaren Google, her medya türü için ayrıntılı izinler getirdi.
| Medya türü | İzin (API 33+) | Eski (API 29–32) |
|---|---|---|
| Görseller | READ_MEDIA_IMAGES | READ_EXTERNAL_STORAGE |
| Video | READ_MEDIA_VIDEO | READ_EXTERNAL_STORAGE |
| Ses | READ_MEDIA_AUDIO | READ_EXTERNAL_STORAGE |
| Yazma | WRITE_EXTERNAL_STORAGE | WRITE_EXTERNAL_STORAGE |
MediaStore'a yazmak, Android 9 ve altı için WRITE_EXTERNAL_STORAGE gerektirir. Android 10'dan itibaren bir uygulama, ek izinler olmadan MediaStore'a kendi dosyalarını yazabilir — ContentResolver.insert ile kayıt eklerken sistem otomatik olarak erişim sağlar.
MediaStore izinleri, standart ActivityResultContracts.RequestMultiplePermissions mekanizması aracılığıyla istenir. Kullanıcı isteği reddedebilir ve uygulama bu senaryoyu doğru şekilde ele almalıdır. MediaStore'a her erişimden önce ContextCompat.checkSelfPermission ile iznin kontrol edilmesi önerilir.
MediaStore yalnızca okumaya değil, aynı zamanda medya dosyaları yazmaya da izin verir. Bir görsel veya video yazmak için geliştirici ContentResolver.insert kullanır ve döndürülen URI için bir OutputStream açar. Sistem dosyayı otomatik olarak medya veritabanına ekler ve indeksler.
val values = ContentValues().apply {
put(MediaStore.Images.Media.DISPLAY_NAME, "photo_2025.jpg")
put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/MyApp")
}
val uri = contentResolver?.insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values
)
uri?.let {
val outputStream = contentResolver?.openOutputStream(it)
outputStream?.use { stream ->
// akışa bayt yaz
}
}
Silme, dosyanın URI'si ile ContentResolver.delete kullanılarak gerçekleştirilir. Sistem erişim haklarını kontrol eder: dosya mevcut uygulamaya aitse, silme ek izin olmadan gerçekleşir. Android 10+'da diğer uygulamaların dosyaları için sistem diyaloğu aracılığıyla kullanıcı onayı gerekir.
MediaStore API, File API aracılığıyla doğrudan dosya erişiminden temel olarak farklıdır. Dosya yolları yerine Content URI'ler kullanılır ve dosya işlemleri yerine ContentResolver yöntemleri kullanılır. Bu üç temel avantaj sağlar: güvenlik, otomatik indeksleme ve birleşik arayüz.
Doğrudan dosya erişimi, Android 10+'da paylaşılan dizinler için kısıtlanmıştır. MediaStore, Pictures, DCIM, Movies, Music ve Download'dan medya okumanın tek yoludur. Uygulamaya özgü dosyalar (app-specific storage) için doğrudan erişim korunur — bunlar Android/data ve Android/media içindeki klasörlerdir.
MediaStore ve doğrudan erişim arasındaki seçim içerik türüne bağlıdır. MediaStore, diğer uygulamalar tarafından erişilebilen paylaşılan medya dosyaları için zorunludur. Doğrudan File API, uygulamanın dahili dosyaları ve önbelleği için uygundur. Storage Access Framework, sistem seçici aracılığıyla rastgele belgeler seçmek için kullanılır.
Sıkça Sorulan Sorular
MediaStore API, cihazın medya dosyalarına (görseller, videolar, ses ve belgeler) erişmek için Android sistem içerik sağlayıcısıdır. API, ContentResolver ve tüm dosyaları otomatik olarak indeksleyen bir medya veritabanı aracılığıyla birleşik bir arayüz sağlar.
MediaStore Images (görseller), Video (videolar), Audio (ses) ve Files (belgeler) destekler. Her türün kendi tablosu ve meta veri kümesi vardır: görsellerde ORIENTATION, videolarda DURATION, ses dosyalarında ARTIST bulunur.
Android 13+'ta ayrıntılı izinler kullanılır: görseller için READ_MEDIA_IMAGES, video için READ_MEDIA_VIDEO ve ses için READ_MEDIA_AUDIO. Kullanıcı yalnızca belirli medya türlerine erişim izni verebilir.
Yazmak için, ad ve MIME türüyle ContentValues oluşturun, URI almak için ContentResolver.insert çağırın, ardından ContentResolver.openOutputStream ile OutputStream açın. Sistem yeni dosyayı otomatik olarak indeksler.
MediaStore, bir medya veritabanı aracılığıyla cihazdaki tüm medya dosyalarına programatik erişim sağlar. Storage Access Framework, bir sistem dosya seçme diyaloğu açar ve bir URI döndürür — kullanıcı belirli bir dosya veya klasörü seçer.
Ö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