¿Cómo puedo obtener la lista de almacenamiento externo montado de un dispositivo Android?

Aquí estamos desarrollando la aplicación de Android para Android TV Box. ¿Cómo puedo obtener la lista de almacenamiento externo montado como un USB stick, SDCARD and SATA HDD.

Yo uso el archivo / proc / mounts para obtener la lista de opciones de almacenamiento disponibles

 public class StorageUtils { private static final String TAG = "StorageUtils"; public static class StorageInfo { public final String path; public final boolean readonly; public final boolean removable; public final int number; StorageInfo(String path, boolean readonly, boolean removable, int number) { this.path = path; this.readonly = readonly; this.removable = removable; this.number = number; } public String getDisplayName() { StringBuilder res = new StringBuilder(); if (!removable) { res.append("Internal SD card"); } else if (number > 1) { res.append("SD card " + number); } else { res.append("SD card"); } if (readonly) { res.append(" (Read only)"); } return res.toString(); } } public static List getStorageList() { List list = new ArrayList(); String def_path = Environment.getExternalStorageDirectory().getPath(); boolean def_path_removable = Environment.isExternalStorageRemovable(); String def_path_state = Environment.getExternalStorageState(); boolean def_path_available = def_path_state.equals(Environment.MEDIA_MOUNTED) || def_path_state.equals(Environment.MEDIA_MOUNTED_READ_ONLY); boolean def_path_readonly = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY); HashSet paths = new HashSet(); int cur_removable_number = 1; if (def_path_available) { paths.add(def_path); list.add(0, new StorageInfo(def_path, def_path_readonly, def_path_removable, def_path_removable ? cur_removable_number++ : -1)); } BufferedReader buf_reader = null; try { buf_reader = new BufferedReader(new FileReader("/proc/mounts")); String line; Log.d(TAG, "/proc/mounts"); while ((line = buf_reader.readLine()) != null) { Log.d(TAG, line); if (line.contains("vfat") || line.contains("/mnt")) { StringTokenizer tokens = new StringTokenizer(line, " "); String unused = tokens.nextToken(); //device String mount_point = tokens.nextToken(); //mount point if (paths.contains(mount_point)) { continue; } unused = tokens.nextToken(); //file system List flags = Arrays.asList(tokens.nextToken().split(",")); //flags boolean readonly = flags.contains("ro"); if (line.contains("/dev/block/vold")) { if (!line.contains("/mnt/secure") && !line.contains("/mnt/asec") && !line.contains("/mnt/obb") && !line.contains("/dev/mapper") && !line.contains("tmpfs")) { paths.add(mount_point); list.add(new StorageInfo(mount_point, readonly, true, cur_removable_number++)); } } } } } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } finally { if (buf_reader != null) { try { buf_reader.close(); } catch (IOException ex) {} } } return list; } } 

Para obtener todas las carpetas de almacenamiento externo disponibles (incluidas las tarjetas SD), puede usar esto:

 File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null); 

Para ir a la “raíz” de cada almacenamiento externo (la que es la ruta real de la carpeta de assembly), puede usar esta función que he creado:

  /** Given any file/folder inside an sd card, this will return the path of the sd card */ private static String getRootOfInnerSdCardFolder(File file) { if(file==null) return null; final long totalSpace=file.getTotalSpace(); while(true) { final File parentFile=file.getParentFile(); if(parentFile==null||parentFile.getTotalSpace()!=totalSpace) return file.getAbsolutePath(); file=parentFile; } } 

Environment.getExternalStorageState() devuelve la ruta al punto de assembly SD interno como “/ mnt / sdcard”

No, Environment.getExternalStorageDirectory() refiere a cualquier cosa que el fabricante del dispositivo considere como “almacenamiento externo”. En algunos dispositivos, este es un medio extraíble, como una tarjeta SD. En algunos dispositivos, esta es una porción del flash en el dispositivo. Aquí, “almacenamiento externo” significa “lo que se puede acceder a través del modo de almacenamiento masivo USB cuando está montado en una máquina host”, al menos para Android 1.xy 2.x.

Pero la pregunta es sobre SD externo. ¿Cómo obtener una ruta como “/ mnt / sdcard / external_sd” (puede variar de un dispositivo a otro)?

Android no tiene ningún concepto de “SD externa”, aparte del almacenamiento externo, como se describió anteriormente.

Si el fabricante de un dispositivo ha elegido que el almacenamiento externo esté a bordo del flash y también tenga una tarjeta SD, deberá ponerse en contacto con ese fabricante para determinar si puede usar o no la tarjeta SD (no se garantiza) y para qué sirven las reglas. usándolo, como qué camino usar para ello.

Probar esto:

Manifest.xml:

      

MyRecepción:

 public class MyReceiver extends BroadcastReceiver{ if (intent.getAction().equalsIgnoreCase( "android.intent.action.UMS_CONNECTED")) {...} } 

Otra alternativa

Primero, obtenga todos los directorios de archivos externos

 File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null); 

A continuación, llame a esta función para cada una de las carpetas

 private static String getRootOfExternalStorage(File file) { if (file == null) return null; String path = file.getAbsolutePath(); return path.replaceAll("/Android/data/" + getPackageName() + "/files", ""); } 

Puede usar getExternalStorageDirectory() para obtener el directorio de almacenamiento externo. La documentación proporciona una buena explicación de su uso http://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory%28%29

Para dispositivos USB, probablemente tenga que buscar en la clase UsbManager o, más en general, android.hardware.usb http://developer.android.com/reference/android/hardware/usb/UsbManager.html

Ahora este tema es antiguo, pero esto puede ayudar. deberías usar este método.

System.getenv ();

ver el proyecto Environment3 para acceder a todos los dispositivos de almacenamiento conectados a su dispositivo.

https://github.com/omidfaraji/Environment3