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 вказує на спільне сховище, внутрішній — на системні медіафайли. Використання URI замість файлових шляхів — ключова перевага MediaStore: додаток не потребує доступу до файлової системи і працює через безпечний контент-провайдер.
MediaStore підтримує чотири основних типи медіа, кожен з окремою таблицею та набором метаданих. Розробники обирають потрібну таблицю залежно від типу контенту, з яким працює додаток.
Поміж стандартних стовпців, кожна таблиця містить системні поля: _ID, DATA (застаріло), SIZE, MIME_TYPE, DATE_ADDED, DATE_MODIFIED. З версії Android 10 поле DATA позначено як застаріло, і розробники повинні працювати через відкриття 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також