MediaStore API — je rozhraní Androidu pro přístup ke sdíleným mediálním souborům zařízení: obrázkům, videům, audiu a dokumentům. Na rozdíl od přímého přístupu k souborům MediaStore pracuje prostřednictvím centralizované mediální databáze a poskytovatele obsahu. Podle Android Developers Documentation (2025) se od Androidu 10 API stalo hlavním mechanismem práce s médii namísto zastaralého READ_EXTERNAL_STORAGE. Vývojáři používají MediaStore v galeriích, hudebních přehrávačích, fotoaparátech a správcích souborů.
Hlavní body
MediaStore API — je systémový poskytovatel obsahu na platformě Android, určený k indexování, ukládání a poskytování přístupu k mediálním souborům zařízení. API je součástí Android SDK a je k dispozici od API Level 1.
MediaStore pracuje prostřednictvím jednotné mediální databáze, která automaticky skenuje zařízení a shromažďuje metadata všech mediálních souborů. Databáze je aktualizována systémem při přidávání, úpravě nebo mazání souborů, takže aplikace vždy dostávají aktuální informace bez ručního skenování.
Hlavní tabulky MediaStore: Images (obrázky), Video (videa), Audio (audio) a Files (obecné soubory). Každá tabulka obsahuje sloupce s metadaty: název, datum vytvoření, velikost, MIME typ, GPS souřadnice a další atributy.
Před Androidem 10 vývojáři používali READ_EXTERNAL_STORAGE pro přístup ke všem souborům zařízení. Android 10 (API 29) zavedl Scoped Storage: aplikace získaly přístup pouze ke svým souborům a přes MediaStore. Android 11 zpřísnil politiku a zcela zablokoval přímou cestu ke sdíleným adresářům.
Od Androidu 13 (API 33) Google nahradil READ_EXTERNAL_STORAGE granulárními oprávněními: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO a READ_MEDIA_AUDIO. To umožňuje uživateli poskytnout přístup pouze k určitým typům médií bez odhalení celého úložiště.
MediaStore je postaven na architektuře poskytovatele obsahu: každá aplikace k němu přistupuje přes ContentResolver a Uri. Systémový skener médií — MediaScannerConnection — automaticky indexuje všechny soubory na zařízení při spuštění, připojení USB nebo restartu.
Mediální databáze je uložena v systémové databázi a obsahuje záznamy pro každý mediální soubor. Sloupce se liší pro různé typy: obrázky mají ORIENTATION a DATE_TAKEN, videa — DURATION, audio — ARTIST a ALBUM. Vývojáři mohou provádět SQL-podobné dotazy přes query s projection a selection pro filtrování.
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))
}
}
Každý mediální soubor je identifikován Content URI ve tvaru content://media/external/images/media/1234. Externí URI (external) ukazuje na sdílené úložiště, interní (internal) — na systémové mediální soubory. Použití URI místo cest k souborům — klíčová výhoda MediaStore: aplikace nevyžaduje přístup k souborovému systému a pracuje přes bezpečného poskytovatele obsahu.
MediaStore podporuje čtyři hlavní typy médií, každý s vlastní tabulkou a sadou metadat. Vývojáři vybírají příslušnou tabulku v závislosti na typu obsahu, se kterým aplikace pracuje.
Kromě standardních sloupců každá tabulka obsahuje systémová pole: _ID, DATA (zastaralé), SIZE, MIME_TYPE, DATE_ADDED, DATE_MODIFIED. Od verze Android 10 je pole DATA označeno jako deprecated a vývojáři by měli pracovat přes otevření InputStream podle URI.
MediaStore vyžaduje explicitní oprávnění, která se liší v závislosti na verzi Androidu. Před Androidem 13 se používalo jednotné oprávnění READ_EXTERNAL_STORAGE. Od Androidu 13 (API 33) Google zavedl granulární oprávnění pro každý typ médií.
| Typ médií | Oprávnění (API 33+) | Staré (API 29-32) |
|---|---|---|
| Obrázky | READ_MEDIA_IMAGES | READ_EXTERNAL_STORAGE |
| Video | READ_MEDIA_VIDEO | READ_EXTERNAL_STORAGE |
| Audio | READ_MEDIA_AUDIO | READ_EXTERNAL_STORAGE |
| Zápis | WRITE_EXTERNAL_STORAGE | WRITE_EXTERNAL_STORAGE |
Zápis do MediaStore také vyžaduje WRITE_EXTERNAL_STORAGE pro Android 9 a nižší. Od Androidu 10 může aplikace zapisovat vlastní soubory do MediaStore bez dalších oprávnění — systém automaticky poskytuje přístup při vkládání záznamu přes ContentResolver.insert.
Oprávnění MediaStore se požadují prostřednictvím standardního mechanismu ActivityResultContracts.RequestMultiplePermissions. Uživatel může žádost odmítnout a aplikace by měla tento scénář správně zpracovat. Doporučuje se kontrolovat existenci oprávnění přes ContextCompat.checkSelfPermission před každým přístupem k MediaStore.
MediaStore umožňuje nejen čtení, ale také zápis mediálních souborů. Pro zápis obrázku nebo videa vývojář použije ContentResolver.insert a otevře OutputStream na vráceném URI. Systém automaticky přidá soubor do mediální databáze a indexuje jej.
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 ->
// zapsat bajty do streamu
}
}
Odstranění se provádí přes ContentResolver.delete s uvedením URI souboru. Systém kontroluje přístupová práva: pokud soubor patří aktuální aplikaci, odstranění proběhne bez dalších oprávnění. Pro soubory jiných aplikací na Android 10+ je vyžadováno potvrzení uživatele prostřednictvím systémového dialogu.
MediaStore API se zásadně liší od přímého přístupu k souborům přes File API. Místo cest k souborům se používají Content URI a místo operací se soubory — metody ContentResolver. To poskytuje tři klíčové výhody: bezpečnost, automatické indexování a jednotné rozhraní.
Přímý přístup k souborům je omezen na Android 10+ pro sdílené adresáře. MediaStore zůstává jediným způsobem čtení médií z Pictures, DCIM, Movies, Music a Download. Pro vlastní soubory aplikace (app-specific storage) přímý přístup zůstává — to jsou složky v Android/data a Android/media.
Volba mezi MediaStore a přímým přístupem závisí na typu obsahu. MediaStore je povinný pro sdílené mediální soubory přístupné jiným aplikacím. Přímé File API je vhodné pro interní soubory aplikace a mezipaměť. Storage Access Framework se používá pro výběr libovolných dokumentů prostřednictvím systémového výběru.
Často kladené otázky
MediaStore API — je systémový poskytovatel obsahu Androidu pro přístup k mediálním souborům zařízení: obrázkům, videím, audiu a dokumentům. API poskytuje jednotné rozhraní přes ContentResolver a mediální databázi, která automaticky indexuje všechny soubory.
MediaStore podporuje Images (obrázky), Video (videa), Audio (audio) a Files (dokumenty). Každý typ má samostatnou tabulku s vlastní sadou metadat: obrázky mají ORIENTATION, videa — DURATION, audio — ARTIST.
Na Android 13+ se používají granulární oprávnění: READ_MEDIA_IMAGES pro obrázky, READ_MEDIA_VIDEO pro video a READ_MEDIA_AUDIO pro audio. Uživatel může poskytnout přístup pouze k určitým typům médií.
Pro zápis vytvořte ContentValues s názvem a MIME typem, zavolejte ContentResolver.insert pro získání URI, poté otevřete OutputStream přes ContentResolver.openOutputStream. Systém automaticky indexuje nový soubor.
MediaStore poskytuje programový přístup ke všem mediálním souborům zařízení přes mediální databázi. Storage Access Framework otevře systémový dialog pro výběr souboru a vrátí URI — uživatel vybere konkrétní soubor nebo složku.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také