Как работает 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 — там папка видна напрямую.
Практические способы доступа к загрузкам (для разработчиков)
- 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 */ } }
- 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)
- 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».