MediaStore API — är Android-gränssnittet för åtkomst till enhetens gemensamma mediafiler: bilder, videor, ljud och dokument. Till skillnad från direkt filåtkomst fungerar MediaStore via en centraliserad mediadatabas och innehållsleverantör. Enligt Android Developers Documentation (2025) blev API:et från och med Android 10 det huvudsakliga mekanismen för att arbeta med media istället för den föråldrade READ_EXTERNAL_STORAGE. Utvecklare använder MediaStore i gallerier, musikspelare, kameror och filhanterare.
Huvudpunkter
MediaStore API — är en systeminnehållsleverantör på Android-plattformen, avsedd för indexering, lagring och tillhandahållande av åtkomst till enhetens mediafiler. API:et är en del av Android SDK och är tillgängligt från API Level 1.
MediaStore fungerar via en enhetlig mediadatabas som automatiskt skannar enheten och samlar in metadata för alla mediafiler. Databasen uppdateras av systemet när filer läggs till, ändras eller tas bort, så applikationer får alltid aktuell information utan manuell skanning.
MediaStores huvudtabeller: Images (bilder), Video (videor), Audio (ljud) och Files (allmänna filer). Varje tabell innehåller kolumner med metadata: namn, skapelsedatum, storlek, MIME-typ, GPS-koordinater och andra attribut.
Före Android 10 använde utvecklare READ_EXTERNAL_STORAGE för åtkomst till alla filer på enheten. Android 10 (API 29) introducerade Scoped Storage: applikationer fick endast åtkomst till sina egna filer och via MediaStore. Android 11 skärpte policyn och blockerade helt den direkta vägen till delade kataloger.
Från och med Android 13 (API 33) ersatte Google READ_EXTERNAL_STORAGE med granulära behörigheter: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO och READ_MEDIA_AUDIO. Detta gör det möjligt för användaren att ge åtkomst endast till vissa mediatyper utan att avslöja hela lagringsutrymmet.
MediaStore är byggd på innehållsleverantörsarkitekturen: varje applikation får åtkomst till den via ContentResolver och Uri. Systemets mediaskanner — MediaScannerConnection — indexerar automatiskt alla filer på enheten vid start, USB-anslutning eller omstart.
Mediadatabasen lagras i systemdatabasen och innehåller poster för varje mediafil. Kolumnerna skiljer sig för olika typer: bilder har ORIENTATION och DATE_TAKEN, videor — DURATION, ljud — ARTIST och ALBUM. Utvecklare kan utföra SQL-liknande frågor via query med projection och selection för filtrering.
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))
}
}
Varje mediafil identifieras av en Content URI av formen content://media/external/images/media/1234. Extern URI (external) pekar på den delade lagringen, intern (internal) — på systemets mediafiler. Användning av URI istället för filsökvägar — MediaStores viktigaste fördel: applikationen kräver inte åtkomst till filsystemet och fungerar via en säker innehållsleverantör.
MediaStore stöder fyra huvudmediatyper, var och en med en separat tabell och uppsättning metadata. Utvecklare väljer lämplig tabell beroende på vilken typ av innehåll applikationen arbetar med.
Förutom standardkolumnerna innehåller varje tabell systemfält: _ID, DATA (föråldrad), SIZE, MIME_TYPE, DATE_ADDED, DATE_MODIFIED. Från Android 10 är fältet DATA markerat som deprecated och utvecklare bör arbeta via att öppna InputStream baserat på URI.
MediaStore kräver explicita behörigheter som skiljer sig beroende på Android-version. Före Android 13 användes den enda behörigheten READ_EXTERNAL_STORAGE. Från och med Android 13 (API 33) introducerade Google granulära behörigheter för varje mediatyp.
| Mediatyp | Behörighet (API 33+) | Gammal (API 29-32) |
|---|---|---|
| Bilder | READ_MEDIA_IMAGES | READ_EXTERNAL_STORAGE |
| Video | READ_MEDIA_VIDEO | READ_EXTERNAL_STORAGE |
| Ljud | READ_MEDIA_AUDIO | READ_EXTERNAL_STORAGE |
| Skriva | WRITE_EXTERNAL_STORAGE | WRITE_EXTERNAL_STORAGE |
Att skriva till MediaStore kräver också WRITE_EXTERNAL_STORAGE för Android 9 och lägre. Från Android 10 kan applikationen skriva sina egna filer till MediaStore utan ytterligare behörigheter — systemet ger automatiskt åtkomst vid insättning av post via ContentResolver.insert.
MediaStore-behörigheter begärs via standardmekanismen ActivityResultContracts.RequestMultiplePermissions. Användaren kan avvisa begäran och applikationen måste hantera detta scenario korrekt. Det rekommenderas att kontrollera förekomsten av behörighet via ContextCompat.checkSelfPermission före varje åtkomst till MediaStore.
MediaStore gör det inte bara möjligt att läsa, utan även att skriva mediafiler. För att skriva en bild eller video använder utvecklaren ContentResolver.insert och öppnar en OutputStream på den returnerade URI:n. Systemet lägger automatiskt till filen i mediadatabasen och indexerar den.
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 ->
// skriv byte till ström
}
}
Borttagning utförs via ContentResolver.delete med angivelse av filens URI. Systemet kontrollerar åtkomsträttigheter: om filen tillhör den aktuella applikationen sker borttagning utan ytterligare behörigheter. För filer från andra applikationer på Android 10+ krävs användarens bekräftelse via en systemdialog.
MediaStore API skiljer sig fundamentalt från direkt filåtkomst via File API. Istället för filsökvägar används Content URI och istället för filoperationer — ContentResolver-metoder. Detta ger tre viktiga fördelar: säkerhet, automatisk indexering och enhetligt gränssnitt.
Direkt filåtkomst är begränsad på Android 10+ för delade kataloger. MediaStore förblir det enda sättet att läsa media från Pictures, DCIM, Movies, Music och Download. För applikationens egna filer (app-specific storage) finns direkt åtkomst kvar — det är mappar i Android/data och Android/media.
Valet mellan MediaStore och direkt åtkomst beror på innehållstypen. MediaStore är obligatoriskt för gemensamma mediafiler som är tillgängliga för andra applikationer. Direkt File API passar för applikationens interna filer och cache. Storage Access Framework används för att välja godtyckliga dokument via systemväljaren.
Vanliga frågor
MediaStore API — är Android-systemets innehållsleverantör för åtkomst till enhetens mediafiler: bilder, videor, ljud och dokument. API:et ger ett enhetligt gränssnitt via ContentResolver och mediadatabasen som automatiskt indexerar alla filer.
MediaStore stöder Images (bilder), Video (videor), Audio (ljud) och Files (dokument). Varje typ har en separat tabell med egen uppsättning metadata: bilder har ORIENTATION, videor — DURATION, ljud — ARTIST.
På Android 13+ används granulära behörigheter: READ_MEDIA_IMAGES för bilder, READ_MEDIA_VIDEO för video och READ_MEDIA_AUDIO för ljud. Användaren kan ge åtkomst endast till vissa mediatyper.
För att skriva, skapa en ContentValues med namn och MIME-typ, anropa ContentResolver.insert för att få en URI, öppna sedan OutputStream via ContentResolver.openOutputStream. Systemet indexerar automatiskt den nya filen.
MediaStore ger programmeringsåtkomst till alla enhetens mediafiler via mediadatabasen. Storage Access Framework öppnar en systemdialog för filval och returnerar en URI — användaren väljer en specifik fil eller mapp.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också