Получение пути к SD-карте

Пожалуйста, прочтите весь пост, прежде чем голосовать против и / или отмечать его как дубликат!

Я работаю над приложением, которое считывает файлы из определенной папки на телефоне пользователя - либо с SD-карты (если она есть), либо из встроенного хранилища. Да, "READ_EXTERNAL_STORAGE" упоминается в манифесте, и я также обрабатываю всплывающее окно разрешения для API> 23.

Раньше я просто использовал

File folder = new File(Environment.getExternalStorageDirectory(), "myfolder");

чтобы получить путь к папке, которая хранится во встроенном хранилище (32 ГБ для S7), но теперь я хочу получить путь к SD-карте. Согласно почти каждому результату, который дал мне Google, «Environment.getExternalStorageDirectory ()» должен указать вам путь к SD-карте, но для меня это не так (и никогда не было).

Я протестировал следующее с двумя разными Samsung Galaxy S7, оба с Android 7.0, один с SD-картой (+ папка), другой без (+ папка):

Log.d(tag, System.getenv("EXTERNAL_STORAGE"));
Log.d(tag, System.getenv("SECONDARY_STORAGE"));
Log.d(tag, ""+new File(System.getenv("EXTERNAL_STORAGE")+File.separator+"myfolder").isDirectory());
Log.e(tag, ""+new File(System.getenv("EXTERNAL_STORAGE")+File.separator+ordner).getAbsolutePath());
Log.d(tag, Environment.isExternalStorageRemovable());
Log.d(tag, Environment.getExternalStorageDirectory());
Log.d(tag, Environment.getExternalStorageDirectory().getAbsolutePath());

К моему удивлению, оба телефона выводят одинаковую информацию:

/sdcard
null
true
/sdcard/myfolder
false
/storage/emulated/0
/storage/emulated/0

Согласно приложению файлового менеджера («Мои файлы»), встроенное хранилище называется «Внутреннее хранилище», что имеет еще меньший смысл (я знаю разницу между внутренним и внешним хранилищем в Android).

Как мне получить путь к реальной SD-карте (без жесткого ее кодирования)?

Environment.getExternalStorageDirectory() можно использовать. продолжайте следить за родительской папкой, пока не найдете / sdcard /
FindOutIslamNow 02.05.2018 12:48

Прочтите, пожалуйста, весь пост! мой первый тест уже дал мне «/ sdcard», но даже несмотря на то, что я создал папку «myfolder» прямо внутри нее с помощью приложения «Мои файлы», третий тест не удался.

Neph 02.05.2018 13:06

Я вижу, вы используете SECONDARY_STORAGE для проверки своей папки, а не EXTERNAL_STORAGE

FindOutIslamNow 02.05.2018 13:09

Поднимитесь на одну строку вверх. Как я уже сказал: пожалуйста, прочтите весь пост!

Neph 02.05.2018 13:23
Log.d(""+new File(System.getenv("SECONDARY_STORAGE")+File.separator+"myfo‌​lder").isDirectory()‌​); Что ты здесь видишь, чувак?
FindOutIslamNow 02.05.2018 13:26

Неужели «чувак»? Но да, это была моя ошибка, потому что использование EXTERNAL_STORAGE фактически приводит к «true», спасибо за совет.

Neph 02.05.2018 13:31

Неважно, он действительно возвращает "true", но он также возвращается на S7, у которого нет SD-карты, так что вернемся к исходной точке. : /

Neph 02.05.2018 13:37

@Neph Я пропустил весь ответ, который вы передали на каждый ответ из того, что я сделал ниже, 1) Вы создали папку на SD-карте вашего устройства с помощью стороннего приложения 2) Вы получаете другой адрес с помощью метода Env.getexternalstorage (), поэтому Вы не можете решить, правильный это адрес или нет. 3) Если эта папка существует внутри устройства, вы хотите выполнить операцию архивирования и разархивирования файлов, верно?

chetan mekha 02.05.2018 13:38

1) Да и нет, я создал папку «myfolder» со стандартным приложением Android «Мои файлы» (не сторонним) - я также просто протестировал создание еще одного через Win 10, и полученная папка («myfolder2») появилась на на том же уровне, что и «myfolder», 2) Нет, я всегда получаю «/ storage / emulated / 0» (и всегда получаю), 3) Да, я хочу распаковать файл в этой папке на SD-карте, а затем прочитать получившиеся файлы или просто прочтите файлы, которые уже находятся в папке.

Neph 02.05.2018 13:44

Дубликат stackoverflow.com/questions/5694933/…

LarsH 24.01.2019 21:24

@LarsH Это действительно похожий вопрос, вы правы в этом, но ему 7 лет и о гораздо более старой версии Android - я спросил об Android 7.0, в котором доступ к файлам на SD-картах работает совершенно иначе, чем, например, Android 4.3.

Neph 25.01.2019 10:42
4
11
6 291
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вам необходимо вставить следующее разрешение в файл манифеста вашего приложения:

<?xml version = "1.0" encoding = "utf-8"?>
<manifest
xmlns:android = "http://schemas.android.com/apk/res/android" >

   <!-- Add this -->
   <uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE"/>

</manifest>

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

Neph 02.05.2018 13:09
Ответ принят как подходящий

Единственный способ, который я нашел, - это полужестко его закодировать:

File[] folders = myappcontext.getExternalCacheDirs();

дает вам путь к папкам «кеша», к которым у вашего приложения есть доступ (но которые удаляются при удалении приложения).

Если в телефоне используется съемная SD-карта (которая в данный момент смонтирована), длина массива должна быть «2»:

  1. Путь к папке "cache" на внешнем (несъемном) накопителе.
  2. Путь к папке "cache" на SD-карте.

Выглядят они примерно так:

/storage/emulated/0/Android/data/com.mycompany.myapp/cache
/storage/xxxx-xxxx/Android/data/com.mycompany.myapp/cache

... где "x" - это номер (id?) вашей SD-карты. Я смог протестировать это только с двумя разными SD-картами, и у обеих был свой номер.

Environment.getExternalStorageDirectory();

также должен дать вам

/storage/emulated/0/

это способ получения доступа к внешнему хранилищу без жесткого кодирования. ;)

Если вы создадите новую папку на самом первом уровне вашей SD-карты на вашем ПК, ее путь будет следующим:

/storage/xxxx-xxxx/myfolder

Я также должен вас предупредить: несмотря на то, что вы можете читать папку «myfolder», вы не можете писать в ней (просто вызовет исключение «Доступ запрещен» в Android 7) из-за изменений во всей системе, которые пришли с Kitkat. . Но это другая проблема, которую я собираюсь затронуть в новом вопросе.

Это хорошие способы (из-за отсутствия лучшего способа) найти съемную SD-карту. Для более надежного подхода для других версий Android и производителей см. stackoverflow.com/questions/5694933/…

LarsH 29.01.2019 11:23

Другие вопросы по теме