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 ужесточил политику, полностью заблокировав прямой путь к shared-директориям.
Начиная с 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 вместо файловых путей — ключевое преимущество 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 ->
// write bytes to 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также