Android использует файловую систему, похожую на файловые системы на основе дисков на других платформах. Система предоставляет несколько вариантов сохранения данных вашего приложения:
- Хранилище, специфичное для приложения: храните файлы, предназначенные только для использования вашим приложением, либо в выделенных каталогах во внутреннем томе хранилища, либо в различных выделенных каталогах во внешнем хранилище. Используйте каталоги во внутреннем хранилище для сохранения конфиденциальной информации, к которой другие приложения не должны иметь доступа.
- Общее хранилище: храните файлы, которыми ваше приложение намерено поделиться с другими приложениями, включая медиафайлы, документы и другие файлы.
- Настройки: Хранить частные, примитивные данные в парах ключ-значение.
- Базы данных: храните структурированные данные в частной базе данных с помощью библиотеки сохранения Room.
Характеристики этих вариантов приведены в следующей таблице:
Тип контента | Метод доступа | Требуются разрешения | Могут ли другие приложения получить доступ? | Файлы удаляются при удалении приложения? | |
---|---|---|---|---|---|
Файлы, специфичные для приложения | Файлы предназначены только для использования вашим приложением. | Из внутреннего хранилища, getFilesDir() или getCacheDir() Из внешнего хранилища: getExternalFilesDir() или getExternalCacheDir() | Никогда не требуется для внутреннего хранения Не требуется внешнее хранилище, если ваше приложение используется на устройствах под управлением Android 4.4 (API уровня 19) или выше. | Нет | Да |
СМИ | Совместно используемые медиафайлы (изображения, аудиофайлы, видео) | API MediaStore | READ_EXTERNAL_STORAGE при доступе к файлам других приложений на Android 11 (уровень API 30) или вышеREAD_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE при доступе к файлам других приложений на Android 10 (уровень API 29)Разрешения требуются для всех файлов на 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.
Дополнительные ресурсы
Дополнительную информацию о хранении данных можно найти в следующих ресурсах.