Internal storage что это

Содержание

Android Storage: Internal, External, Removable. Часть 1/3

Internal storage что это
Всем, кто, несмотря ни на что, сумел сделать правильный выбор.

Это перевод серии статей от Mark Murphy из CommonsWare, широко известного на stackoverflow, а так же автора книг “The Busy Coder’s Guide to Android Development”, “Android’s Architecture Components”. Некоторые термины оставлены не переведенными специально.

Internal Storage

Существует много путаницы в отношении модели хранилища Android. Путаницы стало значительно больше с изменениями Android 4.4 в Storage Model, и с тех пор ситуация не улучшилась. Есть бесчисленное множество вопросов на Stack Overflow и тому подобных ресурсах, где люди явно не совсем разбираются в различных моделях хранилищ Android.

То, что пользователи считают Internal Storage

В зависимости от модели вашего устройства пользователи в конечном итоге придут в «Настройки» –> «Хранилище на этом устройстве» (Settings –> Storage on their device) или в эквивалентном месте, и могут видеть экран, который описывает «Внутреннее хранилище».

Пользователь думает, что вся встроенная флешка — это «внутреннее хранилище» (Internal Storage). К счастью, Google начал менять этот термин с Android 8.0, перейдя к «general storage» вместо «internal storage».

Тем не менее, пользователи могут по-прежнему видеть «внутреннее хранилище» в таких местах, как окно проводника в Windows, когда их устройство подключено через USB.

Что Google считает Internal Storage

Увы, то, что видят пользователи это не то же самое, что Android SDK считает «внутренним хранилищем», что приводит к некоторой путанице. Если вы читали документацию на Android по внутреннему хранилищу, то это описание … как минимум туманно (прим. текст изменился со времени написания статьи):

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

По правде говоря, Android SDK определяет «внутреннее хранилище» как особый каталог, уникальный для вашего приложения, где ваше приложение может размещать файлы.

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

В Context есть несколько базовых методов, которые предоставляют вам доступ к внутреннему хранилищу, в том числе:

  • getCacheDir()
  • getDir()
  • getDatabasePath()
  • getFilesDir()
  • openFileInput()
  • openFileOutput()

Другие методы будут опираться на них, такие как openOrCreateDatabase(). Другие классы также будут полагаться на них, такие как SQLiteOpenHelper и SharedPreferences.

Где хранится Internal Storage … Иногда

Если вы просматриваете различные сообщения в блогах, ответы на StackOverflow и книги, выпущенные в 2012 году или ранее, вам сообщается, что «внутреннее хранилище» вашего приложения находится по адресу: /data/data/your.application.package.name.

Внутри будут некоторые каталоги, автоматически созданные Android, поскольку вы используете некоторые из методов Context. Например, getFilesDir() возвращает объект File, указывающий на каталог files/ во внутреннем хранилище вашего приложения.

Где хранится Internal Storage … Остальное время

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

NEVER HARDCODE PATHS.

Время от времени я вижу, что разработчики делают что-то вроде этого:

File f=new File(“/data/data/their.app.package.name/files/foo.txt”);

Это не преступление, это хуже, это — ошибка.

Правильный ход, да и писать меньше:

File f=new File(getFilesDir(), “foo.txt”);

Что еще более важно, внутреннее хранилище не всегда находится в одном месте. Примечательно, что у нас есть понятие отдельных профилей пользователей (separate user profiles), начиная с Android 4.2 для планшетов и Android 5.

0 для телефонов. Каждый пользователь получает свое собственное «внутреннее хранилище».

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

Исследуем Internal Storage

Device File Explorer tool в Android Studio 3.0+ может просматривать все внутренние хранилища на эмуляторе, а также внутреннее хранилище отлаживаемых приложений на продакшн устройствах.

В командной строке вы можете использовать adb с опцией run-as.

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

adb shell 'run-as your.application.package.name cp /data/data/your.application.package.name/databases/dbname.db /sdcard'

Обратите внимание, что:

  • Вам нужно будет изменить пункт назначения туда, где на вашем устройстве монтируется внешнее хранилище (показано здесь как /sdcard/, которое не будет одинаковым на всех устройствах)
  • Возможно, вам придется использовать cat вместо cp на старых устройствах
  • После того, как файл будет находиться на внешнем хранилище, вы сможете использовать adb pull, чтобы загрузить его на свой компьютер, или получить доступ к нему другими обычными способами (например, путем монтирования устройства в качестве диска).

Ограничения внутреннего хранилища

На старых устройствах Android 1.x и 2.x внутреннее хранилище обычно находилось в выделенном разделе файловой системы, и этот раздел обычно был довольно крошечным. HTC Dream (a.k.a., T-Mobile G1), оригинальное Android-устройство, обладал огромными 70 МБ встроенной памяти для использования всеми приложениями (это не опечатка, в то время мы измеряли память в мегабайтах).

К тому времени, когда вышли 2.3 устройства, внутреннее хранилище могло быть размером 1 ГБ.

Android 3.0 изменил модель хранилища, так как внутреннее хранилище стало больше объемом. У устройств, которые рекламируют как имеющее 4 ГБ, 8 ГБ, 16 ГБ и т.д.

пространства для хранения, обычно имелось все это (минус существующее содержимое) доступное для внутреннего хранилища. Мы рассмотрим, что изменилось в Android 3.

0 и его влияние на модель хранилища в следующих постах про внешнее хранилище.

Для Android 1.x и 2.x внутреннее хранилище было действительно только для небольших файлов, и вам нужно было использовать внешнее хранилище для всего остального. Android 3.

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

Однако некоторые опытные пользователи обнаруживают, что даже on-board flash недостаточна для того, что они хотят хранить, поэтому они переходят на съемные хранилища… которые представляют собой банку с червями (прим. имеются в виду ἕλμινς) — источник многих непредсказуемых и сложных проблем.

F.A.Q. по Internal Storage

О, $БОГИ, нет. Используйте FileProvider и обслуживайте этот контент с помощью реализации ContentProvider. После этого вы, по крайней мере, имеете возможность использовать систему разрешений Android для управления доступом к этим файлам, в отличие от вашего варианта, когда любое приложение в системе может испортить эти файлы.

Не советую.

android: sharedUserId — это атрибут, который вы можете поместить в манифест, который указывает логический идентификатор пользователя, который будет использоваться для вашего приложения.

Любое другое приложение, которое установлено, которое подписывается одним и тем же ключом подписи и запрашивает тот же android:sharedUserId будет использовать одного и того же пользователя Linux с точки зрения безопасности.

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

Этот атрибут реально предназначен для предварительно установленных приложений, таких как software suite предварительно загруженный производителем устройства, мобильным оператором или разработчиком модифицированной ROM прошивки.

В частности, как только вы единожды установите свое приложение, вы не сможете затем безболезненно изменить свое значение android:sharedUserId не заблокировав при этом доступ пользователю к любым существующим файлам… поскольку Android не изменяет права владельца на существующие файлы при изменении учетной записи пользователя Linux, под которой запускается приложение.

Существуют различные риски при одновременном доступе нескольких процессов к файлам. Некоторые подсистемы, такие как SQLite, имеют встроенную логику для решения этой проблемы. Но если вы сами организуете свой собственный доступ к файлу (например, через File и Java I/O), вам нужно что-то делать с одновременным доступом, а это сложно.

Вам также нужно обрабатывать ситуацию, когда одно приложение деинсталлируется, удаляя файлы, которые использовало другое приложение.

В модели hub-and-spoke, например, с приложением и набором плагинов, возможно, это не так рискованно.

В других моделях, где приложения более равноправны, вы не можете позволить себе потерять данные своего приложения только потому, что пользователь решил удалить какое-то отдельное приложение.

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

Использование возможностей совместного доступа к данным, которые более слабо связаны, например ContentProvider, дает вам большую гибкость.

В идеальном мире ваше приложение должно относиться к другим приложениям как к достаточно надежному, но не всегда доступному ресурсу, так же, как к вашему собственному веб-сервису.

Как запретить пользователям rooted устройств доступ к моим файлам во внутреннем хранилище?

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

Некоторые разработчики попытаются зашифровать свои файлы с помощью жестко запрограммированного пароля, чтобы пользователи rooted устройств не могли использовать эти файлы.

Это создаст эффект «лежачего полицейского» на короткое время.

Все, что требуется, — это один заинтересованный в реверс-инжиниринге вашего приложения человек, определивший, как расшифровать эти файлы, а затем написавший сообщение в блоге или форуме о том, как это сделать.

В целом, относительно мало людей с rooted устройствами — я оцениваю их на уровне менее 1%. ИМХО, вы преуспеете больше, сосредоточив свою инженерную работу на написании лучшего приложения, вместо того, чтобы тратить время на защиту от рутованных устройств.

Источник: https://habr.com/ru/post/429338/

Папки Internal Storage и External Storage на Android

Internal storage что это

ОС Android на данный момент самая гибкая и функциональная из мобильных операционных систем, что обеспечивает ей высокую популярность. Внутренне устройство Android предполагает наличие собственной файловой системы, структура которой задана древовидной архитектурой, что отличается от организации информации в Windows и для многих пользователей имеет непривычный вид.

Данные могут храниться во внутренней памяти и на внешней (причём пользователи и Google понимают под этими понятиями разные вещи).

Некоторые файлы и папки доступны для работы с ними, другие же, например, создаваемые системой, можно увидеть, включив отображение скрытых элементов в файловом менеджере, но вносить свои коррективы можно только при наличии root-прав (по умолчанию такая возможность недоступна в целях сохранности системы Android).

Объём памяти на современных устройствах позволяет записывать внушительное количество информации, при этом в зависимости от характера данных можно выбрать, куда именно сохранять создаваемые файлы.

Что касается модели хранилища Android, то здесь стоит внести немного ясности, для чего обратимся к таким понятиям как Internal Storage и External Storage и рассмотрим каждое в отдельности (если перевести термины с английского, то первое – это внутреннее место хранения, а второе – внешнее).

Что такое Internal Storage и где находится

Internal Storage в Android, как и следует из названия, – это внутренняя память устройства. Она есть у каждого девайса независимо от того, поддерживаются ли карты памяти. Внутреннее хранилище является защищённой областью встроенной памяти, где может безопасно храниться пользовательская информация. Папка Internal Storage в Android находится в системном разделе /data.

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

Если приложение хранит информацию во встроенной памяти, другой софт, равно как и пользователь, не будут иметь доступ к этим данным, за исключением намеренного использования таких привилегий после получения на устройстве root-прав.

ВАЖНО. Стоит помнить, что ограничение доступа реализовано в Android не просто так, такие меры приняты, чтобы предупредить нарушение функций девайса в результате изменения, удаления системного каталога по неосторожности или незнанию пользователя.

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

Объем памяти в настройках смартфона

Обычно найти папку можно в папке data/data/your.application.package.appname/someDirectory/

ВНИМАНИЕ. Конкретное расположение, где будут размещены файлы на Android-устройстве, может отличаться в зависимости от модели девайса и версии ОС, поэтому не нужно использовать заданные пути.

Пространство внутренней памяти устройства ограничено, и если требуется сохранить большой объём данных, лучше использовать другой тип хранения.

СОВЕТ. Хотя приложения и устанавливаются по умолчанию в Internal Storage, в файле манифеста можно указать атрибут android:installLocation, после чего программу можно установить и на External Storage. Эта возможность выручает, когда файл слишком большой.

Теперь рассмотрим, что такое External Storage в Android. Это внешнее хранилище, куда сохраняются пользовательские данные, найти которые на телефоне несложно. Папка Storage будет располагаться в Android/data, а в данном каталоге многочисленные подпапки с именами приложений (расположение внешней памяти определяет ОС, но не пользователь).

Очистка кэша и освобождение места в хранилище ОС Android

Здесь могут находиться различные файлы, например, музыка, фото, видео и другой контент, доступный пользователю и приложениям. То есть расположение External Storage может быть в любом месте в памяти телефона или на съёмном носителе, а под внешним хранилищем подразумевается не только SD-карта, а и часть встроенной памяти Android-устройства (отличие от внутренней – в защищённости).

Таким образом, есть два типа внешних накопителей:

  • Primary External Storage. Встроенное хранилище общего доступа, работать с которым можно при осуществлении USB-подключения смартфона к компьютеру или ноутбуку.
  • Secondary External Storage. Съёмная память, например, SD-карта.

Управление данными внешнего вместилища осуществляется посредством имеющихся инструментов операционной системы или установленным менеджером файлов, можно использовать сторонний софт.

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

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

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

Внешнее вместилище, используемое для сохранения файлов, поддерживается каждым Android-устройством, его объём отличается в зависимости от модели девайса, а эта информация указывается в характеристиках.

И внутреннее, и внешнее хранилища выполняют задачу хранения временных или постоянных данных, при этом разделы отличаются уровнем доступа к информации.

Источник: https://nastroyvse.ru/opersys/android/kak-najti-papku-storage-na-android.html

Ликбез по Recovery и вайпам для новичков

Internal storage что это

В двух словах, CWM, TWRP – это альтернативные рекавери (recovery) для Android устройств. Обычно их устанавливают по инструкции после разблокировки бутлоадера. С их помощью устанавливают/обновляют прошивки, патчи, гапсы и прочее.

Немного банального (азы):

— Install — установка прошивки и прочих файлов *.zip (update.zip, gapps.zip, lineageos.zip и т.д.)

— Wipe — очистка данных (подробнее об этом поговорим ниже)

— Backup — бэкап системы (с возможностью выбора нужных разделов), в дальнейшем при необходимости (проблемах) можно будет воспользоваться этим (созданным заранее) бэкапом.

— Restore — собственно команда отвечающая за восстановление системы из бэкапа (если таковой был сделан).

— Mount USB Storage — монтирование флешки, подключенной через OTG. Обычно это нужно для подключения устройства к ПК прямо из рекавери (twrp), например чтобы скинуть другую прошивку, гаппсы и прочие файлы.

— File Manager – менеджер файлов.

— Reboot — перезагрузка устройства

(2) WIPE

— Wipe Factory Reset — это совокупность нескольких вайпов (wipe data, cache и dalvik cache) по простому сброс до заводских настроек.

Сотрутся все программы, обновление системных приложений, аккаунты, смс, вызовы, телефонная книга, настройки программ и системы.

Получаем аппарат как с магазина, кроме оставшихся: фото, видео, документов, скаченных файлов, картинок и прочего, Вами скопированного на встроенный, внешний накопители, контента.

— Вы можете выбрать Advanced wipe и выбрать те вайпы которые необходимо сделать. Коротко про каждый вайп:

— Cache — очистка раздела /cache , удаляться временные данные деятельности программ.

— Dalvik Cache — очистка Dalvik Cache, оптимизированные dex файлы для каждого приложения. Если очистить, файлы создадутся заново, обычно это необходимо при обновлении прошивки или гаппсов.

— Wipe Data — очистка раздела /data , удаляться все ваши программы их данные, личные настройки..

— Wipe System — очистка раздела /system устройства, по простому удаление прошивки.

— External Storage — очистка внешней памяти SD карты устройства.

— Internal Storage — очистка внутренней памяти устройства.

Не отмечайте пункт System, если вы не планируете затем устанавливать полную прошивку или не уверены в своих силах. Если вайпнуть систему и не прошить новую прошивку, устройство не запустится.

(3) Форматирование пользовательского раздела (/data)

Причины по которым вам могут посоветовать сделать формат:

— Продажа аппарата. Это действие гарантирует полное удаление данных с телефона связанных с предыдущим владельцем на устройствах, у которых накопитель объединен с разделом /data.

— После/до установки авторских, модифицированных прошивок.

— Зависание при включении, спонтанная перезагрузка, постоянная перезагрузка, даже после заводского сброса.

— Сбои в работе приложений, даже после заводского сброса.

— …

Все симптомы вызваны зачастую ошибками файловой системы. А заводской сброс не всегда означает именно форматирование раздела, т.е создание новой файловой системы, а не просто удаление с раздела папок/файлов.

Процедура форматирования:

  1. Загрузить меню recovery
  2. Выбрать пункт меню: Wipe.
  3. Нажать кнопку: Format Data.
  4. Набрать на клавиатуре слово: yes, и нажать кнопку: Go.
  5. По завершении процесса можно вернутся в основное меню, нажав кнопку: Дом.
  6. Для перезагрузки устройства в обычный режим выбрать: Reboot – Reboot System.

(4) Процедура выборочного стирания

Разберем на примере.

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

  1. Загрузить меню recovery.
  2. Выбрать пункт меню: Wipe.
  3. Нажать кнопку: Advanced Wipe.
  4. Отметить пункты: Cache, Data, Internal Storage, external microSD.
  5. Свайп вправо запустит процесс стирания данных или форматирования разделов и накопителей.
  6. Для перезагрузки устройства в обычный режим выбрать: Reboot – Reboot System.

Некоторая часть информации была позаимствована вот тут — тык.

Спасибо за внимание.

Ссылки:

+ Канал группы в Telegram — тык

+ Группа — тык

+ Чат в Telegram — тык

Источник: https://teletype.in/@android_core/ryBwUiymQ

Android Internal Storage: пример работы с внутренней памятью

Internal storage что это

В этом уроке мы рассмотрим пример работы с внутренней памятью (Android Internal Storage), а именно хранение и чтение данных.

Внутренняя память Android. Теория

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

Тем не менее, обратите внимание, что некоторые пользователи могут получить root-доступ на свои Android устройства. В этом случае, пользователи смогут получать доступ к любым файлам.

Создание и чтение файлов с внутренней памяти Android

Android использует методы openFileInput() и openFileOutput() классов Java IO для работы с локальными файлами.

Обратите внимание, что эти методы не принимают на вход путь к файлу (например, path/to/fileName.txt), а просто получают имена файлов «fileName.txt«.

Метод openFileOutput() используется для создания и сохранения файла. Пример использования приведен ниже:

FileOutputStream fileOutputStream = openFileOutput(“fileName.txt”,Context.MODE_PRIVATE);

FileOutputStream fileOutputStream = openFileOutput(“fileName.txt”,Context.MODE_PRIVATE);

Метод openFileOutput() возвращает экземпляр FileOutputStream . После этого мы можем записать данные в файл. Пример:

String string = “какой-то текст, который мы будем записывать в файл”; fileOutputStream.write(str.getBytes()); fileOutputStream.close();

String string = “какой-то текст, который мы будем записывать в файл”;fileOutputStream.write(str.getBytes());fileOutputStream.close();

Метод openFileInput() используется для чтения данных из файла. Он возвращает экземпляр FileInputStream. Пример использования:

FileInputStream fileInputStream = openFileInput(file);

FileInputStream fileInputStream = openFileInput(file);

Далее мы посимвольно считываем данные из файла в строку. Например, так:

int ch; String resultString = “”; while((ch = fileInputStream.read()) != -1){ resultString = resultString + Character.toString((char)ch); } fileInputStream.close();

String resultString = “”;while((ch = fileInputStream.read()) != -1){   resultString = resultString + Character.toString((char)ch);

Пример работы с внутренней памятью (Android Internal Storage). Практика

Ниже представлена структура нашего простого Android проекта:

Код макета activity_main.xml содержит кнопки writeBtn и readBtn для записи данных в файл и чтения. Обратите внимание, что мы определили метод OnClick в макете, а не в коде (можете сами назначить слушатель в коде — это ничего не меняет. Просто мы учим Android, поэтому пробуем различные способы управлять поведением виджетов):

        android:id=”@+id/textView_title”        android:layout_width=”wrap_content”        android:layout_height=”wrap_content”        android:layout_alignParentLeft=”true”        android:layout_alignParentRight=”true”        android:text=”Чтение/запись в Android Internal Storage”        android:textStyle=”bold” />        android:id=”@+id/edit_field”        android:layout_width=”wrap_content”        android:layout_height=”wrap_content”        android:layout_alignParentLeft=”true”        android:layout_alignParentRight=”true”        android:layout_below=”@+id/textView_title”        android:layout_margin=”3dp”        android:layout_marginTop=”20dp”        android:hint=”Введите текст и нажмите 'Запись'”                android:id=”@+id/writeBtn”        android:layout_width=”wrap_content”        android:layout_height=”wrap_content”        android:layout_alignEnd=”@+id/edit_field”        android:layout_alignRight=”@+id/edit_field”        android:layout_alignTop=”@+id/readBtn”        android:onClick=”writeToFile”        android:text=”Запись в файл” />        android:id=”@+id/readBtn”        android:layout_width=”wrap_content”        android:layout_height=”wrap_content”        android:layout_alignLeft=”@+id/edit_field”        android:layout_alignStart=”@+id/edit_field”        android:layout_centerVertical=”true”        android:onClick=”readFromFile”        android:text=”Чтение из файла” />

Чтобы назначать метод OnClick() в макете, мы должны определить метод в коде с параметром View, иначе Android выдаст ошибку, что метод имеет неправильную сигнатуру (в параметрах метода нет View).

Класс MainActivity содержит реализацию методов чтения и записи файлов:

package ua.com.prologistic.hellointernalstorage; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText; import android.widget.Toast; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class MainActivity extends AppCompatActivity { private EditText editText; // определяем размер буфера при считывании с файла private static final int READ_BLOCK_SIZE = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.edit_field); } // метод для записи в файл public void writeToFile(View v) { // открываем файл по названию try { FileOutputStream fileOutputStream = openFileOutput(“simplefile.txt”, MODE_PRIVATE); OutputStreamWriter outputWriter = new OutputStreamWriter(fileOutputStream); outputWriter.write(editText.getText().toString()); outputWriter.close(); // создаем всплывающее окно c результатом выволнения записи в файл Toast.makeText(getBaseContext(), “Запись в файл успешно проведена!”, Toast.LENGTH_LONG).show(); } catch (Exception e) { e.printStackTrace(); } } // метод для чтения из файла public void readFromFile(View v) { try { FileInputStream fileInputStream = openFileInput(“simplefile.txt”); InputStreamReader reader = new InputStreamReader(fileInputStream); char[] inputBuffer = new char[READ_BLOCK_SIZE]; String s = “”; int charRead; // цикл читает данные из файла, while ((charRead = reader.read(inputBuffer)) != -1) { // конвертируем char в строку String rString = String.copyValueOf(inputBuffer, 0, charRead); s += rString; } reader.close(); editText.setText(s); // создаем всплывающее окно c результатом выволнения чтения из файла Toast.makeText(getBaseContext(), “Чтение из файла успешно проведено!”, Toast.LENGTH_LONG).show(); } catch (Exception e) { e.printStackTrace(); } } }

package ua.com.prologistic.hellointernalstorage;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.EditText;import android.widget.Toast;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;public class MainActivity extends AppCompatActivity {    private EditText editText;    // определяем размер буфера при считывании с файла    private static final int READ_BLOCK_SIZE = 100;    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        editText = (EditText) findViewById(R.id.edit_field);    // метод для записи в файл    public void writeToFile(View v) {        // открываем файл по названию            FileOutputStream fileOutputStream = openFileOutput(“simplefile.txt”, MODE_PRIVATE);            OutputStreamWriter outputWriter = new OutputStreamWriter(fileOutputStream);            outputWriter.write(editText.getText().toString());            // создаем всплывающее окно c результатом выволнения записи в файл            Toast.makeText(getBaseContext(), “Запись в файл успешно проведена!”,                    Toast.LENGTH_LONG).show();    // метод для чтения из файла    public void readFromFile(View v) {            FileInputStream fileInputStream = openFileInput(“simplefile.txt”);            InputStreamReader reader = new InputStreamReader(fileInputStream);            char[] inputBuffer = new char[READ_BLOCK_SIZE];            // цикл читает данные из файла,            while ((charRead = reader.read(inputBuffer)) != -1) {                // конвертируем char в строку                String rString = String.copyValueOf(inputBuffer, 0, charRead);            // создаем всплывающее окно c результатом выволнения чтения из файла            Toast.makeText(getBaseContext(), “Чтение из файла успешно проведено!”,                    Toast.LENGTH_LONG).show();

Результат работы с внутренней памятью (Android Internal Storage):

Мы ввели текст в поле, нажали кнопку ‘Запись в файл’ и получили сообщение об успешной записи. Теперь удалите текст из поля ввода и нажмите ‘Чтение из файла’ — вы получите сообщение об успешном чтении из файла.

Любознательным: Где хранится файл simplefile.txt?

Файл simplefile.txt хранится в вашем смартфоне по адресу data –> data –> [имя пакета] –> files –> simplefile.txt. В нашем случае [имя пакета] = ua.com.prologistic.hellointernalstorage. Доступ к этому файлу можно через File Explorer.

Следите за обновлениями раздела Разработка под Android и подписывайтесь на новые статьи!

Источник: https://javadevblog.com/android-internal-storage-primer-raboty-s-vnutrennej-pamyat-yu.html

Хранение данных и файлов

Internal storage что это

Внешняя карта памяти
Состояние на текущий момент (Android 10 Q)

В целом хранение файлов и данных можно условно разделить на две группы: во внутреннем или внешнем хранилище. Но разница между ними довольна тонка. В целом политика Гугла в отношение данных ужесточается с каждой версии системы.

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, 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” (см. выше).

Реклама

Источник: http://developer.alexanderklimov.ru/android/theory/data_storage.php

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.