Хранение данных и файлов
Устройство на Android содержит в себе набор приложений.

Хранение файлов и данных можно условно разделить на две группы: во внутреннем или внешнем хранилище.
Каждое приложение хранит свой набор файлов, например, файлы базы данных или файлы настроек. Обычно файлы хранятся во внутреннем хранилище устройства и доступны только самому приложению.

Приложение может также иметь собственные документы, картинки, музыку. Они занимают больше места, поэтому для приложения выделяется место во внешнем хранилище. Но доступ к файлам остаётся прежним — только самому приложению.

При деинсталляции приложения все файлы из хранилищ будут удалены.
Но изолированные файлы не всегда удобны для пользователя. Ведь мы хотим взаимодействовать с ними. Например, поделиться фотографией своего кота через месседжер. Поэтому на устройстве есть особое хранилище — Shared storage (разделяемое хранилище).

Android поддерживает различные варианты хранения данных и файлов.
- Специфичные для приложения файлы. Доступ к файлам имеет только приложение, их создавшее. Файлы могут находиться во внутреннем и внешнем хранилище. У других приложений нет доступа (кроме случаев, когда файлы хранятся на внешнем хранилище). Методы getFilesDir(), getCacheDir(), getExternalFilesDir(), getExternalCacheDir(). Разрешений на доступ не требуется. Файлы удаляются, когда приложение удаляется пользователем.
- Разделяемое хранилище. Приложение может создавать файлы, которыми готово поделиться с другими приложениями — медиафайлы (картинки, видео, аудио), документы. Для медифайлов требуется разрешение READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE.
- Настройки. Хранение простых данных по принципу ключ-значение. Доступно внутри приложения. Реализовано через Jetpack Preferences. Настройки удаляются, когда приложение удаляется пользователем.
- Базы данных. Хранение данных в SQLite. На данный момент реализовано через библиотеку Room. Доступ только у родного приложения.
В зависимости от ваших потребностей, нужно выбрать нужный вариант хранения данных.
Следует быть осторожным при работе с внутренним и внешним хранилищем. Внутренне хранилище всегда есть в системе, но оно может быть не слишком большим по объёму. Вдобавок к внутреннему хранилищу, устройство может иметь внешнее хранилище. В старых моделях таким хранилищем выступала съёмная SD-карта. Сейчас чаще используют встроенную и недоступную для извлечения флеш-память. Если ваше приложение слишком большое, можно попросить систему устанавливать программу во внешнее хранилище, указав просьбу в манифесте.
В разных версиях Android требования к разрешению для работы с внешним хранилищем постоянно менялись. На данный момент (Android 10, API 29) требования выглядят следующим образом.
Приложение может иметь доступ к собственным файлам, которые находятся во внешнем хранилище. Также может получить доступ к определённым общим файлам на внешнем хранилище.
Доступ к общим файлам достигается через FileProvider API или контент-провайдеры.
Для просмотра файлов через студию используйте инструмент Device File Explorer.
Внешняя карта памяти
Когда появились первые устройства на Android, то практически у всех были внешние карточки памяти, которые вставлялись в телефон. Обычно там хранили фотки, видео и свои файлы. Всё было понятно — были различные методы для доступа к файловой системе. А потом началась чехарда. В телефонах также была и собственная «внешняя» память. Она вроде как и внешняя, но вставлена на заводе и вытащить её пользователь не мог, т.е. практически внутренняя. Затем пошла мода на телефоны, у которых была только такая внутреннее-внешняя карта. Пользователи поворчали, но привыкли. Сейчас встречаются оба варианта. Как правило, у телефонов с спрятанной картой больше памяти и выше степень водонепроницаемости.
Подобные фокусы с картой породили и другую проблему — Гугл озаботился безопасностью файлов и стала думать, как осложнить жизнь разработчику. С выходом каждой новой версии системы компания то давала добро на полный доступ к карточке, то ограничивала, то давала права с ограничениями, то откатывала свои решения назад. Короче, запутались сами и запутали всех.
Попробуем немного разобраться с этим зоопарком. Но помните, что процесс путаницы продолжается.
При подготовке материала я опирался на письма некоторых читателей сайта, которые присылали свои мысли по этому поводу. Спасибо им за структуризацию материала.
Вот что я (кажется) понял, попытавшись загрузить картинку с внешней SD карточки.
External это не External
«EXTERNAL_STORAGE» называется так не потому, что это внешняя память по отношению к устройству, а потому что она выглядит как внешняя память для компьютера, если устройство подключить кабелем к компьютеру. Причём именно выглядит, потому что обмен идёт по протоколу MTP – устройство только показывает компьютеру список папок и файлов, а при необходимости открыть или скопировать файл он специально загружается на компьютер, в отличие от настоящей флешки, файлы которой становятся файлами в файловой системе самого компьютера. Обмен по MTP позволяет устройству продолжать работать, когда оно подключено к компьютеру.
Emulated это не Emulated
Сначала я пытался прочесть файл с карточки на эмуляторе (из этого так ничего и не вышло). Функция getExternalStorageDirectory() давала мне /storage/emulated/0, и я думал, что «emulated» – это потому что на эмуляторе. Но когда я подцепил реальный планшет, слово «emulated» никуда не исчезло. Я стал рыться в интернете и обнаружил, что «Emulated storage is provided by exposing a portion of internal storage through an emulation layer and has been available since Android 3.0.» – то есть это просто кусок внутренней памяти, которая путём какой-то эмуляции делается доступной для пользователя, в отличие от собственно внутренней памяти.
При этом с точки зрения системы доступная для пользователя папка называется /storage/emulated/0, а при подключении к компьютеру по USB это просто одна из двух главных папок устройства – у меня в Windows Explorer она называется Tablet. Вторая папка у меня называется Card, и это и есть настоящая внешняя карточка.
Нет стандартных средств добраться из приложения до файлов на внешней карточке. Все попытки добраться до настоящей внешней карточки делаются с помощью неких трюков. Самое интересное, что я нашел, это статья на http://futurewithdreams.blogspot.com/2014/01/get-external-sdcard-location-in-android.html — парень читает таблицу смонтированных устройств /proc/mounts, таблицу volume daemons /system/etc/vold.fstab, сравнивает их и выбирает те тома, которые оказываются съёмными (с помощью Environment.isExternalStorageRemovable()).
Оказалось, что несистемным приложениям в принципе запрещено напрямую обращаться к съёмной карточке! Похоже, что это было так всегда, но вот начиная с версии Android 6 Marshmallow написано: внешняя карточка может быть определена как Portable либо Adoptable. Adoptable – это как бы «усыновляемая» память которая может быть «adopted», то есть взята в систему (примерно как кот с улицы в дом – это тоже называется to adopt) и использована как внутренняя. Для этого ее надо особым образом отформатировать и не вынимать, иначе не факт, что система продолжит нормально работать.
Portable – это нормальная съёмная карточка, но несистемным приложениям запрещено обращаться из программ к файлам на ней! Вот что написано в https://source.android.com/devices/storage/traditional.html:
Android 6.0 supports portable storage devices which are only connected to the device for a short period of time, like USB flash drives. When a user inserts a new portable device, the platform shows a notification to let them copy or manage the contents of that device. In Android 6.0, any device that is not adopted is considered portable. Because portable storage is connected for only a short time, the platform avoids heavy operations such as media scanning. Third-party apps must go through the Storage Access Framework to interact with files on portable storage; direct access is explicitly blocked for privacy and security reasons.
Если я правильно понял, этот самый Storage Access Framework позволяет работать с документом на карточке через диалог (открыть файл/сохранить файл), а вот прочитать или записать файл на карточке непосредственно из программы невозможно.
Общий вывод – реально из программы можно работать только с файлами на предоставляемой пользователю части встроенной памяти устройства, а на съёмной карточке – нет.
Это напоминает войну Microsoft с пользователями и разработчиками по поводу диска C:, компания уговаривала не устраивать беспорядок в корне этого диска, а ещё лучше — перенести свои файлы на другой диск. Но явных запретов не было.
Состояние на текущий момент
Гугл утверждает, что с версии Android 10 Q стандартный доступ к файлам будет прекращён. Ещё в Android 4.4 появился Storage Access Framework, который и должен стать заменой для работы с файлами.
Методы Environment.getExternalStorageDirectory() и Environment.getExternalStoragePublicDirectory() признаны устаревшими и будут недоступны. Даже если они будут возвращать корректные значения, ими вы не сможете воспользоваться.
В Android 7.0 добавили исключение FileUriExposedException, чтобы разработчики перестали использовать схему file://Uri.
Можно создавать файлы в корневой папке карточки при помощи Environment.getExternalStorageDirectory(), а также папки с вложенными файлами. Если папка уже существует, то у вас не будет доступа на запись (если это не ваша папка).
Если вы что-то записали, то сможете и прочитать. Чужое читать нельзя.
Кстати, разрешения на чтение и запись файлов не требуются, а READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE объявлены устаревшими.
Другие приложения не могут получить доступ к файлам вашего приложения. Файлы, которые вы создали через getExternalFilesDir(), доступны через Storage Access Framework, кроме файлов, созданных в корне карточки (что-то я совсем запутался). Ещё можно дать доступ через FileProvider.
При подключении USB-кабеля через getExternalFilesDir(), вы можете увидеть свои файлы и папки, а также файлы и папки пользователя. При этом файлы и папки пользователя на корневой папке вы не увидите. Вам не поможет даже adb или Device File Explorer студии.
Что делать?
Пользуйтесь методами класса Context, типа getExternalFilesDir(), getExternalCacheDir(), getExternalMediaDirs(), getObbDir() и им подобными, чтобы найти место для записи.
Используйте Storage Access Framework.
Используйте MediaStore для мультимедийных файлов.
Используйте FileProvider, чтобы файлы были видимы другим приложениям через ACTION_VIEW/ACTION_SEND.
Android 10: Появился новый флаг android:allowExternalStorageSandbox=»false» и метод Environment.isExternalStorageSandboxed() для работы с песочницей. Флаг android:requestLegacyExternalStorage=»true» для приложений, которые ещё используют старую модель доступа к файлам.
Как временное решение можно добавить в блок манифеста application атрибут android:requestLegacyExternalStorage=»true», чтобы доступ к файлам был как раньше в Android 4.4-9.0.
Android 11
Если вы создаёте файловый менеджер, то ему нужны возможности для просмотра файлов. Для этого следует установить разрешение MANAGE_EXTERNAL_STORAGE или использовать атрибут android:requestLegacyExternalStorage=»true» (см. выше).
Мобильное приложение ESMART® Конфигуратор
ESMART® Конфигуратор позволяет настраивать считыватели ESMART® Reader без демонтажа.
Пользователи могут изменить режимы чтения физических и мобильных идентификаторов, настройки Wiegand, а так же звуковой и световой индикации.
Пользовательские конфигурации

Теперь вы можете создавать и хранить конфигураций внутри приложения для всех моделей считывателей, которые находятся в продаже. Для этого в приложении реализована удобная структура меню, разделенная на Серии, Линейки и размеры корпуса устройств (обычный или mullion).
Настройка Карт
Производите настройку каждого из поддерживаемых считывателем идентификаторов, выбирая именно тот режим работы, который требуется на объекте. Можно выбрать чтение UID, работу с памятью карты в режиме DATA или запретить чтение карт такого типа.

Для каждого типа карты, с учетом длины считанных данных, реализована возможность настройки формата и порядка передачи. Пользователь может выбрать один из предустановленных форматов или настроить свой:
– Magic, формат совместимый с большинством СКУД контроллеров
– Прямой порядок байт, данные будут переданы ровно так, как считаны с карты
– Обратный порядок байт, данные будут перевернуты
– Свой, в этом режиме вы сможете самостоятельно настроить порядок передаваемых байт с помощью удобного интерфейса по-байтово, а так же добавить префиксы или постфиксы в виде фиксированных значений, если это требуется.

Настройка чтения шифрованных данных для карт MIFARE®
Долгожданная функция для пользователей и объектов с повышенным уровнем безопасности. Нередко наши заказчики не хотели передавать ключи шифрования от собственных объектов в службу технической поддержки ESMART®, руководствуясь требованиями к безопасности. Для таких запросов мы реализовали возможность задавать ключи шифрования внутри приложения и производить настройку работы с памятью карт MIFARE® ID, Classic, Plus (SL1) и карт MIFARE® Plus (SL3) самостоятельно.
Пользователи имеют возможность создания ключа шифрования (Crypto1 или AES128), выбора сектора и блока данных, смещения данных внутри блока, их длины, а так же порядка передаваемых байт. Для удобства мы реализовали регулятор, который позволяет выбрать объем памяти чипа и не ошибиться в выборе сектора и блока.

