web-dev-qa-db-fra.com

Le fichier existe et IS répertoire, mais listFiles () renvoie null

La documentation de File.listFiles() suggère que null sera retourné UNIQUEMENT dans le cas où le fichier qui l’appelle n’est pas un répertoire.

J'ai le 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 lit:

true
true
null

Pour une raison quelconque, listFiles() renvoie null même si la File est reconnue comme un répertoire valide. Je ne suis pas très familier avec le comportement de la hiérarchie de fichiers Android, donc je suppose que le problème réside là-dedans.

Pour référence, je débogue sur mon Moto X et les résultats sont les mêmes, que le téléphone soit branché ou non sur mon ordinateur - je ne pense donc pas que cela ait à voir avec le montage lorsque branché.

55
Wilson

Pour ceux qui ont ce problème, ajoutez ceci à AndroidManifest.xml: 

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

Problème résolu: D

EDIT: Si cela ne fonctionne pas, assurez-vous simplement que le chemin est correct

77
BamsBamx

Pour Android version 23 ou supérieure , vous devez donner l'autorisation à l'exécution par programme dans la méthode onresume comme ci-dessous, 

public final String[] EXTERNAL_PERMS = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE
};

public final int EXTERNAL_REQUEST = 138;

requestForPermission();

public boolean requestForPermission() {

    boolean isPermissionOn = true;
    final int version = Build.VERSION.SDK_INT;
    if (version >= 23) {
        if (!canAccessExternalSd()) {
            isPermissionOn = false;
            requestPermissions(EXTERNAL_PERMS, EXTERNAL_REQUEST);
        }
    }

    return isPermissionOn;
}

public boolean canAccessExternalSd() {
    return (hasPermission(Android.Manifest.permission.WRITE_EXTERNAL_STORAGE));
}

private boolean hasPermission(String perm) {
    return (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(this, perm));

}
14
varotariya vajsi

Pour ceux qui ont ce problème, donnez ceci à AndroidManifest.xml:

Android:name="Android.permission.READ_EXTERNAL_STORAGE" 

et vous devriez également accorder la permission de 

Paramètres> Applications> "Nom de votre application" > Autorisations> Stockage

10
Ravi Joshi

Dans la documentation de la méthode File 'listFiles': Renvoie la valeur null si ce chemin d'accès abstrait ne désigne pas un répertoire, ou si une erreur d'entrée-sortie se produit.

Alors peut-être une erreur I/O s'est produite. Vérifiez les autorisations sur ce répertoire, l'utilisateur qui exécute le programme Java a-t-il l'autorisation de lire ce répertoire? Si non, il y a votre réponse. Si tel est le cas, le répertoire est peut-être vide.

Au lieu de cela, vous ne devriez pas utiliser "" "pour convertir quelque chose en chaîne, ce qui est une mauvaise pratique car elle est plus lente que String.valueOf. J'utiliserais StringUtils d'Apache pour joindre ce tableau en une chaîne, mais cela nécessite l'ajout de ce fichier jar à votre chemin d'accès aux classes.

7
msknapp

Ajoutez simplement l’autorisation dans manifest uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" et votre problème sera résolu.

2
kamal

Mon problème était que pour une raison quelconque, l'attribut Android: sharedUserId = "Android.uid.system" n'autorisait pas l'application à lire/sdcard/sur un appareil spécifique.

Comme je n'avais besoin que de faire un test rapide, j'ai supprimé l'attribut sharedUserId, testé et rajouté.

1
thiagolr

Dans le fichier manifeste de la section <uses-permission .... >, ajoutez cette ligne Android:name="Android.permission.READ_EXTERNAL_STORAGE". Je pense que cela peut résoudre votre problème.

0
Rajan Menon

J'ai eu le même problème sous Java mais pas sous Android où je lis un fichier de configuration avec un chemin entre guillemets. J'ai résolu mon problème en enlevant simplement les guillemets

Donc, vous pouvez le faire par la fonction de remplacement de chaîne ou le donner sans guillemets 

String someString = "C:\path"; SomeString = someString.replace ("\" "," ");

0
Sam