Получение пути к SD-карте - PullRequest
0 голосов
/ 02 мая 2018

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

Я работаю над приложением, которое считывает файлы из определенной папки на телефоне пользователя - либо с 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-карте (без ее жесткого кодирования)?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

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

File[] folders = myappcontext.getExternalCacheDirs();

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

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

  1. Путь к папке «кеш» во внешнем (не съемном) хранилище
  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) из-за изменений во всей системе, которые пришел с Киткат. Но это другая проблема, которую я собираюсь рассмотреть в новом вопросе.

0 голосов
/ 02 мая 2018

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

<?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>
...