Ключи шифрования
Ключи шифрования, после создания, доступны в разделе приложения Ключи и могут использования для любых моделей считывателей. При создании ключа, его можно сгенерировать или ввести самостоятельно.

Приложение не обменивается и не пересылает данные через интернет и может работать, даже тогда, когда телефон находится в Авиарежиме. Данные хранятся внутри и передаются в зашифрованном виде, поэтому вы можете не беспокоиться за их сохранность.
Дополнительной гарантией служит бейдж о Конфиденциальности, выданный специалистами App Store. Бейдж находится на странице приложения в разделе Конфиденциальность приложения и поясняет, что приложение не ведет сбор пользовательских данных.

Интерфейсы
Приложение позволяет настроить параметры интерфейса передачи данных. Для считывателей с Wiegand интерфейсом можно выбрать одну из распространенных предустановленных настроек Wiegand 26 или Wiegand 34, а так же самостоятельно настроить выходной интерфейс, задав Длину данных (от 2 до 255 байт), включить или выключить биты четности, а так же настроить временные параметры интерфейса, такие как: Ширину импульса и Интервал между импульсами. Для удобства пользователя интерфейс отображает формат Wiegand, который получается после настроек, а так же информирует о рекомендуемых стандартом параметрах.
Настройка Bluetooth и Индикации
Приложение постоянно будет получать обновления и в следующем релизе мы планируем внедрить возможность настройки параметров Bluetooth для настройки дальности, а так же настройки световой и звуковой индикации считывателя. Следите за обновлениями.
На момент, пока следующая версия приложения не запущена вы можете, как и раньше, запрашивать требуемые настройки Bluetooth и Индикации у специалистов Технической Поддержки ESMART® письмом на help@esmart.ru
Раздел объекты
Для удобства сортировки и хранения конфигураций внутри приложения мы разработали новый раздел – Объекты. В этом разделе пользователь имеет возможность создания объектов с уникальным именем и фотографией. После создания объекта появляется возможность привязки конфигураций к нему, для этого нажмите на саму конфигурацию, а затем свяжите ее с созданным объектом. Привязанные к объекту конфигурации можно увидеть в разделе По объектам для соответствующей модели считывателей.

Функцию удобно использовать, когда конфигурирование происходит на разных объектах или в пределах одного распределенного объекта, в таком случае удобно разделять конфигурации считывателей на группы. Мы будем рады обратной связи от монтажных организаций, о том, как можно сделать эту функцию еще более удобной.
Важным замечанием по функции самостоятельного конфигурирования является ограничение на поддерживаемые устройства. Функция самостоятельного конфигурирования поддерживается всеми считывателями, начиная с прошивки 2.24.х.х. Такие считыватели мы начали выпускать одновременно с запуском устройств в корпусе mullion в Мае 2021. Считыватели, которые имеют прошивку ниже версии 2.24.х.х, как и раньше, поддерживают конфигурации, созданные специалистами Технической Поддержки ESMART® по запросу на help@esmart.ru

Введенное ограничение сделано с учетом нашей аналитики – устройства, уже установленные на запущенных объектах конфигурируют очень редко, а изменения которые все-таки могут вноситься обычно не касаются глобальных настроек Интерфейсов или Карт. При этом те объекты, которые планируются к запуску почти всегда требуют настройки, для таких объектов приобретаются новые устройства с прошивкой 2.24.х.х, которая поддерживает самостоятельное конфигурирование.
Мы открыты к обратной связи и будем ждать ваших запросов на самостоятельное конфигурирование устройств с прошивкой ниже 2.24.х.х. В случае если запросов будет много – мы будем готовы рассмотреть возможность открытия функции и для ранее выпущенных устройств.
iOS и Android
Первым обновленную версию ESMART® Конфигуратор 2.0 получает платформа iOS, следом за ней, в ближайшее время, мы выпустим версию и для Android. Следите за обновлениями приложения в Google Play.
Новые Мастер Карты
Мы реализовали еще одну удобную функцию для всех устройств с прошивкой 2.24.Х.Х и выше. В комплекте с ними идут обновленные Мастер Карты, которые поддерживают функцию записи конфигурации и выступают в качестве защищенного носителя конфигураций.

