Environment.getExternalStorageDirectory не возвращает путь к съемному хранилищу
Как и на уровне API 8, похоже, что Android изменил, что такое "внешнее" хранилище. Чтение через http://developer.android.com/reference/android/os/Environment.html, прикрепленное к документации для getExternalStorageDirectory
. Я вижу комментарий: "Не путайте слово" внешний "здесь. лучше считаться медиа/общим хранилищем... В устройствах с несколькими" внешними "каталогами хранения... этот каталог представляет собой" первичное "внешнее хранилище, с которым пользователь будет взаимодействовать".
Мое приложение записывает файлы в путь, полученный с помощью getExternalStorageDirectory
, и у меня были пользователи, которые попросили вариант записать на их съемную SD-карту. Я всегда считал, что getExternalStorageDirectory
вернул путь к съемной SD-карте, но это уже не так. Как получить доступ к пути к этой SD-карте?
Ответы
Ответ 1
Согласно источнику, getExternalStorageDirectory
реализован для возврата того, что установлено в качестве внешней среды в среде устройства:
public static File getExternalStorageDirectory() {
return EXTERNAL_STORAGE_DIRECTORY;
}
и EXTERNAL_STORAGE_DIRECTORY
:
private static final File EXTERNAL_STORAGE_DIRECTORY
= getDirectory("EXTERNAL_STORAGE", "/sdcard");
static File getDirectory(String variableName, String defaultPath) {
String path = System.getenv(variableName);
return path == null ? new File(defaultPath) : new File(path);
}
В отличие от getExternalStoragePublicDirectory(String type)
требуется одна из следующих строк:
DIRECTORY_MUSIC, DIRECTORY_PODCASTS, DIRECTORY_RINGTONES, DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS, DIRECTORY_PICTURES, DIRECTORY_MOVIES, DIRECTORY_DOWNLOADS или DIRECTORY_DCIM. Не может быть null.
поэтому он не предназначен для возврата корня sd-card.
Альтернатива:
Наконец, getExternalStorageState()
вернет файловую систему, установленную в /mnt/sdcard/
. Согласно CommonsWare в этом ответе: Найти внешнюю позицию SD-карты, нет возможности напрямую получить внешнюю SD-карту (если она существует).
Альтернативой было бы проверить isExternalStorageRemovable ()
и дать ручную опцию, если она ложна.
Ответ 2
Для API 17 я получаю следующие возвращения:
Environment.getExternalStoragePublicDirectory(Environment.MEDIA_MOUNTED)
returns:-------> /storage/sdcard0/mounted
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
returns:-------> /storage/sdcard0/DCIM
Environment.getExternalStoragePublicDirectory(Environment.MEDIA_SHARED)
returns:-------> /storage/sdcard0/shared
Environment.MEDIA_MOUNTED
returns:-------> mounted
Environment.getExternalStorageDirectory()
returned:-------> /storage/sdcard0
Все данные о возврате внутренней памяти телефона.