Environment.getExternalStorageDirectory не возвращает путь к съемному хранилищу - PullRequest
40 голосов
/ 18 мая 2011

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

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

Ответы [ 3 ]

32 голосов
/ 18 мая 2011

Согласно источнику , 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 () и указать ручной параметр, если значение равно false.

3 голосов
/ 15 февраля 2017

Для 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

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

1 голос
/ 25 декабря 2018

Чтобы быть уверенным, что вы обращаетесь к SD-карте, вы можете использовать:

System.getenv ("SECONDARY_STORAGE")

однако - имейте в виду, что даже если вы установите все правильныеразрешения в манифесте. Единственное место, в которое сторонним приложениям разрешено писать на внешнюю карту, это «их собственные каталоги» (т. е. / sdcard / Android / data /)

Попробуйте написать куда-нибудь еще, и выполучить исключение: EACCES (В доступе отказано)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...