Compruebe si la tarjeta SD está disponible o no programáticamente

Mi aplicación funciona para móviles que solo tienen una tarjeta SD. Por lo tanto, programáticamente quiero verificar si la tarjeta SD está disponible o no y cómo encontrar el espacio libre de la tarjeta SD. ¿Es posible?

Si es así, ¿cómo lo hago?

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

Use Environment.getExternalStorageState() como se describe en “Uso del almacenamiento externo” .

Para obtener espacio disponible en el almacenamiento externo, use 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(); 

La respuesta aceptada no funciona para mí

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

En caso de que el dispositivo tenga un almacenamiento incorporado, devuelve verdadero; Mi solución es que para verificar el recuento de directorios de archivos externos, si hay más de uno, el dispositivo tiene tarjeta SD. Funciona y lo probé para varios dispositivos.

 public static boolean hasRealRemovableSdCard(Context context) { return ContextCompat.getExternalFilesDirs(context, null).length >= 2; } 

Escribí una pequeña clase para verificar el estado de almacenamiento. Tal vez te sirva de algo.

 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; } } } 

Lo modifiqué de tal manera que si existe una tarjeta SD, establece el camino allí. Si no, lo establece en el directorio interno.

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

Puede verificar si la tarjeta sd extraíble externa está disponible como esta

 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; } 

Esto funciona perfectamente ya que lo he probado.

  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); } 

Creé una clase para verificar si la carpeta de la tarjeta SD está disponible o no:

 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); } } 

Este sencillo método me funciona. Probado en todo tipo de dispositivos.

 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; } }