MediaStore API — az Android interfésze az eszköz közös médiafájljaihoz: képekhez, videókhoz, audiókhoz és dokumentumokhoz való hozzáféréshez. Ellentétben a közvetlen fájleléréssel, a MediaStore egy központosított médiaadatbázison és tartalomszolgáltatón keresztül működik. Az Android Developers Documentation (2025) szerint az Android 10-től kezdve az API a média kezelésének fő mechanizmusává vált az elavult READ_EXTERNAL_STORAGE helyett. A fejlesztők a MediaStore-t galériákban, zenelejátszókban, kamerákban és fájlkezelőkben használják.
Főbb pontok
MediaStore API — egy rendszer tartalomszolgáltató az Android platformon, amely az eszköz médiafájljainak indexelésére, tárolására és hozzáférés biztosítására szolgál. Az API az Android SDK része, és az API Level 1-től elérhető.
A MediaStore egy egységes médiaadatbázison keresztül működik, amely automatikusan beolvassa az eszközt és összegyűjti az összes médiafájl metaadatait. Az adatbázis a rendszer által frissül fájlok hozzáadásakor, módosításakor vagy törlésekor, így az alkalmazások mindig naprakész információkat kapnak kézi beolvasás nélkül.
A MediaStore fő táblái: Images (képek), Video (videók), Audio (audiók) és Files (általános fájlok). Minden tábla metaadatokat tartalmazó oszlopokkal rendelkezik: név, létrehozás dátuma, méret, MIME-típus, GPS-koordináták és egyéb attribútumok.
Android 10 előtt a fejlesztők a READ_EXTERNAL_STORAGE-t használták az eszköz összes fájljának eléréséhez. Android 10 (API 29) bevezette a Scoped Storage-t: az alkalmazások csak a saját fájljaikhoz és a MediaStore-on keresztül fértek hozzá. Az Android 11 szigorította a politikát, teljesen blokkolva a közvetlen utat a megosztott könyvtárakhoz.
Android 13-tól (API 33) kezdve a Google a READ_EXTERNAL_STORAGE-t granuláris engedélyekkel váltotta fel: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO és READ_MEDIA_AUDIO. Ez lehetővé teszi a felhasználó számára, hogy csak bizonyos médiatípusokhoz adjon hozzáférést a teljes tárhely felfedése nélkül.
MediaStore a tartalomszolgáltató architektúrájára épül: minden alkalmazás ContentResolver-en és Uri-n keresztül fér hozzá. A rendszer médiabeolvasója — MediaScannerConnection — automatikusan indexeli az eszköz összes fájlját indításkor, USB-csatlakoztatáskor vagy újraindításkor.
A médiaadatbázis a rendszeradatbázisban tárolódik, és minden médiafájlhoz rekordokat tartalmaz. Az oszlopok típusonként eltérőek: a képek ORIENTATION és DATE_TAKEN, a videók — DURATION, az audiók — ARTIST és ALBUM mezőkkel rendelkeznek. A fejlesztők SQL-szerű lekérdezéseket hajthatnak végre a query-n keresztül projection és selection segítségével a szűréshez.
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))
}
}
Minden médiafájlt egy Content URI azonosít, amelynek formája content://media/external/images/media/1234. A külső URI (external) a megosztott tárhelyre mutat, a belső (internal) — a rendszer médiafájljaira. Az URI használata fájlútvonalak helyett — a MediaStore kulcsfontosságú előnye: az alkalmazás nem igényel hozzáférést a fájlrendszerhez, és egy biztonságos tartalomszolgáltatón keresztül működik.
MediaStore négy fő médiatípust támogat, mindegyik külön táblával és metaadatkészlettel. A fejlesztők az alkalmazás által használt tartalom típusától függően választják ki a megfelelő táblát.
A szabványos oszlopok mellett minden tábla tartalmaz rendszermezőket: _ID, DATA (elavult), SIZE, MIME_TYPE, DATE_ADDED, DATE_MODIFIED. Android 10-től a DATA mező deprecated jelöléssel rendelkezik, és a fejlesztőknek az URI alapú InputStream megnyitásán keresztül kell dolgozniuk.
MediaStore kifejezett engedélyeket igényel, amelyek az Android verziójától függően eltérőek. Android 13 előtt az egységes READ_EXTERNAL_STORAGE engedélyt használták. Android 13-tól (API 33) kezdve a Google granuláris engedélyeket vezetett be minden médiatípushoz.
| Médiatípus | Engedély (API 33+) | Régi (API 29-32) |
|---|---|---|
| Képek | READ_MEDIA_IMAGES | READ_EXTERNAL_STORAGE |
| Videó | READ_MEDIA_VIDEO | READ_EXTERNAL_STORAGE |
| Audió | READ_MEDIA_AUDIO | READ_EXTERNAL_STORAGE |
| Írás | WRITE_EXTERNAL_STORAGE | WRITE_EXTERNAL_STORAGE |
A MediaStore-ba íráshoz is WRITE_EXTERNAL_STORAGE szükséges Android 9 és alacsonyabb verziók esetén. Android 10-től kezdve az alkalmazás további engedélyek nélkül írhatja saját fájljait a MediaStore-ba — a rendszer automatikusan hozzáférést biztosít a rekord ContentResolver.insert-en keresztüli beszúrásakor.
A MediaStore engedélyek a szabványos ActivityResultContracts.RequestMultiplePermissions mechanizmuson keresztül kérhetők. A felhasználó elutasíthatja a kérést, és az alkalmazásnak megfelelően kell kezelnie ezt a forgatókönyvet. Javasolt az engedély meglétének ellenőrzése ContextCompat.checkSelfPermission segítségével minden MediaStore-hozzáférés előtt.
MediaStore nemcsak olvasást, hanem médiafájlok írását is lehetővé teszi. Kép vagy videó írásához a fejlesztő ContentResolver.insert-t használ, és OutputStream-et nyit a visszakapott URI-n. A rendszer automatikusan hozzáadja a fájlt a médiaadatbázishoz és indexeli.
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 ->
// bájtok írása a streamba
}
}
A törlés ContentResolver.delete segítségével történik a fájl URI-jának megadásával. A rendszer ellenőrzi a hozzáférési jogokat: ha a fájl az aktuális alkalmazás tulajdonában van, a törlés további engedélyek nélkül megtörténik. Más alkalmazások fájljaihoz Android 10+ esetén a felhasználó megerősítése szükséges egy rendszerpárbeszédablakon keresztül.
MediaStore API alapvetően különbözik a File API-n keresztüli közvetlen fájleléréstől. Fájlútvonalak helyett Content URI-k, fájlműveletek helyett — ContentResolver metódusok használatosak. Ez három kulcsfontosságú előnyt nyújt: biztonság, automatikus indexelés és egységes interfész.
A közvetlen fájlelérés korlátozott Android 10+ rendszeren a megosztott könyvtárak esetében. A MediaStore marad az egyetlen mód a média olvasására a Pictures, DCIM, Movies, Music és Download mappákból. Az alkalmazás saját fájljaihoz (app-specific storage) a közvetlen hozzáférés megmarad — ezek az Android/data és Android/media mappák.
A MediaStore és a közvetlen hozzáférés közötti választás a tartalom típusától függ. MediaStore kötelező a más alkalmazások számára elérhető közös médiafájlok esetén. A közvetlen File API az alkalmazás belső fájljaihoz és gyorsítótárához alkalmas. A Storage Access Framework tetszőleges dokumentumok rendszerválasztón keresztüli kiválasztására szolgál.
Gyakran Ismételt Kérdések
MediaStore API — az Android rendszer tartalomszolgáltatója az eszköz médiafájljaihoz: képekhez, videókhoz, audiókhoz és dokumentumokhoz való hozzáféréshez. Az API egységes interfészt biztosít a ContentResolver-en és a médiaadatbázison keresztül, amely automatikusan indexeli az összes fájlt.
A MediaStore támogatja a Images (képek), Video (videók), Audio (audiók) és Files (dokumentumok) típusokat. Minden típus külön táblával rendelkezik saját metaadatkészlettel: a képek ORIENTATION, a videók — DURATION, az audiók — ARTIST mezőkkel.
Android 13+ rendszeren granuláris engedélyek használatosak: READ_MEDIA_IMAGES a képekhez, READ_MEDIA_VIDEO a videókhoz és READ_MEDIA_AUDIO az audiókhoz. A felhasználó csak bizonyos médiatípusokhoz adhat hozzáférést.
Az íráshoz hozzon létre egy ContentValues objektumot névvel és MIME-típussal, hívja meg a ContentResolver.insert metódust az URI megszerzéséhez, majd nyissa meg az OutputStream-et a ContentResolver.openOutputStream segítségével. A rendszer automatikusan indexeli az új fájlt.
MediaStore programozott hozzáférést biztosít az eszköz összes médiafájljához a médiaadatbázison keresztül. Storage Access Framework megnyit egy rendszerpárbeszédablakot a fájl kiválasztásához és visszaad egy URI-t — a felhasználó kiválaszt egy adott fájlt vagy mappát.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is