Adelitusn.ru

ПК и Техника
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

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

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

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) и использована как внутренняя. Для этого ее надо особым образом отформатировать и не вынимать, иначе не факт, что система продолжит нормально работать.

Читайте так же:
NVIDIA GeForce GTX 560 Ti

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

Куда скачиваются файлы торрента на андроид?

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

Куда сохраняются файлы торрента на андроид?

Папка, куда сохраняется торрент (как перенести)

Обратите внимание, что uTorrent позволяет загружать файлы как в память телефона, так и непосредственно на SD-карту. После задания нового пути, чтобы внесенные изменения вступили в силу, не забудьте нажать на кнопку «Сохранить».

Как узнать куда скачиваются файлы с торрента?

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

Куда сохраняются скачанные картинки с гугла?

1. Куда сохраняются скачанные из интернета файлы

  1. Браузеры Интернет и Chrome: по умолчанию все скачанные из интернета файлы сохраняются в папку Download (Загрузки), которая находится в памяти устройства.
  2. Другие загруженные браузеры: могут создавать свои собственные папки для сохранения загруженных файлов.

Как найти скачанную музыку на телефоне?

Все скачанные из Интернета файлы хранятся в папке «Download». Для её открытия вам требуется открыть файловый менеджер, затем найти в каталогах данную папку. После этого вы сможете открыть любой скачанный ранее файл, в том числе установочный *. apk, *.

Где найти скачанную музыку на Андроиде?

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

Читайте так же:
Отключение сохранения фото в Viber на андроид

Как найти скачанные файлы в телефоне?

Как найти и открыть файл

  1. Откройте приложение «Файлы» . Подробнее о том, как его найти…
  2. Будет показан список скачанных файлов. Чтобы найти другие файлы, нажмите на значок меню . Для сортировки по названию, дате, типу или размеру нажмите на значок «Ещё» Сортировать. …
  3. Чтобы открыть файл, нажмите на него.

Куда скачиваются файлы с торрента по умолчанию?

По умолчанию uTorrent хранит их в скрытой директории, которую без подсказки не найти на компьютере. Так сделано специально, чтобы неопытный пользователь случайно не удалил эти файлы и не повредил неоконченную загрузку. Изменить расположение «торрент-файлов» можно в том же окне настроек.

Как найти скачанные файлы на iphone?

Теперь, если вы загружаете файл, документ или даже видео на iPad или iPad, все они будут сохранены непосредственно в приложении «Файлы» прямо на устройстве. В каталоге iCloud Drive в приложении «Файлы» есть папка «Загрузки», в которую iOS по умолчанию сохраняет все загруженные файлы.

Как посмотреть загрузки Гугл на телефоне?

В мобильном браузере Chrome нажмите на три точки в правом верхнем углу и в списке опций выберите «Скачанные файлы». Можно воспользоваться поиском либо отсортировать загрузки по типу файлов, щелкнув по стрелочке. Чтобы в телефоне на Android найти загрузки при помощи Yandex.

Куда сохраняются файлы из Интернета?

Скачанные файлы автоматически сохраняются в папке Загрузки. Эта папка обычно находится на диске, где установлена ОС Windows (например, C:Пользователиимя_пользователяЗагрузки). Скачанные файлы можно перемещать из папки «Загрузки» в другие папки на компьютере.

Как найти скачанную музыку с Яндекс музыки?

В папке Android/Data/ru. yandex. music/files/user/music(Тут две папки и в них всё скаченная музыка из приложения)/aac/название видно только через программу а на самом устройстве они изменены на числа!

5 лучших приложений для работы с Android-смартфоном на компьютере

АлександрАлександр Кузнецов | 18 Марта, 2018 — 14:10

AirDroid

AirDroid

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

Настройка AirDroid усложнена тем, что требует включить на смартфоне опции для разработчиков и активировать режим отладки через USB, но сделать это довольно просто: нужно открыть системные настройки, перейти в раздел «О телефоне» несколько раз нажать на версию Android, пока не активируются настройки для разработчиков, а затем перейти к ним и разрешить отладку при подключении к компьютеру.

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

