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 (В доступе отказано)

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