Ruta de la tarjeta SD de almacenamiento extraíble (externa) por fabricantes


He estado buscando en Google, pero es muy difícil encontrar qué fabricantes/modelos utilizan qué ruta para la tarjeta SD/almacenamiento externo.

  • NO estoy hablando de la ruta de almacenamiento interno que se puede encontrar por:

Environment.getExternalStorageDirectory()

Sé que getExternalStorageDirectory() a veces apunta a una tarjeta SD externa en algunos dispositivos.

Esto es lo que he encontrado una ruta común para la ruta externa (No estoy seguro de qué fabricante usa qué ruta):

/emmc
/mnt/sdcard/external_sd
/mnt/external_sd
/sdcard/sd
/mnt/sdcard/bpemmctest
/mnt/sdcard/_ExternalSD
/mnt/sdcard-ext
/mnt/Removable/MicroSD
/Removable/MicroSD
/mnt/external1
/mnt/extSdCard
/mnt/extsd
/mnt/usb_storage  <-- usb flash mount
/mnt/extSdCard  <-- usb flash mount
/mnt/UsbDriveA  <-- usb flash mount
/mnt/UsbDriveB  <-- usb flash mount

Esto es lo que encontré buscando en Google.

Necesito escanear todo el almacenamiento interno + externo + unidad flash USB para buscar un archivo determinado. Si me falta algún camino, por favor agréguelo a la lista anterior. Si alguien conoce los caminos utilizados por cada fabricante, por favor comparta con nosotros.

Author: jclova, 2012-12-20

5 answers

¡Buenas noticias! En KitKat ahora hay una API pública para interactuar con estos dispositivos de almacenamiento compartidos secundarios.

Los nuevos métodos Context.getExternalFilesDirs() y Context.getExternalCacheDirs() pueden devolver múltiples rutas, incluyendo dispositivos primarios y secundarios. A continuación, puede iterar sobre ellos y comprobar Environment.getStorageState() y File.getFreeSpace() para determinar el mejor lugar para almacenar sus archivos. Estos métodos también están disponibles en ContextCompat en la biblioteca support-v4.

También tenga en cuenta que si solo está interesado en usar los directorios devueltos por Context, ya no necesita los permisos READ_ o WRITE_EXTERNAL_STORAGE. En el futuro, siempre tendrá acceso de lectura / escritura a estos directorios sin necesidad de permisos adicionales.

Las aplicaciones también pueden continuar trabajando en dispositivos más antiguos al finalizar su vida útil de la siguiente manera:

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />
 12
Author: Jeff Sharkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-20 23:25:24

También comencé con una lista como la tuya de algún lugar (lo siento, no pude encontrar la fuente original) y continúo agregando algunas rutas recopiladas de los comentarios de los usuarios. Hay duplicados en la lista anterior.

    /storage/sdcard1 //!< Motorola Xoom
    /storage/extsdcard  //!< Samsung SGS3
    /storage/sdcard0/external_sdcard  // user request
    /mnt/extsdcard
    /mnt/sdcard/external_sd  //!< Samsung galaxy family
    /mnt/external_sd
    /mnt/media_rw/sdcard1   //!< 4.4.2 on CyanogenMod S3
    /removable/microsd              //!< Asus transformer prime
    /mnt/emmc
    /storage/external_SD            //!< LG
    /storage/ext_sd                 //!< HTC One Max
    /storage/removable/sdcard1      //!< Sony Xperia Z1
    /data/sdext
    /data/sdext2
    /data/sdext3
    /data/sdext4
    /sdcard1                       //Sony Xperia Z
    /sdcard2                       //HTC One M8s
    /storage/microsd               //ASUS ZenFone 2

Para lo que desea lograr (escanear todas las rutas posibles para ciertos archivos), creo que es bastante imposible hacerlo de esta manera (usando una lista de rutas conocidas). Algunas rutas en el mismo dispositivo incluso cambiaron entre la actualización de Android.

 11
Author: oceanuz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-02 05:56:13

Basado en las rutas que oceanuz proporcionó, escribí un método, que localiza la ruta de almacenamiento externo (ignorando el caso) y la devuelve como una cadena.

Nota: Usé la biblioteca StreamSupport dentro de mi método, así que para que funcione, necesitarás descargar el archivo jar y agregarlo a la carpeta libs en tu proyecto y eso es todo.

  public static String getExternalSdPath(Context context) {
    List<String> listOfFoldersToSearch = Arrays.asList("/storage/", "/mnt/", "/removable/", "/data/");
    List<String> listOf2DepthFolders = Arrays.asList("sdcard0", "media_rw", "removable");
    List<String> listOfExtFolders = Arrays.asList("sdcard1", "extsdcard", "external_sd", "microsd", "emmc", "ext_sd", "sdext",
            "sdext1", "sdext2", "sdext3", "sdext4");
    final String[] thePath = {""};
    Optional<File> optional = StreamSupport.stream(listOfFoldersToSearch)
            .filter(s -> {
                File folder = new File(s);
                return folder.exists() && folder.isDirectory();
            }) //I got the ones that exist and are directories
            .flatMap(s -> {
                try {
                    List<File> files = Arrays.asList(new File(s).listFiles());
                    return StreamSupport.stream(files);
                } catch (NullPointerException e) {
                    return StreamSupport.stream(Collections.emptyList());
                }
            }) //I got all sub-dirs of the main folders
            .flatMap(file1 -> {
                if (listOf2DepthFolders.contains(file1.getName().toLowerCase())) {
                    try {
                        List<File> files = Arrays.asList(file1.listFiles());
                        return StreamSupport.stream(files);
                    } catch (NullPointerException e) {
                        return StreamSupport.stream(Collections.singletonList(file1));
                    }
                } else
                    return StreamSupport.stream(Collections.singletonList(file1));
            }) //Here I got all the 2 depth and 3 depth folders
            .filter(o -> listOfExtFolders.contains(o.getName().toLowerCase()))
            .findFirst();

    optional.ifPresent(file -> thePath[0] = file.getAbsolutePath());

    Log.i("Path", thePath[0]);

    return thePath[0];
}

Este método devolverá una cadena vacía si no se encuentra una ruta de la tarjeta Sd.

 1
Author: sudo_rizwan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-15 14:09:47

Estaba tratando de encontrar la ruta a mi tarjeta SD externa en Sony Xperia XA. Luego instalé ES File explorer y eso mostró claramente la ruta a cualquier carpeta, interna o externa, en su ventana de características. Encontré la ruta a la SD externa como / storage / C4EE-F3A3. Estaba tratando de guardar el archivo de salida de Python3 a SD externa, pero no tenía permiso para guardar en cualquier lugar que no sea la carpeta Qpython en la SD interna.

 0
Author: himukala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-26 22:39:44

¿has probado:

Environment.getExternalStoragePublicDirectory.getExternalStorageDirectory(String type);

Donde tipo es el directorio definido por Android que necesita como Entorno.DIRECTORY_DOWNLOADS, que le dará el directorio de descargas

No es "getExternalStorageDirectory" es "getExternalStoragePublicDirectory". Tenga en cuenta que para cada dispositivo Android devolverá el lugar donde ocurre el almacenamiento (por ejemplo: /mnt/external_sd) trabajado en mi transformador 101, un nexus 10 y un galaxy s2. Lo necesitaba para descargar un archivo en el almacenamiento

Aquí está la documentación http://developer.android.com/reference/android/os/Environment.html

 -3
Author: Dante,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-05 19:49:08