getExternalFilesDir(null) retourne null
Encore une fois, je suis venu à l'encontre d'une question qui a été demandé et répondu avant, mais dans mon application, il ne fonctionne toujours pas.
Je vais appeler getExternalFilesDir(null) droit au tout début de mon activité principale est onCreate méthode. Elle renvoie la valeur null à chaque fois, que je le lance dans un AVD ou sur mon téléphone (Samsung Galaxy Plus).
Oui, j'ai le <uses-permission android:name="android.permissions.WRITE_EXTERNAL_STORAGE" />
ligne dans mon AndroidManifest.xml et oui, je suis la vérification de l'appareil de stockage externe de l'état avant de me faire l'appel et qu'il est monté.
Voici les trois premières lignes à l'intérieur de mon onCreate() méthode. En fait, c'est juste après l' super.onCreate() et setContentView() appels.
String state = Environment.getExternalStorageState();
File extFiles = getExternalFilesDir(null);
File locFiles = getFilesDir();
Donc, une fois que ces trois lignes ont été exécutées, ce sont des valeurs pour les variables:
state == "mounted"
extFiles == null
locFiles == "/data/data/com.mypackage.name/files"
Quelqu'un aurait-il une idée de quoi cela peut-il être?
-----EDIT-----
J'ai donc essayé une autre approche; Plutôt que d'utiliser getExternalFilesDir(null)
, j'ai essayé d'utiliser File basePath = new File(Environment.getExternalStorageDirectory(), "myAppName");
Ce n'est pas l'idéal et je sais que l'Android documentation dit, et je suis d'accord avec elle, que vous devriez plutôt utiliser getExternalFilesDir()
. Voyant que cela ne fonctionne pas pour moi, même si j'ai eu à essayer quelque chose d'autre. Cette fois, la fonction renvoie un objet de Fichier valide donc, après la ligne ci-dessus, le chemin de basePath est /mnt/sdcard/myAppName. Pour l'instant, donc bon. Lorsque je vérifie avec DDMS je peux voir que /mnt/sdcard existe, mais pas /mnt/sdcard/myAppName. Ce n'est à prévoir. J'appelle donc boolean result = basePath.mkdirs();
Mais ceci renvoie false et quand je vérifie sur le système de fichiers, je peux confirmer que le myAppName sous-dossier n'a pas été créé. Quand j'ai créer le dossier manuellement par l'intermédiaire de DDMS et de mettre des fichiers, je peux lire ces fichiers à partir de mon application, mais je ne peut rien écrire dans ce dossier.
S'il vous plaît aider! Je suis à mon wit's end.
- avez-vous essayé avec un type spécifique, comme
MUSIC
? - Oui, je l'ai essayé et il renvoie également null.
- 1) Nettoyer/créer un projet dans Eclipse. 2) Plein de désinstallation/réinstallation de l'application. La même chose se produire?
- OK, j'ai juste essayé et ça n'aide pas non plus. J'ai découvert une autre chose étrange qui pourraient être liées. Je vais modifier la question d'origine pour en tenir compte.
Vous devez vous connecter pour publier un commentaire.
Si ce n'était pas une faute de frappe lorsque vous avez posté votre question, vous aurez probablement vous détester pour cela:
<uses-permission android:name="android.permissions.WRITE_EXTERNAL_STORAGE" />
devrait être
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
(checkCallingOrSelfPermission("android.permission.WRITE_EXTERNAL_STORAGE") == PackageManager.PERMISSION_GRANTED)
qui évalue à false. Est-il une sorte de sortie généré par le compilateur pour indiquer lorsque vous avez ces types d'erreurs dans votre manifeste?C'est à partir d'Android documentation:
L'autre option est que vous pouvez vérifier si de stockage Externe est disponible:
getExternalFilesDir()
est disponible sur API8+ etgetFilesDir()
est également PAS accessible sur API19+ (KitKat). Procéder avec prudence 🙂Supprimer une ligne
dans
AndroidManifest.xml
.Passer d'un éditeur xml pour "Manifeste Android Autorisations" avec la "Permission" de l'onglet dans eclipse, et ajouter un
en quelques clics.
Puis essayez d'exécuter votre application.
Il semble eclipse (peut-dépend d'une defference de la version ou de l'état ou des paramètres) peuvent ignorer certains termes décrits par direct xml dans
AndroidManifest.xml
.Merci pour un conseil. Vous avez raison, ma réponse ressemblait à s'entendre parler les petits.
Mon problème est que j'ai ouvert un FileOutputStream, puis avant j'ai fermé la FileOutputStream, j'ai ouvert un FileInputStream pour voir ce qui était déjà dans le fichier.
J'ai déménagé de l'ouverture de la FileInputStream à l'avant de la FileOutputStream est ouvert et qui a résolu mon problème.