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