Как работает Scoped Storage в Android 11 и где искать файлы в «Загрузках»

В двух словах: Android 11 ввёл Scoped Storage — приложения видят в основном свои app‑specific папки и публичные коллекции через API. Папка «Загрузки» физически есть (обычно /storage/emulated/0/Download), но доступ к её содержимому нужно получать через MediaStore.Downloads или через Storage Access Framework (SAF); полные права даёт только MANAGE_EXTERNAL_STORAGE и только в строго обоснованных случаях.

Что поменялось в Android 11 и зачем это важно

Scoped Storage ограничивает произвольный доступ к общему хранилищу. Это повышает приватность: приложение не может просто читать чужие файлы по пути. Для разработчика это значит:

  • Для фото/видео/аудио используйте MediaStore.
  • Для произвольных файлов либо MediaStore.Downloads, либо SAF (ACTION_OPEN_DOCUMENT / ACTION_OPEN_DOCUMENT_TREE).
  • MANAGE_EXTERNAL_STORAGE — крайняя мера, требует ручного включения пользователем и обоснования при публикации в магазине.

Если вы пользователь и не видите файл в «Загрузках», сначала откройте штатное приложение «Файлы» → «Загрузки» или подключитесь к ПК в режиме MTP — там папка видна напрямую.

Практические способы доступа к загрузкам (для разработчиков)

  1. MediaStore — для медиаконтента и многих случаев с файлами в Download:
  • Чтение/запись через ContentResolver и Uris.
  • Поддерживает RELATIVE_PATH для записи в каталог Downloads.

Пример записи в Downloads (Kotlin):

val values = ContentValues().apply {
  put(MediaStore.MediaColumns.DISPLAY_NAME, "report.pdf")
  put(MediaStore.MediaColumns.MIME_TYPE, "application/pdf")
  put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
}
val uri = contentResolver.insert(MediaStore.Downloads.getContentUri("external"), values)
uri?.let { contentResolver.openOutputStream(it)?.use { out -> /* write bytes */ } }
  1. Storage Access Framework (SAF) — если нужен выбор файла/папки пользователем или долгосрочный доступ:
  • ACTION_OPEN_DOCUMENT — выбрать файл.
  • ACTION_OPEN_DOCUMENT_TREE — выбрать папку и получить persistable URI permission.

Пример интента:

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
  addCategory(Intent.CATEGORY_OPENABLE)
  type = "*/*"
}
startActivityForResult(intent, REQUEST_CODE_OPEN)
  1. MANAGE_EXTERNAL_STORAGE — полные права, только при крайней необходимости:
  • Пользователь вручную включает «All files access» в настройках.
  • Нужна серьёзная бизнес‑логика и декларация при публикации приложения.

Не используйте приватные обходы и неофициальные API — это ненадёжно, может нарушить правила магазина и сломаться на разных устройствах.

Где искать загрузки как обычному пользователю

  • Откройте приложение «Файлы» → «Загрузки» (или отдельное приложение «Загрузки»).
  • Подключите телефон к компьютеру в режиме передачи файлов (MTP) — увидите папку Download.
  • Если скачивание выполнялось внутри приложения (браузер, почта), проверьте его внутреннюю папку — не все загрузчики помещают файл в общий Download.

Если файл вроде бы скачан, но не виден — очистите кэш приложения «Файлы» или перезапустите устройство; иногда система индексирует файлы с задержкой.

Частые ошибки

  • Попытка читать /storage/emulated/0/Download через File API — не работает для чужих файлов. Решение: MediaStore или SAF.
  • Ожидание, что /Android/data станет доступной — доступ к этим папкам ограничен по дизайну.
  • Неправильное использование MANAGE_EXTERNAL_STORAGE — без обоснования приложение может быть отклонено в магазине.

FAQ

  • Нужно ли мигрировать старый код на Scoped Storage? Да — если вы используете прямые File‑пути, переход на MediaStore/SAF обязателен для корректной работы на Android 11+.
  • Можно ли читать чужие файлы из Downloads без вмешательства пользователя? Обычно нет; используйте MediaStore или предложите пользователю выбрать файл через SAF.
  • Как тестировать поведение? Проверяйте на реальных устройствах и в разных сборках ОС: производители могут отличаться в реализации MTP и прав.

Контрольный список для разработчика

  • Используйте MediaStore для медиаконтента.
  • Для документов и пользовательского выбора — SAF с persistable permissions.
  • MANAGE_EXTERNAL_STORAGE — только при необходимости, с инструкциями для пользователя и заявлением в магазинах.
  • Тестируйте на разных устройствах и обрабатывайте ошибки доступа gracefully.

Коротко: Android 11 делает хранилище более приватным — адаптируйте приложение к MediaStore и SAF, а пользователям объясняйте, когда и зачем нужен «All files access».