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

Проверьте, присутствует ли SDCard, логическое значение всегда верно

В моем заставке я хочу проверить, есть ли у телефона SDCard. Булевский оператор ниже:

    Boolean isSDPresent = android.os.Environment.getExternalStorageState()
            .equals(android.os.Environment.MEDIA_MOUNTED );

Итак, если у меня есть SDCard в слоте на моем телефоне, это логическое значение вернет true, настолько хорошее. Когда я перехожу к "Unmount SDCard" из меню настроек и удаляет SDCard, затем убивает приложение и запускает его снова, логическое значение также будет истинным.

И если я запустил Astro File Manager после размонтирования и удаления SD-карты, я все равно могу получить доступ к пути /mnt/sdcard, почему?

Как я могу это сделать?

Спасибо заранее!

ИЗМЕНИТЬ

Тестирование с помощью следующего кода:

File path = Environment.getExternalStorageDirectory(); 
String pathS = path.getPath();

Когда SD-карта находится в слоте, pathS содержит mnt/sdcard, но когда я удаляю SDCard, pathS все еще /mnt/sdcard...

4b9b3361

Ответ 1

Я обнаружил, что телефоны, такие как телефоны Galaxy от Samsung, имеют /mnt/sdcard для внутренней памяти, а не для внешней SD-карты, как ожидалось.

Вы можете узнать, является ли путь, возвращенный Environment.getExternalStorageDirectory(), на самом деле является внешней SD-картой с вызовом Environment.isExternalStorageRemovable()

Просто хотел добавить из документации для getExternalStorageDirectory() эту важную заметку:

Примечание. Не путайте слово "внешний" здесь. Этот каталог лучше рассматривать как носитель/общий накопитель. Это файловая система, которая может хранить относительно большой объем данных и все приложения (не применяют разрешения). Традиционно это SD-карту, но она также может быть реализована как встроенное хранилище в устройство, которое отличается от защищенного внутреннего хранилища и может быть смонтирован как файловая система на компьютере.

Ответ 2

Не должно быть:

boolean isPresent = Environment.getExternalStorageState().equals(
   Environment.MEDIA_MOUNTED
);

В документации указано Environment.getExternalStorageState():

Получает текущее состояние основного "внешнего" устройства хранения.

И для Environment.MEDIA_MOUNTED -constant:

getExternalStorageState() возвращает MEDIA_MOUNTED , если носитель присутствовать и монтироваться в точке монтирования с доступом для чтения/записи.

И это будет работать с уровня API 1 +

Ответ 3

Я изменил, что если sd-карта существует, устанавливает путь туда если не задает его во внутреннем каталоге

    Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
    if(isSDPresent)
    {
      path = theAct.getExternalCacheDir().getAbsolutePath() + "/GrammarFolder";
    }
    else
    {
        path = theAct.getFilesDir() + "/GrammarFolder";
    }

Ответ 4

Если вы хотите показать, вставлена ​​ли sdcard или нет, просто скопируйте этот код, действуя на 100% для всех Устройств, код здесь:

File file = new File("/mnt/extSdCard");
         try
         {
         File list[] = file.listFiles();
         Toast.makeText(getApplicationContext(), "Yes sdcard is mounted, file count "+list.length, Toast.LENGTH_LONG).show();
         }
         catch(NullPointerException o)
         {
         Toast.makeText(getApplicationContext(), "Sorry no sdcard is mounted:", Toast.LENGTH_LONG).show();
         }

Ответ 5

У нас есть два состояния памяти. Один - это внутренняя карта памяти, а другая - внешняя SD-карта. Это зависит от того, как изготовители устройств изготовили путь к карте памяти. Поэтому, если вы проверяете наличие доступной SD-карты, в обоих случаях она может возвращать true из-за внутренней памяти. Поэтому перейдите к этому методу:

File[] listOfInternalAndExternalStorage=context.getExternalFilesDirs(null); 
   if(listOfInternalAndExternalStorage.length>=2){
     // it contains sd card
   }

выше код будет проверять, является ли listOfInternalAndExternalStorage более чем одним, тогда он имеет внешнее хранилище, в противном случае он не содержит SD-карту.

Ответ 6

Этот фрагмент кода может быть вам полезен для обнаружения и устранения исключений из устройств Samsung:

public static String getExternalStorage() {

    String str = Environment.getExternalStorageDirectory().getAbsolutePath();
    if ( isSamsungDevice() ) {
        if ( isSamsungExternalSDMounted() ) {
            str += "/external_sd";
        }
    }
    return str;
}

private static boolean isSamsungDevice() {

    return new File( Environment.getExternalStorageDirectory().getAbsolutePath() + "/external_sd" ).exists();
}

private static boolean isSamsungExternalSDMounted() {

    return exec( "mount" ).indexOf( "external_sd" ) >= 0;
}

public static String exec( String paramString ) {

    try {
        String str = "";
        InputStream localInputStream = Runtime.getRuntime().exec( paramString ).getInputStream();
        byte[] arrayOfByte = new byte[1024];
        StringBuilder localStringBuilder = new StringBuilder();
        while ( true ) {

            int i = localInputStream.read( arrayOfByte, 0, arrayOfByte.length );
            if ( i == -1 ) {
                str = localStringBuilder.toString();
                break;
            }

            localStringBuilder.append( new String( arrayOfByte, 0, i ) );
        }

        return str;
    } catch ( IOException e ) {
        e.printStackTrace();
        return null;
    }
}