Vysor

Vysor

Vysor зеркалирует на компьютер изображение со смартфона и позволяет делать скриншоты или работать с мобильными приложениями, используя клавиатуру и мышь. При наличии Pro-аккаунта можно «делиться» смартфоном с несколькими компьютерами. Такой аккаунт стоит 2,5 доллара в месяц, 10 долларов в год или 40 долларов навсегда.

Textto

Textto

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

Pushbullet

Pushbullet

Pushbullet выводит на компьютер уведомления от мобильных приложений и позволяет получать и отправлять SMS и обмениваться текстом и файлами между несколькими устройствами. В платной версии сервиса, которая стоит 4,99 доллара в месяц или 39,99 доллара в год, более высокий лимит на отправку файлов, а также предусмотрена безлимитная возможность отвечать на сообщения в мессенджерах и производить определённые действия с приложениями (например, удалять ненужные письма прямо через уведомление на ПК).

Photos Companion

Photos Companion

Photos Companion — приложение, разработанное экспериментальной студией Garage, которая принадлежит компании Microsoft. C его помощью отправлять фотографии со смартфона на компьютер без использования интернета (для этого они должны быть подключены к общей сети). Настройка приложений производится с помощь QR-кода, а фотографии появляются в стандартном приложении «Фото» в Windows 10.

Как найти диспетчер задач на Андроид + Топ 3 лучших приложений

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

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

Где находится диспетчер файлов для Андроид и как его открыть

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

Лучше всего объяснить это по аналогии с компьютером, файловая система которого находится на жестком диске C в виде файлов и папок (Documents, Users, Program Files и т.д.). Так вот Андроид работает точно так же.

Зачем нужен диспетчер задач Android? На мой взгляд, доступ к файловой системе является главным преимуществом операционной системы от Google по сравнению с iOS.

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

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

  • после удаления приложения от него остались файлы, которые занимают место и можно удалить их в соответствующей папке;
  • можно напрямую перемещать файлы из памяти устройства на карту памяти, что очень удобно;
  • в таких приложениях, как Telegram, Viber или WhatsApp, все файлы, даже временные, загружаются на память телефона и очень быстро ее заполняют, а найдя папку с тем же Телеграмом можно выделить все временные файлы и удалить их (очень эффективно!);
  • если в систему попал вредоносный файл и вы знаете, какой это файл, его можно найти через файловый менеджер и удалить.
Читайте так же:
Как посмотреть заблокированное видео (фильм, ролик) на YouTube

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

Также можно установить стороннее программное обеспечение, чтобы точно знать, как открыть диспетчер файлов на Андроид (им будет загруженное приложение).

Важно! Помимо этого диспетчера, существует диспетчер приложений и диспетчер загрузок. Это три разные вещи.

Диспетчер приложений находится в настройках, во вкладке “Все приложения” или “Приложения”. Он представляет собой перечень всех установленных программ на мобильном устройстве.

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

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

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

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

У вас не должно возникнуть вопросов о том, как включить диспетчер загрузки Андроид, потому что он активирован всегда. Другое дело, когда нужно узнать где находится данный диспетчер.

Обычно он расположен среди прочих приложений в папке “Инструменты” или “Прочее”. Называется либо “Диспетчер загрузок”, либо “Загрузки”.

Топ 3 файловых менеджера, которые я рекомендую скачать

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

Также “Проводник” довольно ресурсоемкий, что может быть важно при работе с тяжелыми данными или если мобильное устройство имеет слабые технические характеристики.

Существует стороннее программное обеспечение, которое лучше стокового. Далее описаны три лучших.

Total Commander

Total Commander пришел на мобильную операционную систему Android с компьютеров на Windows. Он значительно лучше справлялся с обязанностями файлового менеджера на компьютере, из-за чего позже получил название Windows Manager.

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

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

В Total Commander есть встроенный текстовый редактор, доступ по локальной сети, FTP и SFTP клиенты. Приложение доступно бесплатно и загружается из Play Market.

Advanced Download Manager

