- Получение пути к карте памяти SD Card на Android
- Терминология
- Результаты поиска
- Описание кода
- Пример использования
- Заключение
- Как изменить место сохранения файлов на android
- Video: КАК ИЗМЕНИТЬ МЕСТО УСТАНОВКИ ПРИЛОЖЕНИЙ ПО УМОЛЧАНИЮ НА Android?
- Полный список
- Внутренняя память
- SD карта
- Android Studio Указать путь к файлу
- Как изменить место сохранения файлов на android
- Video: КАК ИЗМЕНИТЬ МЕСТО УСТАНОВКИ ПРИЛОЖЕНИЙ ПО УМОЛЧАНИЮ НА Android?
Получение пути к карте памяти SD Card на Android
Разрабатывая приложение для проведения соревнований, я столкнулся с проблемой хранения базы данных. Проблема состояла в том, как мне определить внешнюю карту памяти. В целом поиск в сети точного ответа не дал. Поэтому, объединив все найденные результаты, я собрал свой класс. Если кому интересно, смотрим под катом.
Итак, начнем с теории.
Терминология
Гугл нам говорит, что есть следующие понятия:
- Внутренняя (internal) память — это часть встроенной в телефон карты памяти. При ее использовании по умолчанию папка приложения защищена от доступа других приложений (Using the Internal Storage).
- Внешняя (external) память — это общее «внешнее хранилище», т.е. это может быть как часть встроенной памяти, так и удаляемое устройство. Обычно это часть встроенной памяти, как удаляемое устройство я видел в последний раз на андройде 2.2, где встроенная память была около 2Гб, и подключаемая память становилась внешней (Using the External Storage).
- Удаляемая (removable) память — все хранилища, которые могут быть удалены из устройства без «хирургических» вмешательств.
До версии KitKat 4.4 API не предоставляло функционала для получения путей к внешней памяти. Начиная с этой версии (API 19) появилась функция public abstract File[] getExternalFilesDirs (String type), которая возвращает массив строк с путями к внутренней и внешней памяти. Но как же быть с нашей SD Card, которая вставлена в слот? Путь к ней мы опять не можем получить.
Результаты поиска
Чтобы ответить на поставленный вопрос я обратился к всезнающему гуглу. Но и он мне не дал четкого ответа. Было рассмотрено множество вариантов определения от использования стандартных функций, которые ведут к внешней памяти, но ничего общего с удаляемыми устройствами хранения данных они не имеют, до обработки правил монтирования устройств (Android же на ядре Linux работает). В последних случаях были использованы «зашитые» пути к папке с примонтироваными устройствами (в различных версиях эта директория разная). Не стоит забывать, что от версии к версии правила монтирования меняются.
В конечном итоге я решил объединить все полученные знания и написал свой класс, который может нам вернуть пути к внешним и удаляемым устройствам.
Описание кода
Был создан класс MountDevice, который содержит в себе путь к устройству, тип устройства и некий хэш.
Типов устройств выделено два (внутреннюю память я не стал трогать, так как к ней доступ можно получить через API системы).
И был создан класс StorageHelper, который и осуществляет поиск доступных карт памяти.
В классе StorageHelper реализовано два способа поиска — через системное окружение (Environment) и с использованием утилиты Linux mount, а точнее результата ее выполнения.
Способ первый — Environment
При работе с окружением я использую стандартную функцию getExternalStorageDirectory() для получения информации о внешней памяти. Чтобы получить информацию о удаляемой памяти, я использую переменную окружения «SECONDARY_STORAGE«.
Внешняя память всегда одна и обычно всегда есть, поэтому проверяем ее на читаемость, вычисляем хэш и запоминаем. Удаляемой памяти может быть много, поэтому необходимо полученную строку разбить по разделителю и проверять каждое значение.
Вариант решения взят со stackoverflow. Ответ где-то там внизу.
Способ второй — mount
Так как у меня долго не получалось заставить систему мне сказать путь к удаляемой памяти, я решил искать в сторону примонтированных устройств. В системе есть файлы конфигурации, в которых описаны правила монтирования внешних устройств. Все бы хорошо, но на Android версии 4.* к этому файлу простым смертным доступа нет, поэтому рассматривать этот способ не буду.
Вернемся к утилите mount. При запуске без параметров команда возвращает список смонтированных файловых систем. Удаляемые устройства имеют обычно формат файловой системы FAT, то будем выделять строки, в которых есть характеристика «fat«. Внешняя память будет характеризоваться параметром «fuse«.
Примечание: при использовании такого способа не всегда корректно (скорее всего я что-то не учел) определяются типы смотнтированных устройств. Разницу замечал на разных версиях Android. Поэтому этот способ можно использовать как дополнительный.
Вариант решения взят со stackoverflow. Ответов там несколько примерно одинаковых.
Про дублирование
Многие замечали в директории монтирования устройств такую картину:
И что самое интересно, все это одна и та же внешняя карта памяти. Такое дробление начинается с версии Jelly Bean и сделано это для поддержки многопользовательского режима работы системы. Более подробно тут. И вот, чтобы не получать одну и туже карту памяти как различные устройства, необходим способ определения идентичности. Если бы был доступ к конфигурации монтирования, то и вопросов не было. Но доступа нет. Поэтому я тут подсмотрел решение с расчетом хэша для каждого устройства:
- создаем StringBuilder
- записываем в него общий размер устройства и размер используемого пространства устройства
- обходим содержимое корня устройства
- записываем имя каталога
- записываем имя файла и размер
- вычисляем hash
Пример использования
Заключение
Подробные рассуждения по этому вопросу понимания памяти в Android, некоторые советы можно прочитать тут.
Исходный код всего класса расположен еще нигде не расположен. На днях постараюсь разместить на gitHub.
Источник
Как изменить место сохранения файлов на android
Операционная система Android славится своей простотой и удобством. И это на самом деле так.Ведь в сравнении, например, с полностью закрытой системой iOS на Android все понятно. Интерфейс освоит любой, даже ребенок. К тому же есть возможность изменить абсолютно все: цветовую тему, фон, иконки, анимации, экран блокировки и т.д. Казалось бы, проблем возникнуть не должно, однако и здесь не обходится без сложностей.
Video: КАК ИЗМЕНИТЬ МЕСТО УСТАНОВКИ ПРИЛОЖЕНИЙ ПО УМОЛЧАНИЮ НА Android?
Так, очень многие владельцы устройств на Android озадачены проблемой – как изменить место сохранения файлов?
Чтобы изменить место сохранения файлов на Android, сначала нужно разобраться, о каких именно файлах идет речь. Музыка, фото, видео, загрузки или что-то еще.
Фотографии, сделанные в приложении «Камера» стандартно сохраняются в папке «DCIM», которую можно найти в файловом менеджере либо в папке «Галерея».
В настройках любого редактора установлен путь «По умолчанию». Но при желании его можно изменить внутри самого редактора.
Плееры также имеют в настройках необходимый пункт.
Файлы, переданные по каналу Bluetooth, по умолчанию сохраняются в папку «Bluetooth», находящуюся в папке «Downloads».
Музыка, картинки, игры, файлы, закачанные из интернета через браузер, автоматически сохраняются в папке «Downloads». Однако в настройках браузера можно изменить по своему желанию место сохранения файлов на Android.
В общем, понять, куда сохраняются файлы на Android, большой сложности не вызывает. Здесь все аналогично Windows. Одни приложения позволяют пользователю выбирать путь сохранения файлов, другие – нет. Многие приложения для этого используют стандартные папки (Audio, Video, Download).
Если проблема изменения места сохранения файлов на Android все-таки встала достаточно остро, то рекомендуется установить ES Проводник.
ES Проводник – это один из популярнейших файловых менеджеров для Android. C его помощью можно легко просматривать папки, проводить различные операции с файлами, просматривать фото и видео, слушать музыку и т.д. Функционал этого небольшого приложения огромен.
Плюсом данной программы можно назвать легкий доступ к многим приложениям (CoolReader, Одноклассники, VK, Переводчик и т.д.).
Еще одним достоинством ES Проводник является быстрая передача файлов с компьютера на смартфон и наоборот.
Ну и главное – программа позволяет изменить место сохранения файлов на Android для большинства программ.
Источник
Полный список
— работаем с файлами
Работа с файлами в Android не сильно отличается от таковой в Java. В этом уроке рассмотрим, как записать/прочесть файл во внутреннюю память и на SD-карту.
Project name: P0751_Files
Build Target: Android 2.3.3
Application name: Files
Package name: ru.startandroid.develop.p0751files
Create Activity: MainActivity
Рисуем экран main.xml:
4 кнопки, смысл которых понятен по тексту на них.
В onclick обрабатываем нажатия 4-х кнопок и вызываем соответствующие методы.
writeFile – запись файла во внутреннюю память. Используется метод openFileOutput, который на вход берет имя файла и режим записи: MODE_PRIVATE – файл доступен только этому приложению, MODE_WORLD_READABLE – файл доступен для чтения всем, MODE_WORLD_WRITEABLE — файл доступен для записи всем, MODE_APPEND – файл будет дописан, а не начат заново.
readFile – чтение файла из внутренней памяти. Используем метод openFileInput, принимающий на вход имя файла. Здесь и в методе записи внутреннего файла вы можете задать только имя файла, а каталог для ваших файлов вам уже выделен.
writeFileSD – запись файла на SD. Используем метод getExternalStorageState для получения состояния SD-карты. Здесь можно посмотреть какие бывают состояния. Нам нужно MEDIA_MOUNTED – когда SD-карта вставлена и готова к работе. Далее мы получаем путь к SD-карте (метод getExternalStorageDirectory), добавляем свой каталог и имя файла, создаем каталог и пишем данные в файл.
readFileSD – чтение файла с SD. Все аналогично предыдущему методу, только файл не пишем, а читаем.
Осталось в манифест добавить разрешение на работу с файлами на SD — android.permission.WRITE_EXTERNAL_STORAGE.
Все сохраним и запустим. Видим экран с 4-мя кнопками:
Внутренняя память
Жмем кнопку Записать файл. Видим в логе:
Проверим. Идем в File Explorer (Window > Show View > Other > Android > File Explorer) и открываем там папку data/data/ru.startandroid.develop.p0751files/files и видим там наш файл file.
Возвращаемся в эмулятор. Жмем Прочесть файл и в логе видим:
Это тот текст, который мы записывали в файл.
SD карта
Теперь жмем Записать файл на SD.
Файл записан на SD: /mnt/sdcard/MyFiles/fileSD
Проверяем. Идем в FileExplorer и открываем там папку mnt/sdcard/MyFiles/ а в ней файл fileSD.
Возвращаемся в эмулятор и жмем кнопку Прочесть файл с SD. В логе видим:
Содержимое файла на SD
Этот текст мы и записывали.
mnt/sdcard — обычно этот путь ведет к содержимому SD-карты. Возможно у вас он будет другой.
В общем, при работе с файлами на SD вы используете стандартные java механизмы. А при работе с внутренним хранилищем для удобства можно использовать методы-оболочки от Activity:
openFileOutput – открыть файл на запись
openFileInput – открыть файл на чтение
И есть метод getFilesDir – возвращает объект File, соответствующий каталогу для файлов вашей программы. Используйте его, чтобы работать напрямую, без методов-оболочек.
Подробности работы в java с файловой системой я здесь описывать не буду. На нашем форуме пользователь SKR сделал отличную памятку по работе с файлами. Скорее всего, вы найдете там все что нужно.
Если у вас проверка SD-карты показывает, что карта недоступна (см. лог), то убедитесь в свойствах AVD, что у вас для SDCard указан Size или File. Если указаны, то попробуйте перезапустить AVD.
На следующем уроке:
— создаем экран с вкладками
— используем иконку в названии вкладки
— используем обработчик перехода между вкладками
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
Android Studio Указать путь к файлу
Есть код, который работает на эмуляторе, но на реальном устройстве почему-то не работает, вместо путь к файлу, этот говнокод пишет какие рандомные 4 или 5 цифр
На эмуляторе: storage/emulated/0/Download/data.xml
На реальном устройстве: 2384
Указать путь к файлу (Android studio)
Здравствуйте, вот уже 4 дня не могу во всем интернете найти никакой подсказки, мне нужно чтобы.
Работа с txt файлами в Android. Путь к файлу
Здравствуйте! Уже 3ий день не могу разобраться с тем, как считывать из txt файла. Пишу на.
Указать путь к файлу
Проблема следующая, нужно чтобы путь к файлу задавался какой-то стандартной функцией, то есть в.
указать путь к файлу
есть папки bin //тут экзешник etc // здесь файл с настройками как указать путь к файлу с.
Указать путь к файлу.
Здраствуйте. Вопрос таков, можно ли на кнопку прописать, чтобы при нажатии открывался выбор пути и.
Как указать путь к файлу?
После опубликации проекта. при запуске приложения просит базу данных в.
Как указать путь к файлу?
Привет, подскажите пожалуйста, как мне лучше сделать? у меня есть программа, которая меняет текст.
Не получется указать путь к файлу
program lab_7; uses crt; const FileName=’MyFile.txt’; label 1; var G:text; n:char;
Указать путь к архивированному файлу
Здравствуйте. Можно ли использовать в программе файлы, находящиеся в архиве? Если да, то как.
Источник
Как изменить место сохранения файлов на android
Операционная система Android славится своей простотой и удобством. И это на самом деле так.Ведь в сравнении, например, с полностью закрытой системой iOS на Android все понятно. Интерфейс освоит любой, даже ребенок. К тому же есть возможность изменить абсолютно все: цветовую тему, фон, иконки, анимации, экран блокировки и т.д. Казалось бы, проблем возникнуть не должно, однако и здесь не обходится без сложностей.
Video: КАК ИЗМЕНИТЬ МЕСТО УСТАНОВКИ ПРИЛОЖЕНИЙ ПО УМОЛЧАНИЮ НА Android?
Так, очень многие владельцы устройств на Android озадачены проблемой – как изменить место сохранения файлов?
Чтобы изменить место сохранения файлов на Android, сначала нужно разобраться, о каких именно файлах идет речь. Музыка, фото, видео, загрузки или что-то еще.
Фотографии, сделанные в приложении «Камера» стандартно сохраняются в папке «DCIM», которую можно найти в файловом менеджере либо в папке «Галерея».
В настройках любого редактора установлен путь «По умолчанию». Но при желании его можно изменить внутри самого редактора.
Плееры также имеют в настройках необходимый пункт.
Файлы, переданные по каналу Bluetooth, по умолчанию сохраняются в папку «Bluetooth», находящуюся в папке «Downloads».
Музыка, картинки, игры, файлы, закачанные из интернета через браузер, автоматически сохраняются в папке «Downloads». Однако в настройках браузера можно изменить по своему желанию место сохранения файлов на Android.
В общем, понять, куда сохраняются файлы на Android, большой сложности не вызывает. Здесь все аналогично Windows. Одни приложения позволяют пользователю выбирать путь сохранения файлов, другие – нет. Многие приложения для этого используют стандартные папки (Audio, Video, Download).
Если проблема изменения места сохранения файлов на Android все-таки встала достаточно остро, то рекомендуется установить ES Проводник.
ES Проводник – это один из популярнейших файловых менеджеров для Android. C его помощью можно легко просматривать папки, проводить различные операции с файлами, просматривать фото и видео, слушать музыку и т.д. Функционал этого небольшого приложения огромен.
Плюсом данной программы можно назвать легкий доступ к многим приложениям (CoolReader, Одноклассники, VK, Переводчик и т.д.).
Еще одним достоинством ES Проводник является быстрая передача файлов с компьютера на смартфон и наоборот.
Ну и главное – программа позволяет изменить место сохранения файлов на Android для большинства программ.
Источник