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.
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é.
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:
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.
ajouter cette ligne de code dans OnCreate ()
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
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.
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");
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
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à.
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.
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.
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.