Advanced Download Manager — улучшенный менеджер загрузок, который умеет работать с торрентами, добавлять закачки из различных браузеров и делать многое другое.

Основные функции программного обеспечения:

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

Приложение доступно бесплатно, а поэтому содержит рекламу.

IDM – Download Manager Plus

IDM Download Manager Plus — это менеджер загрузок и диспетчер файлов для Андроид в одном лице.

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

От файлового менеджера в приложении есть работа с загруженными файлами. Их можно переименовывать и указывать расположение.

Работа с торрент файлами на Android устройствах

Android использует файловую систему, которая аналогична дисковым файловым системам на других платформах. Эта лекция описывает, как работать с файловой системой Android для чтения и записи файлов с помощью File API (перевод документации [1]).

Объект File подходит для чтения или записи больших объемов данных в порядке от начала до конца, без пропусков. Например, это хорошо подходит для файлов картинок или для различных обменов данными через сеть. Здесь будет показано, как выполнять базовые файловые операции в Вашем приложении. Подразумевается, что Вы знакомы с файловой системой Linux и стандартной системой ввода/вывода файлов в (standard file input/output API) в java.io.

[Выбор между внутренним и внешним хранилищем (Internal Storage, External Storage)]

Все устройства Android имеют две области хранения файлов (file storage area): «internal» и «external» storage. Эти имена появились на первых стадиях развития Android, когда большинство устройств поставлялись со встроенной энергонезависимой памятью FLASH (internal storage) плюс извлекаемый носитель памяти, такой как micro SD card (external storage). Некоторые устройства делили постоянную область хранения (permanent storage space) на разделы «internal» и «external», так что даже без наличия внешнего извлекаемого хранилища (removable storage medium) всегда имеется 2 пространства хранения, и поведение API всегда одинаково — независимо от того, есть в наличии внешнее хранилище или нет. Следующие списки подводят общую черту под фактическими различиями каждого пространства хранения.

Совет: несмотря на то, что приложения по умолчанию устанавливаются в internal storage, Вы можете указать атрибут android:installLocation в файле манифеста, после чего Ваше приложение может быть установлено и на external storage. Пользователи ценят эту опцию, когда размер APK очень велик, и размер external storage space больше, чем internal storage. Дополнительную информацию см. в документации App Install Location [2].

Читайте так же:
Как скачать видео с Фейсбука: 6 быстрых способов

[Получение разрешения для приложения на доступ к External Storage]

Чтобы иметь возможность записи в external storage, Вы должны запросить в файле манифеста разрешение WRITE_EXTERNAL_STORAGE :

Внимание: в настоящее время приложения имеют возможность чтения external storage без специального на то разрешения. Однако это изменится в будущих релизах системы Android. Если Ваше приложение требует чтения external storage (но не записывает в него), то Вам нужно декларировать разрешение READ_EXTERNAL_STORAGE . Чтобы обеспечить будущую работу Вашего приложения так, как это ожидалось, Вы должны декларировать это разрешение уже сейчас, до того как изменения вступят в реальную силу.

Но если Ваше приложение использует разрешение WRITE_EXTERNAL_STORAGE, то это неявно дает ему также разрешение использовать и чтение external storage.

Вам не нужно получать никаких разрешений на сохранение файлов в internal storage. Ваше приложение всегда имеет разрешение на чтение и запись файлов в свой внутренний каталог на internal storage.

[Сохранение файла в Internal Storage]

Когда сохраняется файл в internal storage, Вы можете запросить подходящую директорию для объекта файла File вызовом одного из двух методов:

getFilesDir() возвращает объект File, представляющий внутренний каталог Вашего приложения.
getCacheDir() возвращает объект File, представляющий внутренний каталог временных файлов кэша Вашего приложения. Обязательно удаляйте оттуда каждый файл, когда он больше не нужен, и реализуйте разумный предел размера для объема памяти, который используете в любой момент времени, такой как предел в 1 мегабайт. Если система Android обнаружит, что на внутреннем хранилище недостаточно места, то она может удалить Ваши файлы кэша без предупреждения.

