Intereting Posts
Как я могу выполнить элемент проверки в Chrome на своем устройстве Android Galaxy S3? Как изменить размер изображения при касании Эспрессо не дожидается, пока активность не будет уничтожена, прежде чем создавать новую для следующего теста Служба выделяет много памяти? Android Studio: ошибка сборки Gradle, не удается найти SDK и компилировать-сервер Как настроить HTTP-прокси, например Fiddler2 или Charles Web Proxy, с последним эмулятором Android в Windows? StartActivity () из BroadcastReceiver Кто-нибудь создал ZBar с помощью Android NDK? Ошибка: значение null в записи: blameLogFolder = null Отсутствует тип ресурса XML для значения PercentRelativeLayout Percentage? Как определить, воспроизводится ли VideoView видео или буферизация? Настройка программ GoogleMapOptions Есть ли у Glide метод загрузки PNG и SVG? Фильтрация ListView с помощью CursorLoader и Custom CursorAdapter Различия в видимости защищенного внутреннего класса в разных версиях Android

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

Я обнаружил, что телефоны, такие как телефоны 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; } }