MediaStore API — је Android интерфејс за приступ заједничким медијским датотекама уређаја: сликама, видеима, аудио записима и документима. За разлику од директног приступа датотекама, MediaStore ради преко централизоване медијске базе и провајдера садржаја. Према Android Developers Documentation (2025), почевши од Android-а 10 API је постао главни механизам рада са медијима уместо застарелог READ_EXTERNAL_STORAGE. Програмери користе MediaStore у галеријама, музичким плејерима, камерама и менаџерима датотека.
Главне тачке
MediaStore API — је системски провајдер садржаја на Android платформи, намењен за индексирање, складиштење и обезбеђивање приступа медијским датотекама уређаја. API је део Android SDK-а и доступан је од API Level 1.
MediaStore ради преко јединствене медијске базе која аутоматски скенира уређај и прикупља метаподатке свих медијских датотека. База се ажурира од стране система при додавању, мењању или брисању датотека, тако да апликације увек добијају ажурне информације без ручног скенирања.
Главне табеле MediaStore-а: Images (слике), Video (видеи), Audio (аудио) и Files (опште датотеке). Свака табела садржи колоне са метаподацима: назив, датум креирања, величина, MIME тип, GPS координате и други атрибути.
Пре Android-а 10, програмери су користили READ_EXTERNAL_STORAGE за приступ свим датотекама уређаја. Android 10 (API 29) је увео Scoped Storage: апликације су добиле приступ само својим датотекама и преко MediaStore-а. Android 11 је пооштрио политику, потпуно блокирајући директну путању до дељених директоријума.
Почевши од Android-а 13 (API 33), Google је заменио READ_EXTERNAL_STORAGE грануларним дозволама: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO и READ_MEDIA_AUDIO. Ово омогућава кориснику да да приступ само одређеним врстама медија без откривања целог складишта.
MediaStore је изграђен на архитектури провајдера садржаја: свака апликација му приступа преко ContentResolver-а и Uri-ја. Системски скенер медија — MediaScannerConnection — аутоматски индексира све датотеке на уређају при покретању, USB повезивању или рестартовању.
Медијска база се чува у системској бази података и садржи записе за сваку медијску датотеку. Колоне се разликују за различите типове: слике имају ORIENTATION и DATE_TAKEN, видеи — DURATION, аудио — ARTIST и ALBUM. Програмери могу извршавати SQL-сличне упите преко query са projection и selection за филтрирање.
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))
}
}
Свака медијска датотека се идентификује Content URI-јем облика content://media/external/images/media/1234. Спољни URI (external) указује на заједничко складиште, унутрашњи (internal) — на системске медијске датотеке. Коришћење URI-ja уместо путања датотека — кључна предност MediaStore-а: апликација не захтева приступ систему датотека и ради преко сигурног провајдера садржаја.
MediaStore подржава четири главне врсте медија, сваку са посебном табелом и скупом метаподатака. Програмери бирају одговарајућу табелу у зависности од врсте садржаја са којом апликација ради.
Поред стандардних колона, свака табела садржи системска поља: _ID, DATA (застарео), SIZE, MIME_TYPE, DATE_ADDED, DATE_MODIFIED. Од верзије Android 10 поље DATA је означено као deprecated, и програмери треба да раде преко отварања InputStream по URI-ју.
MediaStore захтева експлицитне дозволе које се разликују у зависности од верзије Android-а. Пре Android-а 13 користила се јединствена дозвола READ_EXTERNAL_STORAGE. Почевши од Android-а 13 (API 33), Google је увео грануларне дозволе за сваку врсту медија.
| Врста медија | Дозвола (API 33+) | Стара (API 29-32) |
|---|---|---|
| Слике | READ_MEDIA_IMAGES | READ_EXTERNAL_STORAGE |
| Видео | READ_MEDIA_VIDEO | READ_EXTERNAL_STORAGE |
| Аудио | READ_MEDIA_AUDIO | READ_EXTERNAL_STORAGE |
| Писање | WRITE_EXTERNAL_STORAGE | WRITE_EXTERNAL_STORAGE |
Писање у MediaStore такође захтева WRITE_EXTERNAL_STORAGE за Android 9 и ниже. Почевши од Android-а 10, апликација може да пише сопствене датотеке у MediaStore без додатних дозвола — систем аутоматски одобрава приступ при уметању записа преко ContentResolver.insert.
MediaStore дозволе се захтевају преко стандардног механизма ActivityResultContracts.RequestMultiplePermissions. Корисник може да одбије захтев, а апликација треба да правилно обради овај сценарио. Препоручује се провера присуства дозволе преко ContextCompat.checkSelfPermission пре сваког приступа MediaStore-у.
MediaStore омогућава не само читање, већ и писање медијских датотека. За писање слике или видеа, програмер користи ContentResolver.insert и отвара OutputStream по враћеном URI-ју. Систем аутоматски додаје датотеку у медијску базу и индексира је.
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 ->
// упишите бајтове у ток
}
}
Брисање се врши преко ContentResolver.delete са навођењем URI-ја датотеке. Систем проверава права приступа: ако датотека припада тренутној апликацији, брисање се одвија без додатних дозвола. За датотеке других апликација на Android 10+ потребна је потврда корисника преко системског дијалога.
MediaStore API се суштински разликује од директног приступа датотекама преко File API-ја. Уместо путања датотека користе се Content URI, а уместо операција са датотекама — ContentResolver методе. Ово даје три кључне предности: безбедност, аутоматско индексирање и јединствени интерфејс.
Директни приступ датотекама је ограничен на Android 10+ за дељене директоријуме. MediaStore остаје једини начин читања медија из Pictures, DCIM, Movies, Music и Download. За сопствене датотеке апликације (app-specific storage) директан приступ остаје — то су фолдери у Android/data и Android/media.
Избор између MediaStore-а и директног приступа зависи од врсте садржаја. MediaStore је обавезан за заједничке медијске датотеке доступне другим апликацијама. Директни File API је погодан за интерне датотеке апликације и кеш. Storage Access Framework се користи за избор произвољних докумената преко системског бирача.
Често постављана питања
MediaStore API — је системски провајдер садржаја Android-а за приступ медијским датотекама уређаја: сликама, видеима, аудио записима и документима. API пружа јединствени интерфејс преко ContentResolver-а и медијске базе која аутоматски индексира све датотеке.
MediaStore подржава Images (слике), Video (видее), Audio (аудио) и Files (документе). Свака врста има посебну табелу са својим скупом метаподатака: слике имају ORIENTATION, видеи — DURATION, аудио — ARTIST.
На Android 13+ користе се грануларне дозволе: READ_MEDIA_IMAGES за слике, READ_MEDIA_VIDEO за видео и READ_MEDIA_AUDIO за аудио. Корисник може да одобри приступ само одређеним врстама медија.
За писање креирајте ContentValues са именом и MIME типом, позовите ContentResolver.insert да бисте добили URI, затим отворите OutputStream преко ContentResolver.openOutputStream. Систем аутоматски индексира нову датотеку.
MediaStore пружа програмски приступ свим медијским датотекама уређаја преко медијске базе. Storage Access Framework отвара системски дијалог за избор датотеке и враћа URI — корисник бира конкретну датотеку или фолдер.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође