web-dev-qa-db-fra.com

Comment obtenir le chemin interne et externe de la carte SD dans Android

La plupart des nouveaux appareils Android ont une carte SD interne et une carte SD externe. Je souhaite créer une application de fichier Explorer, mais je ne parviens pas à trouver le chemin à utiliser dans mon application, car 

File file = Environment.getExternalStorageDirectory();

renvoie simplement dans la plupart des périphériques /mnt/sdcard mais il existe un autre chemin pour l’autre carte sd externe, tel que /storage1 or /storage2 . Toute aide appréciée.

18
Mahmoud Jorban

Comment obtenir le chemin interne et externe de la carte sd dans Android

Méthodes à stocker dans la mémoire interne:

File getDir (String name, int mode)

File getFilesDir () 

Les méthodes ci-dessus sont présentes dans la classe Context

Méthodes pour enregistrer dans la mémoire interne du téléphone:

File getExternalStorageDirectory ()

File getExternalFilesDir (String type)

File getExternalStoragePublicDirectory (String type)

Au début, tout le monde utilisait Environment.getExternalStorageDirectory(), qui pointait vers le root de la mémoire interne du téléphone. En conséquence, le répertoire racine était rempli de contenu aléatoire.

Plus tard, ces deux méthodes ont été ajoutées:

Dans la classe Context, ils ont ajouté getExternalFilesDir(), en pointant vers un répertoire spécifique à l'application sur la mémoire interne du téléphone. Ce répertoire et son contenu seront supprimés lors de la désinstallation de l'application.

Environment.getExternalStoragePublicDirectory() pour que les emplacements centralisés stockent des types de fichiers connus, tels que des photos et des films. Ce répertoire et son contenu ET NON seront supprimés lors de la désinstallation de l'application.

Méthodes de stockage dans le stockage amovible, c'est-à-dire une carte micro SD

Avant le niveau 19 de l’API, il n’existait aucun moyen officiel de stocker sur une carte SD. Mais beaucoup pourraient le faire en utilisant des API non officielles. 

Officiellement, une méthode a été introduite dans la classe Context dans API de niveau 19 (version Android 4.4 - KitKat). 

File[] getExternalFilesDirs (String type)

Il renvoie des chemins absolus vers des répertoires spécifiques à l'application sur tous les fichiers périphériques de stockage partagés/externes sur lesquels l'application peut placer fichiers persistants qu'il possède. Ces fichiers sont internes à l'application, et ne sont généralement pas visibles par l'utilisateur en tant que média.

Cela signifie qu’il renverra des chemins vers la carte Micro SD et la mémoire interne. En règle générale, seconde chemin renvoyé serait le chemin de stockage de la carte micro SD.

Le stockage interne et externe la terminologie selon Google/la documentation Android officielle est très différent de ce que nous pensons.

9
AnV

Oui. Différents fabricants utilisent des noms de cartes SD différents, comme dans Samsung Tab 3, son extsd, tandis que d'autres appareils Samsung utilisent une carte SD, comme les noms de fabricants différents.

J'ai eu la même exigence que vous. j'ai donc créé pour vous un exemple d'exemple de mon projet goto this link Sélecteur d'annuaire Android exemple qui utilise la bibliothèque androi-dirchooser. Cet exemple détecte la carte SD et répertorie tous les sous-dossiers. Il détecte également si le périphérique dispose de plus d’une carte SD.

Une partie du code ressemble à ceci: Pour un exemple complet, allez au lien Sélecteur d’annuaire Android

/**
* Returns the path to internal storage ex:- /storage/emulated/0
 *
* @return
 */
private String getInternalDirectoryPath() {
return Environment.getExternalStorageDirectory().getAbsolutePath();
 }

/**
 * Returns the SDcard storage path for samsung ex:- /storage/extSdCard
 *
 * @return
 */
    private String getSDcardDirectoryPath() {
    return System.getenv("SECONDARY_STORAGE");
}


 mSdcardLayout.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        String sdCardPath;
        /***
         * Null check because user may click on already selected buton before selecting the folder
         * And mSelectedDir may contain some wrong path like when user confirm dialog and swith back again
         */

        if (mSelectedDir != null && !mSelectedDir.getAbsolutePath().contains(System.getenv("SECONDARY_STORAGE"))) {
            mCurrentInternalPath = mSelectedDir.getAbsolutePath();
        } else {
            mCurrentInternalPath = getInternalDirectoryPath();
        }
        if (mCurrentSDcardPath != null) {
            sdCardPath = mCurrentSDcardPath;
        } else {
            sdCardPath = getSDcardDirectoryPath();
        }
        //When there is only one SDcard
        if (sdCardPath != null) {
            if (!sdCardPath.contains(":")) {
                updateButtonColor(STORAGE_EXTERNAL);
                File dir = new File(sdCardPath);
                changeDirectory(dir);
            } else if (sdCardPath.contains(":")) {
                //Multiple Sdcards show root folder and remove the Internal storage from that.
                updateButtonColor(STORAGE_EXTERNAL);
                File dir = new File("/storage");
                changeDirectory(dir);
            }
        } else {
            //In some unknown scenario at least we can list the root folder
            updateButtonColor(STORAGE_EXTERNAL);
            File dir = new File("/storage");
            changeDirectory(dir);
        }


    }
});
2
Shivaraj Patil