Использовать обновленную Мастер Карту удобно на объектах, для которых заказана общая Мастер Карта на весь объект. В этом случае для конфигурирования всех устройств на объекте проходит очень быстро, нужно провести минимум операций:
– Создать Конфигурацию внутри приложения или получить ее от Технической Поддержки ESMART®.
– Записать Конфигурацию на Мастер Карту с помощью телефона по NFC (поддерживаются iPhone 7, 8, X, Xs, Xr, 11, 11 Pro, 12, 12 Pro и выше)
– Поочередно подносить Мастер Карту к каждому считывателю два раза (после первого раза считыватель войдет в режим Конфигурирования, на второе поднесение, применит Конфигурацию пользователя, сохраненную на Мастер карту).
Как начать пользоваться
1. Скачать приложение
Скачайте мобильное приложение ESMART ® Конфигуратор на мобильный телефон. Для скачивания пройдите по ссылке www.esmart.ru/configurator с вашего мобильного устройства. Будет произведено автоматическое перенаправление на соответствующий платформе iOS или Android магазин приложений.
2. Создать конфигурацию
Создайте конфигурацию с требуемыми параметрами под вашу модель считывателя, выбрав ее в меню или получите конфигурацию с требуемыми параметрами, отправив запрос на help@esmart.ru в свободой форме. После подготовки конфигурации, откройте письмо, полученное от специалистов Технической поддержки ESMART®. Нажмите на вложенный файл конфигурации и выберите приложение ESMART® Конфигуратор из предложенного списка программ.
3. Применить конфигурацию
На экране конфигурации нажмите кнопку «Записать» и выберите способ записи конфигурации:
В Мастер Карту по NFC* (для всех моделей считывателей):
1. Поднесите Мастер Карту к телефону и дождитесь сообщения об успешной записи конфигурации
2. Поднесите Мастер Карту к считывателю на 2 секунды, дождавшись входа в режим конфигурирования, считыватель начнем мигать синим цветом
3. Поднесите Мастер Карту к считывателю повторно, устройство будет сконфигурировано
* – Доступно только для iOS
В считыватель по Bluetooth (кроме Линейки LITE):
1. Приложение предложит поднести телефон к считывателю (поднесите), на экране появится информации о Мастер Карте
2. Поднесите Мастер Карту к считывателю на 2 секунды, дождавшись входа в режим конфигурирования, считыватель начнем мигать синим цветом
3. В приложении нажмите кнопку «Сконфигурировать» (в правом верхнем углу)
4. Конфигурация будет загружена в считыватель, устройство будет сконфигурировано.
![]() |
|
| Буклет ESMART® Конфигуратор Конфигурирование без домонтажа |
Техническая поддержка ESMART® Reader.
Обращайтесь по любым вопросам.
Позвонить: +7 (495) 133-00-13 добавочный 250
Куда положить файлы, чтобы их можно было читать и видоизменять?
Мне нужно сделать так, чтобы у меня непосредственно в приложении андроид лежали файлы по типу .json . Куда их положить — я знаю всего два места, это папка raw и assets , прочитать содержимое у меня получилось отлично, а вот заменить значения у меня не получается. Узнал только, что в папке raw хранятся ресурсы и их не получится изменять и дополнять непосредственно во время работы приложения, а про паку assets такой информации не нашел. Может я конечно не так открываю:
var JSON_STRING_OF_COMPL = assets.open("complite")
При попытке найти функцию write какую-нибудь, мне предлагается только .bufferedReader() , либо не так открываю под запись, либо нужно в другое место класть, только вот куда — не знаю.
Отслеживать
8,586 4 4 золотых знака 21 21 серебряный знак 36 36 бронзовых знаков
задан 25 авг 2022 в 22:25
Миша Вдовичев Миша Вдовичев
Введение
Хотя возможности хранения и обработки мобильных устройств увеличиваются, телефоны и планшеты по-прежнему отстают от своих настольных и ноутбуковых коллег. По этой причине стоит запланировать архитектуру хранилища данных для приложения, а не просто предположить, что база данных является правильным ответом все время. Существует ряд различных вариантов, которые соответствуют различным требованиям, таким как:
- Настройки — Android предлагает встроенный механизм хранения простых пар «ключ-значение» данных. Если вы храните простые параметры пользователя или небольшие фрагменты данных (например, сведения о персонализации), используйте собственные функции платформы для хранения этой информации.
- Текстовые файлы — входные данные пользователя или кэши скачаемого содержимого (например, HTML) можно хранить непосредственно в файловой системе. Используйте соответствующее соглашение об именовании файлов, чтобы упорядочить файлы и найти данные.
- Сериализованные файлы данных — объекты можно сохранять как XML или JSON в файловой системе. Платформа .NET включает библиотеки, которые упрощают сериализацию и десериализацию объектов. Используйте соответствующие имена для упорядочивания файлов данных.
- База данных — ядро СУБД SQLite доступно на платформе Android и полезно для хранения структурированных данных, которые необходимо запрашивать, сортировать или иным образом управлять. Хранилище базы данных подходит для списков данных со многими свойствами.
- Файлы изображений. Хотя двоичные данные можно хранить в базе данных на мобильном устройстве, рекомендуется хранить их непосредственно в файловой системе. При необходимости можно сохранить имена файлов в базе данных, чтобы связать изображение с другими данными. При работе с большими изображениями или большим количеством изображений рекомендуется спланировать стратегию кэширования, которая удаляет файлы, которые больше не нужно избежать использования всего места в хранилище пользователя.
Если база данных является правильным механизмом хранения для приложения, оставшаяся часть этого документа описывает, как использовать SQLite на платформе Xamarin.
Преимущества использования базы данных
Существует ряд преимуществ использования базы данных SQL в мобильном приложении:
- Базы данных SQL позволяют эффективно хранить структурированные данные.
- Конкретные данные можно извлечь с помощью сложных запросов.
- Результаты запроса можно сортировать.
- Результаты запроса можно агрегировать.
- Разработчики с существующими навыками базы данных могут использовать свои знания для разработки кода доступа к базе данных и данным.
- Модель данных из серверного компонента подключенного приложения может использоваться повторно (в целом или частично) в мобильном приложении.
SQLite ядро СУБД
SQLite — это ядро СУБД с открытым исходным кодом, которое было принято Google для своей мобильной платформы. Ядро СУБД SQLite встроено в обе операционные системы, поэтому для разработчиков не требуется дополнительных возможностей. SQLite хорошо подходит для кроссплатформенной разработки мобильных устройств, так как:
- Ядро СУБД является небольшим, быстрым и легко переносимым.
- База данных хранится в одном файле, который легко управлять на мобильных устройствах.
- Формат файла легко использовать на разных платформах: будь то 32-разрядные или 64-разрядные и большие или маленькие системы.
- Он реализует большую часть стандарта SQL92.
Так как SQLite предназначен для небольших и быстрых, есть некоторые предостережения по его использованию:
- Некоторые синтаксисы соединения OUTER не поддерживаются.
- Поддерживаются только таблицы RENAME и ADDCOLUMN. Вы не можете вносить другие изменения в схему.
- Представления доступны только для чтения.
Дополнительные сведения о SQLite можно узнать на веб-сайте — SQLite.org — однако все сведения, необходимые для использования SQLite с Xamarin, содержатся в этом документе и связанных примерах. Ядро СУБД SQLite поддерживается в Android с Android 2. Хотя этот раздел не описан, SQLite также доступен для использования в приложениях Windows Телефон и Windows.
Windows и Windows Phone
Связанные ссылки
- DataAccess Basic (пример)
- DataAccess Advanced (пример)
- Рецепты данных Android
- Доступ к данным Xamarin.Forms
