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 ужесточил политику, полностью заблокировав прямой путь к shared-директориям.

Начиная с 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 (external) указывает на общее хранилище, внутренний (internal) — на системные медиафайлы. Использование 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 помечено как deprecated, и разработчики должны работать через открытие 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 ->
        // write bytes to stream
    }
}

Удаление медиафайлов через MediaStore

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

MediaStore vs прямой файловый доступ

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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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