Intereting Posts
Как у вас есть пауза кода в течение нескольких секунд в андроиде? Как установить текущий текст прядильника без изменения соответствующих элементов списка выбора Как использовать самоподписанный SSL в сетевой библиотеке Android (ION)? Android Studio – отладочное хранилище ключей Почему я не должен использовать значки меню, предоставляемые ОС? Сборщик фреймов с дополнительным UA String – UAProfURL Android: ошибка преобразования байта в dex Как найти высоту строки состояния в Android через React Native? Android – сохранить значение в LocalStorage до WebView.loadUrl () Маскированный ввод с помощью виджета EditText в Android Android Studio 2.2 Preview 3 Ошибка компоновки Отсутствие анимации при удалении элементов в RecyclerView Как включить .so lib в Intellij IDEA для Android-проекта? Генератор значков Android для панели действий и уведомление не работают (серая форма) Преобразование gcc-команды в CMake для android ndk

Проверьте, присутствует ли 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(); 

Когда SDCard находится в слоте, pathS содержит mnt/sdcard , но когда я pathS остается /mnt/sdcard

Solutions Collecting From Web of "Проверьте, присутствует ли SDCard, логическое значение всегда верно"

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

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

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

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

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

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

Поскольку в документации указано Environment.getExternalStorageState() :

Возвращает текущее состояние основного «внешнего» устройства хранения .

И для Environment.MEDIA_MOUNTED MEDIA_MOUNTED -constant :

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

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

Я изменил, что если 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"; } 

Если вы хотите указать, вставлена ​​ли 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(); } 

Этот фрагмент кода может быть вам полезен для обнаружения и устранения исключений из устройств 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; } }