Fichier existe et EST un répertoire, mais listFiles() renvoie la valeur null
La documentation de Fichier.listFiles()
suggère que null
sera restitué UNIQUEMENT dans le cas où le fichier en l'appelant n'est pas un répertoire.
J'ai le texte suivant:
String dir = "/storage/emulated/0";
File f = new File(dir);
Log.v("Files",f.exists()+"");
Log.v("Files",f.isDirectory()+"");
Log.v("Files",f.listFiles()+"");
Le journal indique:
true
true
null
Pour une raison quelconque, listFiles(
) est de retour null
même si le File
est reconnu comme l'un répertoire valide. Je ne suis pas super familier avec Android hiérarchie des fichiers de comportement, donc je suppose que le problème est là.
Pour référence, je suis de débogage sur mon Moto X, et les résultats sont les mêmes si le téléphone est branché à mon ordinateur ou pas - je ne crois pas que cela a à faire avec le montage quand il est branché.
- N'est-il pas un problème d'autorisations? Un utilisateur normal d'avoir accès à dir?
- avez-vous essayé de mettre un fichier dans ce répertoire? Me semble que ce que la documentation fait suggère qu'il SERA nulle si elle n'est pas un répertoire, mais il serait également retourner la valeur null si il n'y a aucune réelle Fichiers là
- Eh bien, en Java, Fichier contient les répertoires et il y a des répertoires dans ce dossier.
- Je l'ai mis dans /sdcard, qui pointe à la même chose, et je pense que est ouvert aux utilisateurs..?, et obtenu les mêmes résultats.
- Ce n'
File#canRead()
dites-vous? (Si c'est faux et je suis sûr que c'est, vous obtiendreznull
lorsque vous essayez de lire le contenu de la directoy) - Je souffre du même problème d'autorisation sauf que je suis l'administrateur de ce PC et je ne suis pas tenter d'accéder à tout spécialement protégées répertoires... je ne comprends pas pourquoi mon programme ne fonctionne pas automatiquement quand je le lance, il devrait liste de fichiers dans son propre répertoire lors de l'exécution...
InformationsquelleAutor Wilson | 2013-12-21
Vous devez vous connecter pour publier un commentaire.
Pour les personnes avec ce problème, ajoutez ceci à AndroidManifest.xml:
Problème résolu 😀
EDIT: Si cela ne fonctionne pas, assurez-vous simplement que si le chemin d'accès est correct
Pour android version 23 ou plus, vous avez besoin de donner moment de l'exécution de l'autorisation par programmation dans onresume méthode que ci-dessous,
Pour les personnes avec ce problème, vous donner la permission de lecture, ajouter à AndroidManifest.xml:
et vous devez également accorder l'autorisation de
Paramètres > Applications > "Votre nom de l'application" > les Autorisations > stockage
Du Fichier listFiles' documentation de la méthode: Renvoie la valeur null si ce résumé chemin ne désigne pas un répertoire, ou si une erreur d'e/S se produit.
Donc peut-être une erreur d'e/S s'est produite. Vérifiez les autorisations sur le répertoire, l'utilisateur qui exécute le programme java d'avoir la permission de lire ce répertoire? Si pas, il est votre réponse. S'ils le font, alors peut-être que le répertoire est vide.
BTW, vous ne devez pas utiliser +"" pour convertir quelque chose à une chaîne, c'est une mauvaise pratique, car il est plus lent que Chaîne de caractères.valueOf. Je voudrais utiliser apache StringUtils à se joindre à ce tableau en une chaîne de caractères, mais qui nécessite l'ajout de ce pot à votre classpath.
Il suffit d'ajouter la permission de manifester
uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
et votre problème sera résolu.Mon problème était que, pour une raison quelconque, le android:sharedUserId="android.uid.système" attribut n'a pas été permettre à l'application de lire /sdcard/sur un périphérique spécifique.
Comme j'ai besoin de ne faire qu'un test rapide, j'ai enlevé le sharedUserId attribut, testé et l'a ajouté au dos.
Dans le fichier de manifeste à la
<uses-permission .... >
section, ajoutez cette ligneandroid:name="android.permission.READ_EXTERNAL_STORAGE"
. Je pense que cela peut résoudre votre problème.J'ai eu le même problème en java, mais pas dans android où je suis de la lecture du fichier de config avec chemin d'accès entre guillemets. J'ai résolu mon problème avec juste de retirer les guillemets
De sorte que vous pouvez le faire par la Chaîne de remplacer la fonction ou le donner sans les guillemets
Chaîne someString= "C:\path";
someString=someString.remplacer("\"","");