web-dev-qa-db-fra.com

Android: mkdirs ()/mkdir () sur un stockage externe renvoie false

Je suis devenu fou avec ça:

Log.d("STATE", Environment.getExternalStorageState());
File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "work_data");
Log.d("PATH", f.getAbsolutePath());
if (!f.exists()) {
    Log.d("MAKE DIR", f.mkdirs() + "");
}

Le journal de sortie ressemble à ceci:

STATE     mounted
PATH      /mnt/sdcard/DCIM/work_data
MAKE DIR  false

Je me suis assuré d'ajouter la bonne permission:

 <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/> 

Mais je ne sais pas pourquoi il n'a pas pu créer le dossier. J'ai aussi utilisé mkdir() pas à pas, mais le résultat est le même. Aidez-moi, s'il vous plaît. J'ai tellement cherché sur Google et passé au moins 2 jours sur cette chose stupide. Merci de votre aide!!

ÉDITION:

Désolé tout le monde! J'avais ajouté <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/> dans la balise <application>. c'était ma faute! Mais merci à tous pour la réponse.

27
MHM

J'ai eu le même problème et j'ai tout cherché pendant une semaine en essayant de trouver la réponse. Je pense l'avoir trouvée et je pense que c'est ridiculement facile, vous devez mettre la déclaration d'utilisations-permission au bon endroit ...

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.company.name" 
    Android:versionCode="1"
    Android:versionName="0.2">

    <uses-sdk Android:minSdkVersion="8" />
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

Quand je l'ai eu dans la section <application> </ application>, cela n'a pas fonctionné.

27
Omnivore

J'ai eu le même problème, et je suis sûr d'avoir placé l'étiquette d'autorisation au bon endroit, mais mkdirs ne fonctionnait pas encore, mon système est Android 6.0, je le résous maintenant, vous pouvez vérifier comme suit:

  1. assurez-vous que vous mettez l'étiquette de permission dans.
  2. ouvrez "setting/application" dans votre téléphone, vérifiez l'autorisation de votre application (j'ai trouvé l'autorisation dans ma déclaration de manifeste n'est pas ici), ouvrez le commutateur de l'autorisation comme ceci (j'ai trouvé qu'il est fermé par défaut, ce qui fait "mkdirs" échoué)

 enter image description here

53
Fido Zhang

Je sais que c'est un ancien post, mais ma réponse peut peut-être aider quelqu'un.

Après plusieurs jours consacrés à ce problème, je me suis rendu compte que la carte SD n’était pas disponible tant que le téléphone était connecté au PC, ce qui est toujours le cas lors du développement. Faisant ainsi échouer toute tentative de créer un répertoire ou un fichier dessus . Pour le rendre "plus facile", il semblait se comporter différemment selon le téléphone testé.

Je sais que cela peut sembler un problème assez ridicule, mais cela peut prendre beaucoup de temps qu'un autre peut peut-être économiser.

14
Clark Ku

ajouter cette ligne de code dans OnCreate ()

ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
7
Osama Ibrahim

Si vous avez Android 6.0 et plus, assurez-vous que votre sdk cible dans le fichier de classement est inférieur à 22:

targetSdkVersion 22

ou vous devez implémenter des autorisations d'exécution. 

2
phnmnn

mettre ceci

Log.d("MAKE DIR", f.mkdir() + "");

au lieu de

Log.d("MAKE DIR", f.mkdirs() + "");

ou essayez ceci

String s=Environment.getExternalStorageDirectory().toString()+"/";
File f = new File(s+"DCIM/work_data");
2
Azhar Shaikh

Votre code fonctionne bien pour moi. Il n'y a aucune anomalie dans votre code . Si vous créez un seul répertoire, utilisez f.mkdir() au lieu de f.mkdirs() Vous pouvez voir votre dossier dans mnt => Sd card => DCIM => work_data

2
Dharmendra

mkdirs () ne renvoie true que si le répertoire a été créé. S'il est déjà en place, il devrait retourner false. Je parierais donc que ce répertoire existe déjà.

2
dragonroot

J'avais le même problème et je voulais simplement partager mon correctif ..__ sous Android Depuis Android 4.4, lire ou écrire des fichiers dans les répertoires privés de votre application ne nécessite pas les autorisations READ_EXTERNAL_STORAGE ou WRITE_EXTERNAL_STORAGE.

Vous pouvez donc déclarer que l'autorisation ne devrait être demandée que sur les versions inférieures d'Android en ajoutant l'attribut maxSdkVersion:

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

mais maxSdkVersion est le problème, je viens de le supprimer et maintenant cela fonctionne.

2
Manish Jain

Cela pourrait aider quelqu'un à l'avenir.

le problème peut aussi être que vous écrivez l'adresse "/ Fichier/Adresse /" à la place, vous devriez écrire

File.separator + "File" + File.separator + "Address" + File.separator

C'est une chose si petite et stupide, mais cela a fonctionné pour moi après avoir perdu des heures de mon temps.

1
Mayank

J'ai essayé de créer un ensemble de sous-dossiers dans la mémoire externe 'Test/Test1/Test2' lorsque mkdirs () renvoyait false. Il s'avère que 'Test' est un mot réservé pour un dossier dans la racine de stockage externe. Il s’agissait d’un Motorola G (XT1541) qui peut également s’appliquer à d’autres appareils.

0