MediaStore API: що це, можливості та робота зі спільними медіафайлами

Автор: IT Sectr Опубліковано: 2026-07-10 Час читання: 7 хв

MediaStore API — це інтерфейс Android для доступу до спільних медіафайлів пристрою: зображень, відео, аудіо та документів. На відміну від прямого файлового доступу, MediaStore працює через централізовану медіа-базу та контент-провайдер. За даними Android Developers Documentation (2025), починаючи з Android 10 API став основним механізмом роботи з медіа замість застарілого READ_EXTERNAL_STORAGE. Розробники використовують MediaStore в галереях, музичних плеєрах, камерах і файлових менеджерах.

Головне

  • MediaStore — системний контент-провайдер Android для доступу до спільних медіафайлів пристрою.
  • Медіа-база централізовано індексує всі зображення, відео та аудіо на пристрої.
  • Android 10 зробив MediaStore єдиним способом доступу до спільних медіафайлів.
  • Uri-посилання замінюють прямі файлові шляхи, забезпечуючи безпечний доступ.
  • Дозволи запитуються за типами медіа: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO.

Що таке MediaStore API?

MediaStore API — це системний контент-провайдер на платформі Android, призначений для індексації, збереження та надання доступу до медіафайлів пристрою. API входить до складу Android SDK і доступний починаючи з API Level 1.

MediaStore працює через єдину медіа-базу, яка автоматично сканує пристрій і збирає метадані всіх медіафайлів. База оновлюється системою при додаванні, зміні або видаленні файлів, тому додатки завжди отримують актуальну інформацію без ручного сканування.

Основні таблиці MediaStore: Images (зображення), Video (відео), Audio (аудіо) та Files (загальні файли). Кожна таблиця містить стовпці з метаданими: назва, дата створення, розмір, MIME-тип, GPS-координати та інші атрибути.

Еволюція MediaStore в версіях Android

До 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: архітектура та медіа-база

MediaStore побудований за архітектурою контент-провайдера: кожен додаток звертається до нього через ContentResolver та Uri. Системний медіа-сканер — MediaScannerConnection — автоматично індексує всі файли на пристрої під час завантаження, підключення по USB або перезавантаження.

Медіа-база зберігається в системній базі даних і містить записи для кожного медіафайлу. Стовпці різняться для різних типів: у зображень є ORIENTATION та DATE_TAKEN, у відео — DURATION, у аудіо — ARTIST та ALBUM. Розробники можуть виконувати SQL-подібні запити через query з projection та selection для фільтрації.

kotlin
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 URI виду content://media/external/images/media/1234. Зовнішній URI вказує на спільне сховище, внутрішній — на системні медіафайли. Використання URI замість файлових шляхів — ключова перевага MediaStore: додаток не потребує доступу до файлової системи і працює через безпечний контент-провайдер.

Типи медіафайлів в MediaStore

MediaStore підтримує чотири основних типи медіа, кожен з окремою таблицею та набором метаданих. Розробники обирають потрібну таблицю залежно від типу контенту, з яким працює додаток.

  • MediaStore.Images — фотографії, скріншоти та малюнки. Стовпці: BUCKET_DISPLAY_NAME, IS_PRIVATE, LATITUDE, LONGITUDE.
  • MediaStore.Video — відеозаписи та фільми. Стовпці: DURATION, RESOLUTION, IS_DRM.
  • MediaStore.Audio — музичні треки та звукові файли. Стовпці: ARTIST, ALBUM, COMPOSER, TRACK.
  • MediaStore.Files — документи та інші файли. Доступний з Android 10 для спільного доступу.

Поміж стандартних стовпців, кожна таблиця містить системні поля: _ID, DATA (застаріло), SIZE, MIME_TYPE, DATE_ADDED, DATE_MODIFIED. З версії Android 10 поле DATA позначено як застаріло, і розробники повинні працювати через відкриття InputStream по URI.

Дозволи для роботи з MediaStore

MediaStore вимагає явних дозволів, які різняться в залежності від версії Android. До Android 13 використовувалося єдине READ_EXTERNAL_STORAGE. Починаючи з Android 13 (API 33), Google запровадив гранулярні дозволи для кожного типу медіа.

