Android использует файловую систему, аналогичную дисковым файловым системам на других платформах. Система предоставляет несколько вариантов сохранения данных приложений:
- Хранилище, предназначенное только для приложения: храните файлы, предназначенные исключительно для использования вашим приложением, либо в выделенных каталогах внутри внутреннего тома памяти, либо в других выделенных каталогах во внешнем хранилище. Используйте каталоги во внутренней памяти для сохранения конфиденциальной информации, к которой другие приложения не должны иметь доступа.
- Общее хранилище: храните файлы, которыми ваше приложение планирует делиться с другими приложениями, включая медиафайлы, документы и другие файлы.
- Настройки: Хранить приватные, примитивные данные в парах ключ-значение.
- Базы данных: Храните структурированные данные в частной базе данных, используя библиотеку персистентности Room.
Характеристики этих вариантов суммированы в следующей таблице:
| Тип контента | метод доступа | Требуются разрешения | Могут ли другие приложения получить к ним доступ? | Файлы удаляются при удалении приложения? | |
|---|---|---|---|---|---|
| Файлы, специфичные для приложения | Файлы предназначены исключительно для использования вашим приложением. | Из внутренней памяти getFilesDir() или getCacheDir()Из внешнего хранилища: getExternalFilesDir() или getExternalCacheDir() | Никогда не требуется для внутреннего хранения Внешнее хранилище не требуется, если ваше приложение используется на устройствах под управлением Android 4.4 (уровень API 19) или выше. | Нет | Да |
| СМИ | Медиафайлы, которыми можно делиться (изображения, аудиофайлы, видео). | API MediaStore | READ_EXTERNAL_STORAGE применяется при доступе к файлам других приложений на Android 11 (уровень API 30) или выше.При доступе к файлам других приложений на Android 10 (уровень API 29) применяются READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGEДля всех файлов в Android 9 (уровень API 28) или более ранних версиях требуются разрешения. | Да, хотя другому приложению требуется разрешение READ_EXTERNAL_STORAGE | Нет |
| Документы и другие файлы | Другие типы контента, которыми можно делиться, включая загруженные файлы. | Структура доступа к хранилищу | Никто | Да, через средство выбора файлов системы. | Нет |
| Настройки приложения | Пары ключ-значение | Библиотека настроек Jetpack | Никто | Нет | Да |
| База данных | Структурированные данные | Библиотека сохранения состояния комнаты | Никто | Нет | Да |
Выбор решения зависит от ваших конкретных потребностей:
- Сколько места занимают ваши данные?
- Встроенная память имеет ограниченное пространство для данных, относящихся к конкретным приложениям. Используйте другие типы памяти, если вам необходимо сохранить значительный объем данных.
- Насколько надежным должен быть доступ к данным?
- Если для базовой функциональности вашего приложения требуются определенные данные, например, при запуске, разместите эти данные во внутренней памяти или в базе данных. Файлы, специфичные для приложения и хранящиеся во внешней памяти, не всегда доступны, поскольку некоторые устройства позволяют пользователям отключать физическое устройство, соответствующее внешней памяти.
- Какие данные вам необходимо хранить?
- Если у вас есть данные, имеющие значение только для вашего приложения, используйте хранилище, предназначенное для конкретного приложения. Для медиаконтента, которым можно делиться, используйте общее хранилище, чтобы другие приложения могли получить к нему доступ. Для структурированных данных используйте либо настройки (для данных типа «ключ-значение»), либо базу данных (для данных, содержащих более 2 столбцов).
- Должны ли данные быть конфиденциальными только для вашего приложения?
- При хранении конфиденциальных данных — данных, которые не должны быть доступны из других приложений, — используйте внутреннюю память, настройки или базу данных. Внутреннее хранилище имеет дополнительное преимущество: данные скрыты от пользователей.
Категории мест хранения
Android предоставляет два типа физического хранилища: внутреннюю и внешнюю память . На большинстве устройств внутренняя память меньше внешней. Однако внутренняя память всегда доступна на всех устройствах, что делает её более надёжным местом для хранения данных, от которых зависит ваше приложение.
Съемные устройства, такие как SD-карты, отображаются в файловой системе как часть внешнего хранилища. Android представляет эти устройства с помощью пути, например, /sdcard .
Приложения по умолчанию хранятся во внутренней памяти. Однако, если размер вашего APK-файла очень велик, вы можете указать в файле манифеста приложения параметр установки приложения на внешнее хранилище:
<manifest ... android:installLocation="preferExternal"> ... </manifest>
Права доступа и доступ к внешнему хранилищу
В Android определены следующие разрешения, связанные с хранилищем: READ_EXTERNAL_STORAGE , WRITE_EXTERNAL_STORAGE и MANAGE_EXTERNAL_STORAGE .
В более ранних версиях Android приложениям требовалось заявить разрешение READ_EXTERNAL_STORAGE для доступа к любым файлам за пределами каталогов, относящихся к приложению, на внешнем хранилище. Кроме того, приложениям требовалось заявить разрешение WRITE_EXTERNAL_STORAGE для записи в любые файлы за пределами каталогов, относящихся к приложению.
В более новых версиях Android при определении возможности приложения получать доступ к файлу и записывать в него данные большее значение имеет его назначение, чем местоположение. В частности, если ваше приложение ориентировано на Android 11 (уровень API 30) или выше, разрешение WRITE_EXTERNAL_STORAGE не влияет на доступ вашего приложения к хранилищу. Такая модель хранения данных, основанная на назначении файла, повышает конфиденциальность пользователей, поскольку приложениям предоставляется доступ только к тем областям файловой системы устройства, которые они фактически используют.
В Android 11 представлено разрешение MANAGE_EXTERNAL_STORAGE , предоставляющее доступ на запись к файлам за пределами каталога приложения и MediaStore . Чтобы узнать больше об этом разрешении и о том, почему большинству приложений не нужно его объявлять для выполнения своих задач, см. руководство по управлению всеми файлами на устройстве хранения.
Ограниченное хранение
Чтобы предоставить пользователям больший контроль над своими файлами и ограничить их захламленность, приложениям, ориентированным на Android 10 (уровень API 29) и выше, по умолчанию предоставляется ограниченный доступ к внешнему хранилищу, или «ограниченное хранилище» . Такие приложения имеют доступ только к каталогу, специфичному для приложения, на внешнем хранилище, а также к определенным типам медиафайлов, созданных приложением.
Используйте хранилище с ограниченной областью доступа, если только вашему приложению не требуется доступ к файлу, хранящемуся вне каталога, предназначенного для конкретного приложения , и вне каталога, к которому имеют доступ API MediaStore . Если вы храните файлы, предназначенные для конкретного приложения, на внешнем хранилище, вы можете упростить внедрение хранилища с ограниченной областью доступа, разместив эти файлы в каталоге, предназначенном для конкретного приложения, на внешнем хранилище . Таким образом, ваше приложение сохранит доступ к этим файлам, когда хранилище с ограниченной областью доступа будет включено.
Чтобы подготовить ваше приложение к использованию хранилища с ограниченной областью действия, ознакомьтесь с руководством по вариантам использования хранилища и передовым методам работы . Если ваше приложение имеет другой вариант использования, не охватываемый хранилищем с ограниченной областью действия, отправьте запрос на добавление функции . Вы можете временно отказаться от использования хранилища с ограниченной областью действия .
Просмотр файлов на устройстве
Для просмотра файлов, хранящихся на устройстве, используйте файловый менеджер устройства Android Studio.
Дополнительные ресурсы
Для получения дополнительной информации о хранении данных обратитесь к следующим ресурсам.