Samsung Galaxy S3 dispose d'un emplacement pour carte SD externe sur lequel est monté /mnt/extSdCard
.
Comment puis-je obtenir ce chemin par quelque chose comme Environment.getExternalStorageDirectory()
?
Cela reviendra mnt/sdcard
et je ne trouve pas l'API de la carte SD externe. (Ou stockage USB amovible sur certaines tablettes.)
android
android-sdcard
Romulus Urakagi Ts'ai
la source
la source
Réponses:
J'ai une variation sur une solution que j'ai trouvée ici
La méthode originale a été testée et travaillée avec
Je ne suis pas sûr de la version d'Android sur laquelle ils étaient lorsqu'ils ont été testés.
J'ai testé ma version modifiée avec
et certains périphériques de stockage uniques qui utilisent une carte SD comme stockage principal
À l'exception de l'incroyable, tous ces appareils n'ont rendu que leur stockage amovible. Il y a probablement des vérifications supplémentaires que je devrais faire, mais c'est au moins un peu mieux que n'importe quelle solution que j'ai trouvée jusqu'à présent.
la source
J'ai trouvé un moyen plus fiable d'obtenir des chemins vers toutes les cartes SD du système. Cela fonctionne sur toutes les versions d'Android et renvoie les chemins vers tous les stockages (y compris émulés).
Fonctionne correctement sur tous mes appareils.
PS: basé sur le code source de la classe Environnement.
la source
Pattern
pour/
System.getenv("SECONDARY_STORAGE")
revient/storage/sdcard1
. Cet emplacement n'existe pas, mais l'emplacement réel est/storage/42CE-FD0A
, où 42CE-FD0A est le numéro de série du volume de la partition formatée.Je suppose que pour utiliser la carte SD externe, vous devez utiliser ceci:
OU
dans ton cas...
en remplacement de
Environment.getExternalStorageDirectory()
Travaille pour moi. Vous devriez d'abord vérifier ce qui se trouve dans le répertoire mnt et travailler à partir de là.
Vous devez utiliser un type de méthode de sélection pour choisir la carte SD à utiliser:
la source
Afin de récupérer tous les stockages externes (qu'il s'agisse de cartes SD ou de stockages internes non amovibles ), vous pouvez utiliser le code suivant:
Vous pouvez également utiliser System.getenv ("EXTERNAL_STORAGE") pour récupérer le répertoire de stockage externe principal (par exemple "/ storage / sdcard0" ) et System.getenv ("SECONDARY_STORAGE") pour récupérer la liste de tous les répertoires secondaires (par exemple " / stockage / extSdCard: / stockage / UsbDriveA: / stockage / UsbDriveB " ). N'oubliez pas que, dans ce cas également, vous souhaiterez peut-être filtrer la liste des répertoires secondaires afin d'exclure les clés USB.
Dans tous les cas, veuillez noter que l'utilisation de chemins codés en dur est toujours une mauvaise approche (surtout lorsque chaque fabricant peut le modifier à sa guise).
la source
J'utilisais Dmitriy Lozenko la solution « jusqu'à ce que je vérifié sur un Asus Zenfone2 , Marshmallow 6.0.1 et la solution ne fonctionne pas. La solution a échoué lors de l'obtention de EMULATED_STORAGE_TARGET , spécifiquement pour le chemin microSD, c'est-à-dire: / storage / F99C-10F4 / . J'ai modifié le code pour obtenir les chemins racine émulés directement à partir des chemins d'application émulés
context.getExternalFilesDirs(null);
et ajouter des chemins physiques spécifiques au modèle de téléphone plus connus .Pour nous faciliter la vie, j'ai fait une bibliothèque ici . Vous pouvez l'utiliser via le système de construction gradle, maven, sbt et leiningen.
Si vous aimez la méthode à l'ancienne, vous pouvez également copier-coller le fichier directement à partir d' ici , mais vous ne saurez pas s'il y a une mise à jour dans le futur sans le vérifier manuellement.
Si vous avez des questions ou des suggestions, veuillez me le faire savoir
la source
context.getExternalFilesDirs(null)
retourneranull
pour l'un des fichiers et il y aura une exception dans la boucle suivante. Je suggère d'ajouterif (file == null) continue;
comme première ligne de la boucle.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()
etContext.getExternalCacheDirs()
peuvent renvoyer plusieurs chemins, y compris les périphériques principaux et secondaires. Vous pouvez ensuite les parcourir et vérifierEnvironment.getStorageState()
etFile.getFreeSpace()
déterminer le meilleur endroit pour stocker vos fichiers. Ces méthodes sont également disponiblesContextCompat
dans la bibliothèque support-v4.Notez également que si vous ne souhaitez utiliser que les répertoires renvoyés par
Context
, vous n'avez plus besoin des autorisationsREAD_
ouWRITE_EXTERNAL_STORAGE
. À l'avenir, vous aurez toujours un accès en lecture / écriture à ces répertoires sans aucune autorisation supplémentaire requise.Les applications peuvent également continuer à travailler sur des appareils plus anciens en mettant fin à leur demande d'autorisation comme ceci:
la source
J'ai fait ce qui suit pour accéder à toutes les cartes SD externes.
Avec:
vous obtenez le chemin vers la SD externe principale Puis avec:
vous obtenez le répertoire parent du stockage externe principal, et il est également le parent de tous les sd externes. Maintenant, vous pouvez répertorier tout le stockage et sélectionner celui que vous souhaitez.
J'espère que c'est utile.
la source
Voici comment obtenir la liste des chemins de la carte SD (à l'exclusion du stockage externe principal):
la source
externalCacheDirs[0].getParentFile().getParentFile().getParentFile().getParentFile().getAbsolutePath()
Ceci est une recette pour le désastre. Si vous faites cela, vous pouvez tout aussi bien coder en dur le chemin que vous voulez, car si vous obtenez un répertoire de cache avec autre chose que 4 parents, vous obtiendrez NullPointerException ou le mauvais chemin.Merci pour les indices fournis par vous, en particulier @SmartLemon, j'ai la solution. Au cas où quelqu'un d'autre en aurait besoin, je mets ma solution finale ici (pour trouver la première carte SD externe répertoriée):
S'il n'y a pas de carte SD externe, alors il renvoie le stockage à bord. Je vais l'utiliser si la carte SD n'existe pas, vous devrez peut-être la changer.
la source
reportez-vous à mon code, j'espère que cela vous sera utile:
la source
En fait, sur certains périphériques, le nom par défaut de la carte SD externe s'affiche comme
extSdCard
et pour d'autressdcard1
.Cet extrait de code aide à trouver ce chemin exact et vous aide à récupérer le chemin du périphérique externe.
la source
Oui. Différents fabricants utilisent un nom de carte SD différent comme dans Samsung Tab 3 son extsd, et d'autres appareils Samsung utilisent une carte SD comme ce fabricant différent utilise des noms différents.
J'avais la même exigence que vous. J'ai donc créé un exemple d'exemple pour vous à partir de mon projet. Aller à ce lien Exemple de sélecteur d'annuaire Android qui utilise la bibliothèque androi-dirchooser. Cet exemple détecte la carte SD et répertorie tous les sous-dossiers et détecte également si l'appareil a plus d'une carte SD.
Une partie du code ressemble à ceci Pour un exemple complet, allez au lien Sélecteur d'annuaire Android
la source
Cette solution (assemblée à partir d'autres réponses à cette question) gère le fait (comme mentionné par @ono) qui
System.getenv("SECONDARY_STORAGE")
n'est d'aucune utilité avec Marshmallow.Testé et travaille sur:
Samsung Galaxy Tab A (Android 6.0.1 - Stock)
la source
rawSecondaryStoragesStr.contains(path)
peut également permettre au stockage interne d'être ajouté; nous pouvons mieux supprimer cette condition .. J'ai rencontré ce problème, car mon appareil renvoie le répertoire de stockage interne avecSystem.getenv("SECONDARY_STORAGE")
, mais renvoie le chemin de la carte mémoire externe avecSystem.getenv(EXTERNAL_STORAGE)
sur KitKat; il semble que différents fournisseurs aient mis en œuvre cela différemment sans aucune norme.Sur certains appareils (par exemple samsung galaxy sII), la carte mémoire interne peut être en vfat. Dans ce cas, utilisez le dernier code, nous obtenons le chemin de la carte mémoire interne (/ mnt / sdcad) mais pas de carte externe. Le code ci-dessous résout ce problème.
la source
la source
Je suis sûr que ce code résoudra sûrement vos problèmes ... Cela fonctionne bien pour moi ... \
la source
ce n'est pas vrai. / mnt / sdcard / external_sd peut exister même si la carte SD n'est pas montée. votre application plante lorsque vous essayez d'écrire dans / mnt / sdcard / external_sd lorsqu'elle n'est pas montée.
vous devez vérifier si la carte SD est montée en premier en utilisant:
la source
getExternalStorageState()
renvoie le stockage interne plutôt que la carte SD externe, je pense.la source
Vous pouvez utiliser quelque chose comme - Context.getExternalCacheDirs () ou Context.getExternalFilesDirs () ou Context.getObbDirs (). Ils fournissent des répertoires spécifiques à l'application dans tous les périphériques de stockage externes où l'application peut stocker ses fichiers.
Donc quelque chose comme ça - Context.getExternalCacheDirs () [i] .getParentFile (). GetParentFile (). GetParentFile (). GetParent () peut vous trouver le chemin racine des périphériques de stockage externes.
Je sais que ces commandes ont un but différent, mais d'autres réponses n'ont pas fonctionné pour moi.
Ce lien m'a donné de bons conseils - https://possiblemobile.com/2014/03/android-external-storage/
la source
System.getenv("SECONDARY_STORAGE")
renvoie null pour Marshmallow. C'est une autre façon de trouver tous les répertoires externes. Vous pouvez vérifier s'il est amovible, ce qui détermine si interne / externela source
J'ai essayé les solutions fournies par Dmitriy Lozenko et Gnathonic sur mon Samsung Galaxy Tab S2 (Modèle: T819Y) mais aucune ne m'a aidé à récupérer le chemin vers un répertoire de carte SD externe.
mount
l'exécution de la commande contenait le chemin requis vers le répertoire de la carte SD externe (c'est-à-dire / Storage / A5F9-15F4) mais il ne correspondait pas à l'expression régulière et n'a donc pas été renvoyé. Je ne reçois pas le mécanisme de dénomination de répertoire suivi par Samsung. Pourquoi ils s'écartent des normes (extsdcard) et proposent quelque chose de vraiment louche comme dans mon cas (par exemple / Storage / A5F9-15F4) . Y a-t-il quelque chose qui me manque? Quoi qu'il en soit, suite aux changements dans l'expression régulière de Gnathonic La solution m'a aidé à obtenir un répertoire sdcard valide:Je ne sais pas si c'est une solution valide et si elle donnera des résultats pour d'autres tablettes Samsung, mais cela a résolu mon problème pour le moment. Voici une autre méthode pour récupérer le chemin de la carte SD amovible dans Android (v6.0). J'ai testé la méthode avec Android guimauve et cela fonctionne. L'approche utilisée est très basique et fonctionnera sûrement pour d'autres versions aussi, mais les tests sont obligatoires. Un aperçu de cela sera utile:
Veuillez partager si vous avez une autre approche pour gérer ce problème. Merci
la source
Cela obtiendra le chemin du stockage secondaire externe sd.
la source
la source
Pour accéder aux fichiers de ma carte SD , sur mon HTC One X (Android), j'utilise ce chemin:
Notez le triple "/"!
la source
Sur Galaxy S3 Android 4.3, le chemin que j'utilise est ./storage/extSdCard/Card/ et il fait le travail. J'espère que ça aide,
la source
Les étapes suivantes ont fonctionné pour moi. Il vous suffit d'écrire ces lignes:
La première ligne donnera le nom du répertoire sd, et il vous suffit de l'utiliser dans la méthode replace pour la deuxième chaîne. La deuxième chaîne contiendra le chemin du sd interne et amovible (/ storage / dans mon cas) . J'avais juste besoin de ce chemin pour mon application mais vous pouvez aller plus loin si vous en avez besoin.
la source