Тип медіаДозвіл (API 33+)Старий (API 29-32)
ЗображенняREAD_MEDIA_IMAGESREAD_EXTERNAL_STORAGE
ВідеоREAD_MEDIA_VIDEOREAD_EXTERNAL_STORAGE
АудіоREAD_MEDIA_AUDIOREAD_EXTERNAL_STORAGE
ЗаписWRITE_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE

Запис в MediaStore також потребує WRITE_EXTERNAL_STORAGE для Android 9 та нижче. Починаючи з Android 10, додаток може записувати свої файли в MediaStore без додаткових дозволів — система автоматично надає доступ при вставці запису через ContentResolver.insert.

Запит дозволів в рантаймі

Дозволи MediaStore запитуються через стандартний механізм ActivityResultContracts.RequestMultiplePermissions. Користувач може відхилити запит, і додаток повинен коректно обробити цей сценарій. Рекомендується перевіряти наявність дозволу через ContextCompat.checkSelfPermission перед кожним зверненням до MediaStore.

Приклади коду: читання та запис через MediaStore

MediaStore дозволяє не лише читати, але й записувати медіафайли. Для запису зображення або відео розробник використовує ContentResolver.insert і відкриває OutputStream по поверненому URI. Система автоматично додає файл в медіа-базу та індексує його.

kotlin
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 ->
        // записати байти в потік
    }
}

Видалення медіафайлів через MediaStore

Видалення виконується через ContentResolver.delete із зазначенням URI файлу. Система перевіряє права доступу: якщо файл належить поточному додатку, видалення відбувається без додаткових дозволів. Для файлів інших додатків на Android 10+ потрібне підтвердження користувача через системний діалог.

MediaStore проти прямого файлового доступу

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?

MediaStore API — це системний контент-провайдер Android для доступу до медіафайлів пристрою: зображень, відео, аудіо та документів. API надає єдиний інтерфейс через ContentResolver та медіа-базу, яка автоматично індексує всі файли.

Які типи медіа підтримує MediaStore?

MediaStore підтримує Images (зображення), Video (відео), Audio (аудіо) та Files (документи). Кожен тип має окрему таблицю з власним набором метаданих: у зображень є ORIENTATION, у відео — DURATION, у аудіо — ARTIST.

Які дозволи потрібні для MediaStore на Android 13?

На Android 13+ використовуються гранулярні дозволи: READ_MEDIA_IMAGES для зображень, READ_MEDIA_VIDEO для відео та READ_MEDIA_AUDIO для аудіо. Користувач може надати доступ лише до певних типів медіа.

Як записати файл через MediaStore?

Для запису створіть ContentValues з іменем та MIME-типом, викличіть ContentResolver.insert для отримання URI, потім відкрийте OutputStream через ContentResolver.openOutputStream. Система автоматично індексує новий файл.

Чим MediaStore відрізняється від Storage Access Framework?

MediaStore надає програмний доступ до всіх медіафайлів пристрою через медіа-базу. Storage Access Framework відкриває системний діалог вибору файлу та повертає URI — користувач обирає конкретний файл або папку.

Підсумки

  • MediaStore API — основний механізм доступу до медіафайлів Android, що працює через контент-провайдер та медіа-базу.
  • Медіа-база автоматично індексує зображення, відео, аудіо та документи, надаючи доступ до метаданих через ContentResolver.
  • Android 10 зробив MediaStore єдиним способом доступу до спільних медіафайлів, обмеживши прямий файловий доступ.
  • Android 13 запровадив гранулярні дозволи READ_MEDIA_IMAGES, READ_MEDIA_VIDEO та READ_MEDIA_AUDIO замість єдиного READ_EXTERNAL_STORAGE.
  • Content URI замінюють файлові шляхи, забезпечуючи безпечний доступ без root-прав до файлів інших додатків.
  • Запис через MediaStore виконується через ContentResolver.insert та openOutputStream з автоматичною індексацією в медіа-базі.
  • Вибір між MediaStore та SAF залежить від завдання: MediaStore — для пакетної роботи з медіа, SAF — для вибору окремих файлів користувачем.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також