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.
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.
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);
}
}
});
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--);
}
}
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.
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.
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);
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.
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