Проверьте, правильно ли установлена ​​SD-карта и доступна ли она для записи. - PullRequest
0 голосов
/ 11 июня 2018

Хорошо, я искал форумы по максимуму и по минимуму и не могу найти приемлемый ответ, чтобы проверить, правильно ли установлена ​​SD-карта и доступна ли ее запись на устройствах Android 7.(Есть много ответов, но ни один из них на самом деле не работает).

Я понимаю, что нужно использовать Environment.getExternalStorageState () , согласно моему коду ниже:

 pathName=context.getFilesDir().getAbsolutePath()+"/"+SavePath;
 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
     pathName= Objects.requireNonNull(context.getExternalFilesDir(SavePath)).getAbsolutePath();

НО ...

Независимо отнезависимо от того, установлена ​​карта SD или нет, это всегда возвращает TRUE, просто потому что карта SD установлена ​​как эмулируемый ресурс, а НЕ как съемный ресурс.

Я могу использовать Environment.isExternalStorageEmulated (), чтобы проверить это состояние, НО он по-прежнему не сообщает мне, доступна ли SD-карта или нет.(то есть: isExternalStorageEmulated () всегда будет возвращать true независимо от того, существует ли SD-карта или нет, потому что она устанавливается файловой системой при запуске и, похоже, не имеет значения, есть ли физическая SD-карта в слоте или нет).

Кроме попыток записи на SD-карту и записи ошибки исключения, если она не существует, есть ли способ узнать, присутствует ли SD-карта или нет, ДО ТОГО, как я пытаюсь записать на нее?

РЕДАКТИРОВАТЬ:

После рассмотрения предлагаемых решений это лучшее, что я могу придумать.Это кажется очень неуклюжим.Любые идеи о том, как улучшить это?

        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            if (Environment.isExternalStorageEmulated()){
                File[] storage=getExternalFilesDirs(null);

                // Find the first non-emulated storage space
                for (File file: storage){
                    if (!file.toString().contains("emulated/"))
                        System.out.println(file.toString());
                }

            }
        }

Ответы [ 2 ]

0 голосов
/ 18 августа 2018

Ваш ответ на редактирование выглядит хорошо, так как вы отбрасываете эмулируемое хранилище.В качестве альтернативы вы также можете сосчитать каталоги.Если оно больше 1 (также исключая эмулируемое хранилище), в хранилище имеется SD-карта:

public boolean hasExternalSD() {
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        //External Storage Emulated
        if (Environment.isExternalStorageEmulated()){
            if (ContextCompat.getExternalFilesDirs(context, null).length > 1) {
                return true;
            }
        }
    }
    return false;
}
0 голосов
/ 11 июня 2018

И getFilesDir(), и getExternalStorageDirectory() всегда доступны на каждом устройстве Android.

Они не имеют ничего общего со съемной картой micro SD.

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