Подтвердить что ты не робот

Environment.getExternalStorageDirectory не возвращает путь к съемному хранилищу

Как и на уровне API 8, похоже, что Android изменил, что такое "внешнее" хранилище. Чтение через http://developer.android.com/reference/android/os/Environment.html, прикрепленное к документации для getExternalStorageDirectory. Я вижу комментарий: "Не путайте слово" внешний "здесь. лучше считаться медиа/общим хранилищем... В устройствах с несколькими" внешними "каталогами хранения... этот каталог представляет собой" первичное "внешнее хранилище, с которым пользователь будет взаимодействовать".

Мое приложение записывает файлы в путь, полученный с помощью getExternalStorageDirectory, и у меня были пользователи, которые попросили вариант записать на их съемную SD-карту. Я всегда считал, что getExternalStorageDirectory вернул путь к съемной SD-карте, но это уже не так. Как получить доступ к пути к этой SD-карте?

4b9b3361

Ответ 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

Все данные о возврате внутренней памяти телефона.