Comment obtenir le chemin sdcard interne et externe dans android

la Plupart des nouveaux appareils android ont une sdcard interne et une carte sd externe. Je veux faire une application d'Explorateur de fichiers mais je ne peux pas trouver comment obtenir le chemin à utiliser dans mon application parce que

File file = Environment.getExternalStorageDirectory();

retourne dans la plupart des appareil /mnt/sdcard mais il existe un autre chemin pour l'autre carte sd externe comme /storage1 or /storage2 . Toute aide appréciée.

18
demandé sur Mahmoud Jorban 2012-11-13 16:46:52

8 réponses

Comment obtenir le chemin sdcard interne et externe dans android

Méthodes pour stocker dans la mémoire de Stockage Interne:

File getDir (String name, int mode)

File getFilesDir () 

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

Méthodes pour stocker 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 Environment.getExternalStorageDirectory(), qui pointait vers le racine de la mémoire interne du téléphone. En conséquence, le répertoire racine a été rempli de contenu aléatoire.

plus Tard, ces deux méthodes ont été ajoutées:

Context classe ils ont ajouté getExternalFilesDir(), pointant vers un répertoire spécifique à l'application dans la mémoire interne du téléphone. Ce répertoire et son contenu sera supprimé lorsque l'application est désinstallée.

Environment.getExternalStoragePublicDirectory() pour des endroits centralisés pour stocker des types de fichiers bien connus, comme des photos et des films. Ce répertoire et son contenu supprimé lorsque l'application est désinstaller.

méthodes de stockage amovible, c.-à-d. micro carte SD

avant le niveau 19 de L'API, il n'y avait aucun moyen officiel de stocker la carte SD. Mais beaucoup pourraient le faire en utilisant des API non officielles.

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

File[] getExternalFilesDirs (String type)

il renvoie les chemins absolus vers les répertoires spécifiques à l'application sur tous les dispositifs de stockage partagés/externes où l'application peut placer les fichiers persistants qu'il possède. Ces fichiers sont internes à l'application, et généralement pas visible à l'utilisateur des médias.

cela signifie qu'il retournera les chemins vers la carte Micro SD et la mémoire interne. Généralement, deuxième retourné chemin serait le chemin de stockage de la carte micro SD.

Le Stockage interne et externe terminologie selon Google / officielle Android docs is tout à fait différent d'après ce que nous pensons.

8
répondu AnV 2017-09-22 13:07:43

Oui. Différents fabricants utilisent des noms de carte SDcard différents comme dans Samsung Tab 3 son extsd, et d'autres appareils samsung utilisent sdcard comme ce fabricant différent utilisent des noms différents.

j'ai eu la même exigence que vous. j'ai donc créé un exemple d'échantillon pour vous de mon projet goto ce lien Android Répertoire sélecteur exemple qui utilise la bibliothèque androi-dirchooser. Cet exemple détecte la carte SDcard et la liste de tous les sous-dossiers et il détecte également si l'appareil a plus qu'une carte sd.

une partie du code ressemble à ceci pour un exemple complet allez sur le lien Android Répertoire Sélecteur

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


    }
});
3
répondu Shivaraj Patil 2014-09-06 07:29:09

Lorsque l'on est trouvé, le découper en ses éléments, puis tirez le chemin d'accès à ce point de montage et l'ajouter à la liste de tableaux

texte en gras certains appareils manquent complètement le fichier vold nous ajoutons un chemin ici pour s'assurer que la liste inclut toujours le chemin de la première carte sdcard, réels ou simulés.

    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 des chemins de montage, Testez chacun d'entre eux pour faire bien sûr, c'est un chemin valide et disponible. Si elle n'est pas, retirer de 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
répondu Emel Elias 2016-05-22 20:32:09

Je ne suis pas sûr comment général une réponse ceci 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/emulated/0.

Le dispositif motorola qui a une carte SD externe donne / storage / sdcard1 pour System.getenv("SECONDARY_STORAGE") et Envirnoment.getExterna... donne /storage/emulated/0.

Le samsumg retourne /storage/extSdCard pour la SD externe.

Dans mon cas, je fais un sous-répertoire sur l'emplacement externe et j'utilise

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

pour trouver la carte sd. Faire un sous-répertoire dans ce répertoire fonctionne.

bien sûr j'ai dû définir la permission dans le fichier manifeste pour accéder à la mémoire externe.

J'ai aussi une tablette de couleur Nook 8". Quand j'aurai la chance de les tester, je posterai si j'ai des problèmes avec cette approche.

1
répondu steven smith 2017-06-01 17:16:04

mais il y a un autre chemin pour les autres sdcard externes comme /storage1 ou /storage2

il n'y a rien dans le SDK Android -- au moins via Android 4.1 -- qui vous donne accès à ces chemins. Ils peuvent ne pas être lisibles ou inscriptible par votre application, de toute façon. Le comportement de tels emplacements de stockage, et ce qu'ils sont utilisés pour, est aux fabricants de dispositifs.

0
répondu CommonsWare 2012-11-13 13:04:28

Essayez ce code, il va aider

Map<String, File> externalLocations = ExternalStorage.getAllStorageLocations();
File sdCard = externalLocations.get(ExternalStorage.SD_CARD);
File externalSdCard = externalLocations.get(ExternalStorage.EXTERNAL_SD_CARD);
0
répondu Rahul 2014-08-18 05:33:13
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
répondu kumar 2017-09-08 04:18:13

il n'y a pas d'api publique pour obtenir le chemin sdcard interne/externe.

mais il y a une api de plate-forme appelée StorageManager dans android.OS.forfait de stockage. voir http://goo.gl/QJj1eu