как узнать путь к sd карте на андроид
Получение пути к карте памяти SD Card на Android
Разрабатывая приложение для проведения соревнований, я столкнулся с проблемой хранения базы данных. Проблема состояла в том, как мне определить внешнюю карту памяти. В целом поиск в сети точного ответа не дал. Поэтому, объединив все найденные результаты, я собрал свой класс. Если кому интересно, смотрим под катом.
Итак, начнем с теории.
Терминология
До версии 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. Ответов там несколько примерно одинаковых.
Про дублирование
Многие замечали в директории монтирования устройств такую картину:
Пример использования
Заключение
Подробные рассуждения по этому вопросу понимания памяти в Android, некоторые советы можно прочитать тут.
Исходный код всего класса расположен еще нигде не расположен. На днях постараюсь разместить на gitHub.
Сохранение файлов вместо внутренней памяти на SD-карту
Операционная система занимает значительную часть внутренней памяти смартфона. Проходит не так много времени с момента покупки телефона, память заполняется, и вопрос удаления посторонних файлов начинает беспокоить. Даже после установки sd карты в телефон проблема не всегда решается – пользователи не знают, как изменить место сохранения файлов. Эту проблему мы сейчас и устраним.
Содержание:
Как включить sd карту на Андроиде
Несмотря на очевидность, не все пользователи умеют подключать карту памяти к телефону. Рассмотрим, как это сделать.
После выполнения этой инструкции вы можете скачать на карту памяти любые файлы.
Видео инструкция! (если нет времени читать)
Автоматическое сохранение файлов на карту памяти
Чтобы скачиваемые из интернета файлы помещались сразу на карту памяти, нужно зайти в настройки телефона и изменить место их сохранения. Инструкция должна сработать независимо от установленной версии ОС Андроид.
Путь к настройкам сохранения может отличаться. В других версиях операционной системы будет подпункт «Настройки памяти» (или подобный), а в нем – «Место сохранения по умолчанию». Тапните на него и выберите «SD-карта».
Если этот способ не помог, используйте поочередно те, что описаны далее. Помните, что ни один вариант не сработает, если вы не установили SD-карту и при этом пытаетесь изменить настройки.
Меняем папку сохранения в браузере
Для выхода в интернет используется браузер, и большинство файлов загружается на телефон через него. Чтобы данные скачивались на карту памяти можно настроить его так, чтобы перед закачкой он запрашивал место сохранения. Рассмотрим изменение пути сохранения на примере Google Chrome.
Если у вас телефон Samsung (с Android 9 и выше)
Владельцам смартфонов Самсунг изменить место сохранения файлов проще простого. Настройки изменяются через стандартный браузер, установленный на телефоне по умолчанию (обычно это Chrome). Действия:
Если у вас Samsung Galaxy, но способ не сработал, это может быть связано с тем, что:
Перенос файлов на sd карту
Чтобы освободить пространство, перенесите данные с внутренней памяти на флешку. Для этого
Объединение карты памяти со внутренней
Есть отличный способ сделать так, чтобы местная память телефона на андроид расширилась за счет карты памяти. Другими словами она будет объединена, и необходимость постоянно менять место сохранения исчезнет.
Способ 1
После включения смартфона, объем внутренней памяти будет увеличен на «размер» SD-карты, а файлы начнут сохраняться на нее. Аналогичным образом – с перезагрузкой телефона, все возвращается обратно.
Способ 2
Меняем местами внутреннюю память с sd картой
После нижеописанных действий телефон будет считать SD-карту внутренней памятью Android. Все файлы (включая приложения) будут устанавливаться на нее. Порядок действий:
Как найти карту памяти в телефоне
Доступ к внешнему накопителю
Для того чтобы открыть карту памяти в файловой системе устройства, нужно воспользоваться приложением для доступа к ней.
Если вы не видите в столбце ничего, связанного с SD, обратитесь к разделу решения проблем ниже.
В сторонних файловых менеджерах доступ к внешнему накопителю можно получить по подобному алгоритму.
Что делать, если файловый менеджер не видит карту
В некоторых случаях выполнение инструкции выше приводит к тому, что позиция, соответствующая внешнему накопителю, не появляется. Это может означать несколько вариантов проблемы.
Помимо этой статьи, на сайте еще 12226 инструкций.
Добавьте сайт Lumpics.ru в закладки (CTRL+D) и мы точно еще пригодимся вам.
Отблагодарите автора, поделитесь статьей в социальных сетях.
Как я могу получить внешний путь SD-карты для Android 4.0+?
У меня есть вариант решения, которое я нашел здесь
Первоначальный метод был протестирован и работал с
Я не уверен, какая версия для Android была включена, когда они были протестированы.
Я протестировал мою модифицированную версию с помощью
И некоторые отдельные устройства хранения, которые используют SD-карту в качестве основного хранилища
За исключением Невероятного, все эти устройства только вернули свое съемное хранилище. Вероятно, есть некоторые дополнительные проверки, которые я должен делать, но это по крайней мере немного лучше, чем любое решение, которое я нашел до сих пор.
Я нашел более надежный способ получить пути ко всем SD-CARD в системе. Это работает на всех версиях Android и возвращает пути ко всем хранилищам (включая эмулирование).
Работает правильно на всех моих устройствах.
PS: Исходный код класса среды.
Я предполагаю использовать внешнюю SD-карту, которую вам нужно использовать:
Работает на меня. Сначала вы должны проверить, что находится в каталоге mnt, и работать там.
Вы должны использовать какой-либо метод выбора, чтобы выбрать, какую SD-карту использовать:
Чтобы получить все внешние хранилища (будь то карты SD или внутренние несъемные хранилища ), вы можете использовать следующий код:
В качестве альтернативы вы можете использовать System.getenv («EXTERNAL_STORAGE») для извлечения первичного каталога внешнего хранилища (например, «/ storage / sdcard0» ) и System.getenv («SECONDARY_STORAGE») для извлечения списка всех вторичных каталогов (например, / Storage / extSdCard: / storage / UsbDriveA: / storage / UsbDriveB « ). Помните, что в этом случае вам может понадобиться отфильтровать список вторичных каталогов, чтобы исключить USB-диски.
В любом случае, обратите внимание, что использование жестко закодированных путей всегда является плохим подходом (особенно когда каждый производитель может изменить его как приятно).
Хорошие новости! В KitKat теперь существует общедоступный API для взаимодействия с этими вторичными устройствами хранения данных.
Новые Context.getExternalFilesDirs() и Context.getExternalCacheDirs() могут возвращать несколько путей, включая как первичные, так и вторичные устройства. Затем вы можете перебрать их и проверить Environment.getStorageState() и File.getFreeSpace() чтобы определить наилучшее место для хранения ваших файлов. Эти методы также доступны в ContextCompat в библиотеке поддержки-v4.
Приложения также могут продолжить работу над более старыми устройствами, выполнив их запрос на разрешение следующим образом:
Я сделал следующее, чтобы получить доступ ко всем внешним SD-картам.
Вы получаете путь к первичной внешней SD. Затем с помощью:
Вы получаете родительский каталог основного внешнего хранилища, а также родительский элемент внешнего внешнего sd. Теперь вы можете перечислить все хранилище и выбрать тот, который вы хотите.
Надеюсь, это полезно.
Вот полное решение, которое я улучшаю
Если у вас есть какие-либо вопросы или предложения, пожалуйста, дайте мне знать
Вот как я получаю список путей SD-карты (за исключением первичного внешнего хранилища):
Спасибо за подсказки, предоставленные вами, ребята, особенно @SmartLemon, я получил решение. В случае, если кому-то это понадобится, я применил свое окончательное решение (чтобы найти первую внешнюю SD-карту):
Если там нет внешней SD-карты, она возвращает память на борту. Я буду использовать его, если sdcard не существует, вам может потребоваться его изменить.
Обратитесь к моему коду, надеюсь, полезно для вас:
Этот фрагмент кода помогает узнать этот точный путь и помогает найти путь к внешнему устройству.
Да. Различные производители используют другое имя SDcard, как в Samsung Tab 3, его extsd, а другие устройства samsung используют sdcard, как это разные производители используют разные имена.
У меня было такое же требование, как и вы. Поэтому я создал образец примера для вас из моего проекта, перейдя по этой ссылке в список выбора Android-каталога, который использует библиотеку androi-dirchooser. В этом примере обнаруживается SD-карта и список всех подпапок, а также определяется, имеет ли устройство более одну SD-карту.
Часть кода выглядит так. Для полного примера перейдите к ссылке Android Directory Chooser
На некоторых устройствах (например, samsung galaxy sII) внутренняя карта памяти mabe находится в vfat. В этом случае используйте последний код, мы получим карту внутренней карты пути (/ mnt / sdcad), но не внешнюю карту. Код, приведенный ниже, решает эту проблему.
Это решение (собранное из других ответов на этот вопрос) обрабатывает тот факт (как упоминалось в @ono), что System.getenv(«SECONDARY_STORAGE») бесполезен для Marshmallow.
Протестировано и работает над:
Samsung Galaxy Tab A (Android 6.0.1 – Stock)
Я уверен, что этот код наверняка решит ваши проблемы … Это отлично работает для меня … \
это не правда. / Mnt / sdcard / external_sd может существовать, даже если SD-карта не установлена. Ваше приложение выйдет из строя, когда вы попытаетесь записать в / mnt / sdcard / external_sd, когда он не установлен.
Вам нужно сначала проверить, установлена ли SD-карта, используя:
Для доступа к файлам на SD-карте, на моем HTC One X (Android), я использую этот путь:
Обратите внимание на триплекс «/»!
Вы можете использовать что-то вроде Context.getExternalCacheDirs () или Context.getExternalFilesDirs () или Context.getObbDirs (). They give application specific directories in all external storage devices where the application can store its files.
So something like this – Context.getExternalCacheDirs()[i].getParentFile().getParentFile().getParentFile().getParent() can get you the root path of external storage devices.
I know these commands are for a different purpose but other answers didn’t work for me.
System.getenv(«SECONDARY_STORAGE») returns null for Marshmallow. This is another way of finding all the externals dirs. You can check if it’s removable which determines if internal/external
I am not sure if this is a valid solution and if it will give results for other Samsung tablets but it has fixed my problem for now. Following is another method to retrieve removable SD Card path in Android (v6.0). I have tested the method with android marshmallow and it works. Approach used in it is very basic and will surely work for other versions too but testing is mandatory. Some insight into it will be helpful:
Kindly share if you have any other approach to handle this issue. благодаря
This will get the path of external sd secondary storage.
On Galaxy S3 Android 4.3 the path I use is ./storage/extSdCard/Card/ and it does the job. Надеюсь, поможет,
The following steps worked for me. You just need to write this lines:
как получить путь к файлу с SD карты в Android
привет всем, у меня есть mp3-файлы на sd-карте. как получить путь к файлу mp3 песни с sd-карты.
пожалуйста, помогите мне.
7 ответов
Вы можете получить путь sdcard из этого кода:
затем укажите имя папки и имя файла
этот код помогает сделать это легко.
на самом деле в некоторых устройствах внешнее имя sdcard по умолчанию отображается как extSdCard, а для других-sdcard1. Этот фрагмент кода помогает узнать этот точный путь и помогает повторить путь внешнего устройства..
Environment.getExternalStorageDirectory() будет не обратный путь к микро SD карты памяти.
как получить путь к файлу с sd-карты в android
By sd-карта, я предполагаю, что вы имели в виду съемная карта micro SD.
на уровне API 19, т. е. В Android версии 4.4 Kitkat, они добавили File[] getExternalFilesDirs (String type) на Context класс, который позволяет приложениям хранить данные / файлы на картах micro SD.
Android 4.4 является первым выпуском платформы, которая фактически позволила приложениям использовать SD-карты для хранения. Любой доступ к SD-картам до уровень API 19 был через частные, неподдерживаемые API.
Environment.getExternalStorageDirectory() был с API уровень 1
getExternalFilesDirs(тип String) возвращает абсолютные пути к каталогам приложений на всех общих / внешних устройствах хранения данных. Это означает, что он вернет пути к как внутренняя, так и внешняя память. В общем,второй возвращается путь будет путь хранения для карты microSD (если есть).
но обратите внимание, что
С этими файлами не обеспечивается безопасность. Например, любой приложения WRITE_EXTERNAL_STORAGE смогите написать к этим файлы.
внутренняя и внешняя память терминология согласно Google / официальные документы Android является совсем другое от того, что мы думаем.