Чтобы создать новый файл в одной из этих директорий, Вы можете использовать конструктор File(), передав ему File, предоставленный одним из этих методов, которые укажут каталог на internal storage. Пример:

Альтернативно Вы можете вызвать openFileOutput(), чтобы получить FileOutputStream, который записывает файл в Вашей внутренней директории. Например, здесь показано, как записать некий текст в файл:

Или, если Вам нужно кэшировать некоторые файлы, Вы должны вместо этого использовать createTempFile() . Например, следующий метод вытаскивает имя файла из URL и создает файл с таким именем во внутренней директории для кэша Вашего приложения:

Примечание: каталог internal storage Вашего приложения указывается на основе имени пакета приложения в специальном месте файловой системы Android. Технически другое приложение может прочитать Ваши внутренние файлы, если Вы установите файловый режим с разрешенным чтением. Однако для этого другое приложение должно также знать имя пакета Вашего приложения и имена используемых Вашим приложением файлов. Другие приложения не могут просматривать Ваши внутренние директории, и не могут получить доступ на чтение или запись, за исключением случая, когда Вы явно установите файл как читаемый и/или записываемый. Таким образом, пока Вы используете MODE_PRIVATE для Ваших файлов на internal storage, то они никогда не будут доступны для других приложений.

[Сохранение файла в External Storage]

Поскольку external storage иногда может быть недоступно (когда пользователь смонтировал его как внешний USB-носитель на PC, или когда вытащил карту SD из телефона), то перед доступом к тому Вы должны всегда проверить, что он есть в наличии. Вы можете запросить состояние external storage вызовом getExternalStorageState() . Если возвращенное состояние External Storage равно MEDIA_MOUNTED , то Вы можете читать и записывать на него свои файлы. Например, следующие методы полезны для определения доступности устройства хранения:

Несмотря на то, что external storage может быть модифицировано пользователем и другими приложениями, есть две категории файлов, которые могут быть сохранены здесь:

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

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

Если Вы хотите сохранить public-файлы на external storage, используйте метод getExternalStoragePublicDirectory() для получения экземпляра File , предоставляющего подходящую директорию на external storage. Метод принимает аргумент, указывающий тип файла, который Вы хотите сохранить, так чтобы типы файла были логически организованы с другими public-файлами, такими как DIRECTORY_MUSIC или DIRECTORY_PICTURES . Пример:

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

Если ни одно из предварительно определенных имен поддиректорий не подходит для Ваших файлов, то Вы можете вместо этого вызвать getExternalFilesDir() и передать null. Это возвратит корневую частную директорию для Вашего приложения на external storage.

Читайте так же:
Как войти в Instagram через Facebook

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

Независимо от того, используете ли Вы для публичных файлов getExternalStoragePublicDirectory() или getExternalFilesDir() для частных файлов приложения, важно иметь в виду, что Вы используете имена директорий, предоставленные константами API наподобие DIRECTORY_PICTURES . Эти имена директорий гарантируют, что система будет правильно рассматривать эти файлы. Например файлы, сохраненные в DIRECTORY_RINGTONES , будут рассортированы медиасканером системы как рингтоны вместо музыки.

[Опрос количества свободного места]

Если Вы знаете заранее, сколько файлов сохраняете, то можете без получения ошибок IOException узнать, сколько места осталось путем вызова getFreeSpace() или getTotalSpace() . Эти методы предоставляют соответственно текущее доступное пространство и общее пространство на томе хранения. Эта информация также полезна, чтобы избежать переполнения тома хранения свыше определенного порога.

Однако система не гарантирует, что Вы можете записать столько байт, сколько показывает вызов getFreeSpace(). Если возвращенное количество всего на несколько мегабайт больше, чем Вам нужно сохранить, или если файловая система уже заполнена меньше, чем на 90%, то вероятно сохранение будет безопасным. Иначе возможно, что записать данные в хранилище не получится.

Внимание: Вам не обязательно проверять количество свободного места перед сохранения файла. Вместо этого Вы можете попробовать записать файл сразу же, и затем перехватить исключение IOException, если оно произойдет. Вы возможно, должны так поступить, когда не знаете, сколько места Вам нужно. Например, если Вы меняете способ кодирования файла перед его сохранением, преобразовывая картинку PNG в JPEG, то Вы не будете знать размер файла заранее.

