← Назад к вопросам

Что такое Scoped Storage?

1.8 Middle🔥 241 комментариев
#Android компоненты#Работа с данными

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое 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

  1. Приватное хранилище приложения (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.

Что такое Scoped Storage? | PrepBro