Environment.getExternalStorageDirectory не возвращает путь к съемному хранилищу
На уровне API 8 кажется, что Android переопределил, что такое "внешнее" хранилище. Прочтите http://developer.android.com/reference/android/os/Environment.html, приложенный к документации для getExternalStorageDirectory
Я вижу комментарий: "не смущайтесь словом" внешний "здесь. Этот каталог можно лучше рассматривать как носитель / общее хранилище... В устройствах с несколькими" внешними "каталогами хранения... этот каталог представляет собой "первичное" внешнее хранилище, с которым пользователь будет взаимодействовать ".
Мое приложение записывает файлы по пути, полученному getExternalStorageDirectory
, и у меня есть пользователи просят вариант записи на свою съемную SD-карту вместо этого. Я всегда предполагал, что getExternalStorageDirectory
вернул путь к съемной SD-карте, но это уже не так. Как мне получить доступ к пути к этой SD-карте?
2 ответа
По словам источника, 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. Может не быть нулевым
поэтому он не предназначен для возврата корня SD-карты.
Альтернатива:
В заключение, getExternalStorageState()
вернет файловую систему, смонтированную в /mnt/sdcard/
, Согласно CommonsWare в этом ответе: Найти местоположение внешней SD-карты, нет никакого способа напрямую получить внешнюю SD-карту (если она вообще существует).
Альтернативой было бы проверить isExternalStorageRemovable ()
и дать ручную опцию, если она ложна.
Для 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
Все обратное расположение внутренней памяти телефона.
Чтобы убедиться, что вы получаете доступ к SD-карте, вы можете использовать:
System.getenv ("SECONDARY_STORAGE")
однако, имейте в виду, что, даже если вы установили все правильные разрешения в манифесте - приложениям сторонних разработчиков разрешено записывать на внешнюю карту только собственные каталоги (т.е. /sdcard/Android/data/)
Попробуйте написать куда-нибудь еще, и вы получите исключение: EACCES (В доступе отказано)