[Удаление файла]

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

Если файл сохранен на internal storage, Вы можете также запросить Context, чтобы найти и удалить файл вызовом deleteFile():

Внимание: когда пользователь деинсталлирует Ваше приложение, система Android удалит следующее:

• Все файлы, сохраненные Вашим приложением на internal storage.
• Все файлы, сохраненные Вашим приложением с использованием getExternalFilesDir().

Однако Вы должны регулярно удалять все кэшируемые файлы, создаваемые с getCacheDir(), и также регулярно удалять файлы, которые Вам больше не нужны.

[Пример записи файла на sdcard0]

Предположим, что необходимо записать какой-нибудь тестовый файл (с именем myFile.txt) в папку myFolder на внешний носитель, который виден в системе Android как sdcard0. Т. е. полный путь должен выглядеть примерно так:

Базовый путь до External Storage

Проблема тут состоит в том, чтобы узнать часть пути basePath, поскольку на разных системах Android этот путь будет разным, в зависимости от версии и внутреннего аппаратного устройства. В моем телефоне Samsung Galaxy Note этот basePath = /storage/sdcard0 , но это еще не значит, что на Вашем телефона этот путь будет именно таким. Чтобы получить basePath, используйте вызов функции getExternalStorageDirectory :

Проверка доступности носителя данных в External Storage

Вторая проблема состоит в доступности на запись носителя данных. Дело в том, что записать на носитель можно не всегда, например если он смонтирован как флешка USB (когда Ваш телефон подключен к компьютеру в режиме Mass Storage Device, USB MSD). Проверить доступность носителя можно следующей функцией:

Разрешение доступа к носителю данных в файле манифеста

Как уже упоминалось, необходимо в файле манифеста запросить разрешение WRITE_EXTERNAL_STORAGE . Вот пример такого файла манифеста:

Функция, которая сохраняет файл, принимая полный путь до файла filePath и сохраняемый текст FileContent:

Вызов функции SaveFile, который выполняет задачу сохранения файла в External-носителе:

[Пример записи файла на extSdCard]

Получение полного корневого пути до извлекаемой карты SD не так прост, как до External Storage, поскольку в API Android для этого почему-то не предусмотрены специальные простые функции. Приходится получать путь окольными путями, через имена системных папок. Вот код функции, которая получает путь до извлекаемой карты SD:

Вызов функции SaveFile, который выполняет задачу сохранения файла на извлекаемой карте SD:

[Сохранение бинарного файла (массива byte[])]

В предыдущих примерах мы рассматривали класс OutputStreamWriter , который позволяет записать строку String или массив символов char[]. Но как быть, если нужно записать массив байт byte[]? Для этого подойдет класс DataOutputStream . Пример:

Примеры вызовов getAbsolutePath:

ВызовРезультат вызова
Environment.getRootDirectory.getAbsolutePath()/system
Environment.getExternalStorageDirectory().getAbsolutePath()/storage/sdcard0
Environment.getExternalStoragePublicDirectory(null).getAbsolutePath()завершится с ошибкой
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS).getAbsolutePath()/storage/sdcard0/Alarms

[Ссылки]

1. Saving Files site:developer.android.com .
2. App Install Location site:developer.android.com .

Комментарии

В новых Android доступ на запись надо оформлять не в Манифесте. Вот что пишут: «Android added new permission model for Android 6.0 (Marshmallow). What Are Runtime Permissions? With Android 6.0 Marshmallow, Google introduced a new permission model that allows users to better understand why an application may be requesting specific permissions. Rather than the user blindly accepting all permissions at install time, the user is now prompted to accept permissions as they become necessary during application use.

microsin: ИМХО, это предупреждение чисто информационное, ничего не поменялось, разве что название. Раньше было все то же самое — перед установкой приложения Android показывает пользователю, какие действия будут разрешены приложению. Если пользователь согласен, то он подтверждает действие и установка продолжится, если нет — приложение не установится.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector