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é.
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
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));
}
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
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.
Ajoutez simplement l’autorisation dans manifest 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, 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é.
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.
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 ("\" "," ");