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