web-dev-qa-db-fra.com

Chemin de carte SD de stockage amovible (externe) par les fabricants

J'ai fait des recherches sur Google, mais il est tellement difficile de trouver quels fabricants/modèles utilisent quel chemin pour la carte SD/le stockage externe.

  • Je ne parle PAS du chemin de stockage interne qui peut être trouvé par:

Environment.getExternalStorageDirectory()

Je sais que getExternalStorageDirectory() pointe parfois vers une carte SD externe sur certains appareils.

Voici ce que j'ai trouvé un chemin commun pour le chemin externe (je ne sais pas quel fabricant utilise quel chemin):

/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

Voici ce que j'ai trouvé en faisant des recherches sur Google.

J'ai besoin de numériser l'intégralité du stockage interne + externe + lecteur flash USB pour rechercher un certain fichier. S'il me manque un chemin, veuillez ajouter à la liste ci-dessus. Si quelqu'un connaît les chemins utilisés par chaque fabricant, veuillez partager avec nous.

32
jclova

Bonnes nouvelles! Dans KitKat, il existe désormais une API publique pour interagir avec ces périphériques de stockage partagés secondaires.

Les nouvelles méthodes Context.getExternalFilesDirs() et Context.getExternalCacheDirs() peuvent renvoyer plusieurs chemins, y compris les périphériques primaires et secondaires. Vous pouvez ensuite les parcourir et vérifier Environment.getStorageState() et File.getFreeSpace() pour déterminer le meilleur endroit pour stocker vos fichiers. Ces méthodes sont également disponibles sur ContextCompat dans la bibliothèque support-v4.

Notez également que si vous souhaitez uniquement utiliser les répertoires renvoyés par Context, vous n'avez plus besoin du READ_ ou WRITE_EXTERNAL_STORAGE autorisations. À l'avenir, vous aurez toujours un accès en lecture/écriture à ces répertoires sans autorisation supplémentaire requise.

Les applications peuvent également continuer à fonctionner sur des appareils plus anciens en supprimant leur demande d'autorisation comme suit:

<uses-permission
    Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"
    Android:maxSdkVersion="18" />
13
Jeff Sharkey

J'ai également commencé avec une liste comme la vôtre de quelque part (désolé, je n'ai pas pu trouver la source d'origine) et j'ai continué à ajouter certains chemins collectés à partir des commentaires des utilisateurs. Il y a des doublons dans la liste ci-dessus.

    /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

Pour ce que vous voulez réaliser (scanner tous les chemins possibles pour certains fichiers), je pense qu'il est tout à fait impossible de le faire de cette façon (en utilisant une liste de chemins connus). Certains chemins sur le même appareil ont même changé entre Android upgrade.

11
oceanuz

Sur la base des chemins fournis par oceanuz, j'ai écrit une méthode qui localise le chemin de stockage externe (en ignorant le cas) et le renvoie sous forme de chaîne.

Remarque: J'ai utilisé la bibliothèque StreamSupport dans ma méthode, donc pour que cela fonctionne, vous devrez télécharger le fichier jar et l'ajouter au dossier libs de votre projet et c'est tout.

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

Cette méthode retournera une chaîne vide si aucun chemin de carte Sd n'a été trouvé.

1
sudo_rizwan

J'essayais de trouver le chemin vers ma carte SD externe sur Sony Xperia XA. J'ai ensuite installé ES File Explorer et cela montrait clairement le chemin vers n'importe quel dossier, interne ou externe, dans sa fenêtre de caractéristiques. J'ai trouvé le chemin vers la SD externe en tant que/stockage/C4EE-F3A3. J'essayais d'enregistrer le fichier de sortie de Python3 sur une SD externe mais il n'avait pas la permission d'enregistrer ailleurs que le dossier Qpython dans la SD interne.

0
himukala