Android: mkdirs ()/mkdir () sur les retours de stockage externe false

je suis attirée fou avec ceci:

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

j'ai fait en sorte d'ajouter l'autorisation correcte:

 <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() étape par étape, mais le résultat est le même. S'il vous plaît aider moi. J'ai googlé tellement et passé au moins 2 jours sur cette chose stupide. Merci pour votre aide!!

édition:

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

25
demandé sur Chris 2011-08-27 08:33:56

11 réponses

j'ai eu le même problème et j'ai cherché tout pour une semaine à essayer de trouver la réponse. Je pense que je l'ai trouvé et je pense que c'est ridiculement facile, vous devez mettre la déclaration d'utilisation-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 > ça n'a pas marché.

25
répondu Omnivore 2018-03-13 01:41:10

j'ai eu le même problème,et je suis sûr que j'avais mis l'étiquette de permission 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 ci-dessous:

  1. assurez-vous de mettre l'étiquette de permission .
  2. ouvrez "Paramètres / application" dans votre téléphone,vérifiez la permission de votre application(j'ai trouvé la permission dans mon manifeste n'est pas ici),ouvrez le commutateur de la permission comme ceci.(Je trouve qu'il est fermé par défaut qui faire "mkdirs" échec)

enter image description here

49
répondu Fido Zhang 2016-06-13 02:59:02

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

après plusieurs jours de traitement de ce problème, je me suis rendu compte que bien que le téléphone soit connecté à L'ordinateur, ce qui est toujours le cas pendant le développement, la carte SD n'est pas disponible. Faisant ainsi échouer toute tentative de créer un répertoire ou un fichier. Pour le rendre "plus facile", il semblait se comporter différemment selon le téléphone testé.

je sais que cela peut sembler assez stupide problème, mais il a coûté beaucoup de temps qui peut-être quelques autres peut sauver.

12
répondu Clark Ku 2012-10-23 14:08:57

ajouter cette ligne de code dans OnCreate()

ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
4
répondu Osama Ibrahim 2017-04-12 09:10:57

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

au lieu de

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

ou bien

String s=Environment.getExternalStorageDirectory().toString()+"/";
File f = new File(s+"DCIM/work_data");
2
répondu Azhar Shaikh 2011-08-27 04:59:38

Ton code fonctionne très bien pour moi.Il n'est pas quelque chose de mauvais dans votre code. Seulement si vous êtes l'un répertoire d'utiliser f.mkdir() au lieu de f.mkdirs() Vous pouvez voir votre dossier dans mnt => Sd card => DCIM => work_data

2
répondu Dharmendra 2011-08-27 05:02:09

mkdirs () ne renvoie true que si le répertoire a été créé. Si elle est déjà en place, elle devrait retourner false. Je parie que ce répertoire existe déjà.

2
répondu dragonroot 2011-08-27 05:51:00

j'avais le même problème, et je voulais juste partager ma dose. comme par android en commençant par Android 4.4, la lecture ou l'écriture de fichiers dans les répertoires privés de votre application ne nécessite pas les permissions READ_EXTERNAL_STORAGE ou WRITE_EXTERNAL_STORAGE.

vous pouvez donc déclarer que la permission ne doit ê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 la problème, j'ai juste enlevé et maintenant ça fonctionne.

2
répondu Manish Jain 2016-06-09 10:27:52

si vous avez android 6.0 et plus, assurez - vous que votre sdk cible dans le fichier gradle moins de 22:

targetSdkVersion 22

ou vous devez implémenter les permissions d'exécution.

2
répondu phnmnn 2016-09-22 19:51:41

Cela peut aider quelqu'un dans le futur.

le problème pourrait aussi être que vous écrivez l'adresse "/ File / Address/ " à la place vous devriez écrire

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

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

1
répondu Mayank 2014-12-16 22:07:29

j'ai essayé de faire un ensemble de sous-dossiers dans le stockage externe 'Test/Test1/Test2' quand mkdirs() continuait à retourner false. Il s'avère que 'Test' est soit un mot réservé pour un dossier dans la racine de stockage externe (ou il peut avoir été un dossier caché). Il s'agissait d'une Motorola G (XT1541) qui peut également s'appliquer à d'autres appareils.

0
répondu Roland van der Linden 2018-06-05 05:50:50