Что такое Scoped Storage?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое Scoped Storage?
Scoped Storage (ограниченное хранилище или хранилище с ограниченным доступом) — это важная модель безопасности и управления файлами, внедренная в Android 10 (API 29) и окончательно закрепленная в Android 11 (API 30). Она представляет собой фундаментальное изменение в том, как приложения взаимодействуют с файловой системой устройства, особенно с общими (external) хранилищами (обычно это SD-карта или эмулированное внутреннее хранилище).
Основная цель и философия
Традиционно, до Android 10, приложения, получив разрешение READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE, могли свободно читать и записывать файлы практически в любую директорию общего хранилища. Это создавало значительные риски:
- Уязвимости безопасности: вредоносное приложение могло сканировать и читать приватные данные других приложений (например, фотографии, документы).
- Загрязнение файловой системы: файлы приложений разбрасывались по разным директориям без четкой структуры, что затрудняло управление для пользователя.
- Сложность удаления данных: при удалении приложения его файлы часто оставались в хранилище, занимая место.
Scoped Storage решает эти проблемы путем внедрения модели ограничения доступа по принципу песочницы (sandbox). Каждое приложение получает выделенную, изолированную область ("scope") в общем хранилище для своих приватных файлов, и доступ к файлам других приложений строго контролируется.
Ключевые принципы Scoped Storage
- Приватное хранилище приложения (App-specific storage):
* Каждому приложению автоматически предоставляется директория в общем хранилище (`Android/media/<package-name>/` или `Android/data/<package-name>/`), доступная только этому приложению.
* Файлы здесь удаляются автоматически при удалении приложения пользователем.
```kotlin
// Получение пути к приватному внешнему хранилищу приложения
val appSpecificExternalDir = File(context.getExternalFilesDir(null), "myFile.txt")
```
2. Общие коллекции (Shared collections):
* Для работы с определенными типами медиа-файлов, которые логически принадлежат пользователю (фотографии, видео, музыка), система предоставляет специальные, хорошо структурированные коллекции (например, `MediaStore.Images`, `MediaStore.Video`, `MediaStore.Audio`).
* Доступ к ним осуществляется через **API `MediaStore`**, который заменяет прямые файловые операции.
```kotlin
// Запрос изображений через MediaStore (Android 10+)
val projection = arrayOf(MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME)
val cursor = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
null,
null,
null
)
```
3. Контролируемый доступ к другим файлам:
* Приложение **не может** напрямую читать или писать файлы в произвольных местах общего хранилища (например, в `Downloads` или в директориях других приложений).
* Для работы с не-медиа файлами из других мест используется система **интентов и `Storage Access Framework` (SAF)**. Пользователь через системный диалог выбирает конкретные файлы или директории, к которым приложение получает временный доступ.
```kotlin
// Использование Storage Access Framework для выбора файла
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "image/*"
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT)
```
Практические изменения для разработчика
- Миграция от прямых путей: Вместо использования
File(path)и абсолютных путей (/storage/emulated/0/Downloads/) необходимо переходить наMediaStore,SAFили работу с app-specific директориями. - Новые разрешения: Разрешение
WRITE_EXTERNAL_STORAGEстало гораздо менее мощным и в Android 11 почти не требуется. Для доступа к медиафайлам в Android 11+ может потребоваться новое разрешениеMANAGE_EXTERNAL_STORAGE, которое дает широкий доступ, но его использование ограничено Google Play и требует специального одобрения (для приложений-файловых менеджеров, антивирусов). - Обратная совместимость: Для поддержки устройств ниже Android 10 часто используется флаг совместимости (
requestLegacyExternalStorage) в манифесте, позволяющий временно использовать старую модель на целевых устройствах.
Вывод
Scoped Storage — это эволюция Android в сторону более безопасной, чистой и пользовательско-ориентированной файловой системы. Она защищает данные пользователя, упрощает управление хранилищем и требует от разработчиков адаптации к новым, более структурированным API (MediaStore, SAF). Для современного разработчика понимание и правильная реализация Scoped Storage являются обязательными навыками, обеспечивающими не только безопасность приложения, но и его соответствие политикам Google Play.