Intereting Posts
Получить ширину и высоту компонентов в представлении Фрагмент Является ли PhoneGap медленным или это ошибка? Android получить изображение галереи Uri path Как узнать из адаптера, если элемент ListView виден или нет? Как добавить разделительные линии между моими таблицами, которые создаются программно? Firebase DB: Проверьте, нет ли у узла дочерних элементов? Создание нескольких страниц PDF с помощью android.graphics.pdf Adb.exe не найден после установки Android Studio Папка Gen пуста для Android-проекта Панель действий Android, не отображающая переполнение Метод retrieveRequestToken повышает «Не удалось связаться с поставщиком услуг: null» Как узнать, изменилось ли пользователь состояние кнопки переключения? Android ACTION_GET_CONTENT не обновляет файлы загружаемых файлов Делают ли темы добавление большого количества накладных расходов в приложение? Android ScrollView прокручивается вверх после вызова setVisibility (View.VISIBLE) в дочернем представлении

Проверьте, доступна ли SD-карта или нет программно

Мое приложение работает на мобильных телефонах, у которых есть только SD-карта. Поэтому программно я хочу проверить, доступна ли SD-карта или нет, и как найти свободное место на SD-карте. Является ли это возможным?

Если да, как мне это сделать?

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

Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); if(isSDPresent) { // yes SD-card is present } else { // Sorry } 

Используйте Environment.getExternalStorageState() как описано в разделе «Использование внешнего хранилища» .

Чтобы получить доступное пространство на внешнем хранилище, используйте StatFs :

 // do this only *after* you have checked external storage state: File extdir = Environment.getExternalStorageDirectory(); File stats = new StatFs(extdir.getAbsolutePath()); int availableBytes = stats.getAvailableBlocks() * stats.getBlockSize(); 

Я написал небольшой класс для проверки состояния хранилища. Возможно, это для вас полезно.

 import android.os.Environment; /** * Checks the state of the external storage of the device. * * @author kaolick */ public class StorageHelper { // Storage states private boolean externalStorageAvailable, externalStorageWriteable; /** * Checks the external storage's state and saves it in member attributes. */ private void checkStorage() { // Get the external storage's state String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { // Storage is available and writeable externalStorageAvailable = externalStorageWriteable = true; } else if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { // Storage is only readable externalStorageAvailable = true; externalStorageWriteable = false; } else { // Storage is neither readable nor writeable externalStorageAvailable = externalStorageWriteable = false; } } /** * Checks the state of the external storage. * * @return True if the external storage is available, false otherwise. */ public boolean isExternalStorageAvailable() { checkStorage(); return externalStorageAvailable; } /** * Checks the state of the external storage. * * @return True if the external storage is writeable, false otherwise. */ public boolean isExternalStorageWriteable() { checkStorage(); return externalStorageWriteable; } /** * Checks the state of the external storage. * * @return True if the external storage is available and writeable, false * otherwise. */ public boolean isExternalStorageAvailableAndWriteable() { checkStorage(); if (!externalStorageAvailable) { return false; } else if (!externalStorageWriteable) { return false; } else { return true; } } } 

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

Принятый ответ не работает для меня

 Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 

Если устройство имеет встроенное хранилище, оно возвращает true; Мое решение состоит в том, что для проверки количества файлов внешних файлов, если их больше 1, устройство имеет sdcard. Он работает, и я тестировал его на несколько устройств

 public static void hasRealRemovableSdCard(context: Context): Boolean { return ContextCompat.getExternalFilesDirs(context, null).size() >= 2 } 
  void updateExternalStorageState() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { mExternalStorageAvailable = mExternalStorageWriteable = true; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { mExternalStorageAvailable = true; mExternalStorageWriteable = false; } else { mExternalStorageAvailable = mExternalStorageWriteable = false; } handleExternalStorageState(mExternalStorageAvailable, mExternalStorageWriteable); } 

Я создал класс, чтобы проверить, доступна ли папка на SD-карте или нет:

 public class GetFolderPath { static String folderPath; public static String getFolderPath(Context context) { if (isSdPresent() == true) { try { File sdPath = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/FolderName"); if(!sdPath.exists()) { sdPath.mkdirs(); folderPath = sdPath.getAbsolutePath(); } else if (sdPath.exists()) { folderPath = sdPath.getAbsolutePath(); } } catch (Exception e) { } folderPath = Environment.getExternalStorageDirectory().getPath()+"/FolderName/"; } else { try { File cacheDir=new File(context.getCacheDir(),"FolderName/"); if(!cacheDir.exists()) { cacheDir.mkdirs(); folderPath = cacheDir.getAbsolutePath(); } else if (cacheDir.exists()) { folderPath = cacheDir.getAbsolutePath(); } } catch (Exception e){ } } return folderPath; } public static boolean isSdPresent() { return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); } } 

Этот простой метод работает для меня. Проверено на всех типах устройств.

 public boolean externalMemoryAvailable() { if (Environment.isExternalStorageRemovable()) { //device support sd card. We need to check sd card availability. String state = Environment.getExternalStorageState(); return state.equals(Environment.MEDIA_MOUNTED) || state.equals( Environment.MEDIA_MOUNTED_READ_ONLY); } else { //device not support sd card. return false; } } 

Вы можете проверить, доступна ли внешняя съемная SD-карта, как это

 public static boolean externalMemoryAvailable(Activity context) { File[] storages = ContextCompat.getExternalFilesDirs(context, null); if (storages.length > 1 && storages[0] != null && storages[1] != null) return true; else return false; } 

Это работает отлично, так как я его протестировал.