Comme il n’existe pas de méthode directe pour obtenir les chemins, la solution peut être Analysez le fichier /system/etc/vold.fstab et recherchez des lignes comme celle-ci: dev_mount sdcard/mnt/sdcard 1 /devices/platform/s3c-sdhci.0/mmc_Host/mmc0

Quand on en trouve un, divisez-le en ses éléments puis sortez le chemin vers le point de montage et l'ajouter à la liste des artistes

texte mis en évidence il manque certains fichiers au vold, nous avons donc ajouté un chemin ici pour vous assurer que la liste inclut toujours le chemin de la première carte sd, que ce soit réel ou imité.

    sVold.add("/mnt/sdcard");

    try {
        Scanner scanner = new Scanner(new File("/system/etc/vold.fstab"));
        while (scanner.hasNext()) {
            String line = scanner.nextLine();
            if (line.startsWith("dev_mount")) {
                String[] lineElements = line.split(" ");
                String element = lineElements[2];

                if (element.contains(":"))
                    element = element.substring(0, element.indexOf(":"));

                if (element.contains("usb"))
                    continue;

                // don't add the default vold path
                // it's already in the list.
                if (!sVold.contains(element))
                    sVold.add(element);
            }
        }
    } catch (Exception e) {
        // swallow - don't care
        e.printStackTrace();
    }
}

Maintenant que nous avons une liste nettoyée de chemins de montage, testez chacun d'eux pour vous assurer que c'est bien un chemin valide et disponible. Si ce n'est pas le cas, supprimez-le de la liste.

private static void testAndCleanList() 
{
    for (int i = 0; i < sVold.size(); i++) {
        String voldPath = sVold.get(i);
        File path = new File(voldPath);
        if (!path.exists() || !path.isDirectory() || !path.canWrite())
            sVold.remove(i--);
    }
}
1
Emel Elias

Je ne suis pas sûr de la réponse générale mais je l’ai testé sur un Motorola XT830C avec Android 4.4 et sur un Nexus 7 Android 6.0.1. et sur un Samsung SM-T530NU Android 5.0.2 . J'ai utilisé System.getenv("SECONDARY_STORAGE") et Environment.getExternalStorageDirectory().getAbsolutePath().
Le Nexus qui n’a pas de seconde carte SD, System.getenv renvoie null et Envirnoment.getExterna... donne/storage/émulé/0.
L’appareil Motorola qui dispose d’une carte SD externe donne/storage/sdcard1 pour System.getenv("SECONDARY_STORAGE") et Envirnoment.getExterna... donne/storage/émulé/0.
Le samsumg renvoie/storage/extSdCard pour le SD externe.
Dans mon cas, je crée un sous-répertoire sur le site externe et j'utilise 

 appDirectory = (System.getenv("SECONDARY_STORAGE") == null)
       ? Environment.getExternalStorageDirectory().getAbsolutePath()
       : System.getenv("SECONDARY_STORAGE");

trouver la carte SD. Créer un sous-répertoire dans ce répertoire fonctionne.
Bien sûr, je devais définir l'autorisation dans le fichier manifeste pour accéder à la mémoire externe.
J'ai aussi une tablette couleur Nook 8 ". Quand j’aurai la chance de tester, je posterai si j’ai un problème avec cette approche.

1
steven smith

Essayez ce code ça va aider 

Map<String, File> externalLocations = ExternalStorage.getAllStorageLocations();
File sdCard = externalLocations.get(ExternalStorage.SD_CARD);
File externalSdCard = externalLocations.get(ExternalStorage.EXTERNAL_SD_CARD);
0
Rahul

mais il y a un autre chemin pour l'autre carte sd externe comme/storage1 ou/storage2

Rien dans le SDK Android - du moins avec Android 4.1 - ne vous donne accès à ces chemins. Ils peuvent ne pas être lisibles ou inscriptibles par votre application, de toute façon. Le comportement de ces emplacements de stockage, et leur utilisation, incombe aux fabricants de périphériques.

0
CommonsWare
File main=new File(String.valueOf(Environment.getExternalStorageDirectory().getAbsolutePath()));
File[]t=main.getParentFile().listFiles();

for(File dir:t)
{
    Log.e("Main",dir.getAbsolutePath());
}

Sortie:

E/Main: /storage/sdcard1
E/Main: /storage/sdcard0

J'ai une carte SD et une mémoire intégrée.

0
kumar