wake-up-neo.com

Datei existiert und IS verzeichnis, aber listFiles () gibt null zurück

Die Dokumentation für File.listFiles() schlägt vor, dass null NUR zurückgegeben wird, wenn die aufrufende Datei kein Verzeichnis ist.

Ich habe folgendes:

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()+"");

Das Protokoll lautet:

true
true
null

Aus irgendeinem Grund gibt listFiles() null zurück, obwohl die File als gültiges Verzeichnis erkannt wird. Ich bin nicht sehr vertraut mit dem Verhalten der Android-Dateihierarchie, daher würde ich vermuten, dass das Problem darin liegt.

Zur Information debuggen Sie an meiner Moto X und die Ergebnisse sind die gleichen, ob das Telefon an meinen Computer angeschlossen ist oder nicht. Ich glaube nicht, dass es beim Montieren beim Einstecken liegt.

55
Wilson

Für diejenigen mit diesem Problem fügen Sie dies zu AndroidManifest.xml hinzu: 

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

Problem gelöst: D

BEARBEITEN: Wenn dies nicht funktioniert, stellen Sie sicher, dass der Pfad korrekt ist

77
BamsBamx

Für Android Version 23 oder höher müssen Sie Laufzeitberechtigung programmgesteuert in der Onresume-Methode erteilen, 

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

Wenn Sie mit diesem Problem die Leseberechtigung haben, fügen Sie Folgendes zu AndroidManifest.xml hinzu:

Android:name="Android.permission.READ_EXTERNAL_STORAGE" 

und Sie sollten auch die Erlaubnis von erteilen 

Einstellungen> Apps> "Name Ihrer App" > Berechtigungen> Speicher

10
Ravi Joshi

Aus der File 'listFiles'-Methodendokumentation: Gibt null zurück, wenn dieser abstrakte Pfadname kein Verzeichnis kennzeichnet oder wenn ein E/A-Fehler auftritt.

Möglicherweise ist also ein E/A-Fehler aufgetreten. Überprüfen Sie die Berechtigungen für dieses Verzeichnis. Hat der Benutzer, der das Java-Programm ausführt, die Berechtigung, dieses Verzeichnis zu lesen? Wenn nicht, gibt es deine Antwort. Wenn dies der Fall ist, ist das Verzeichnis möglicherweise leer.

Übrigens sollten Sie nicht + "" verwenden, um etwas in eine Zeichenfolge umzuwandeln. Dies ist eine schlechte Praxis, da sie langsamer als String.valueOf ist. Ich würde die StringUtils von Apache verwenden, um dieses Array zu einer Zeichenfolge zu verknüpfen, aber dies erfordert das Hinzufügen dieses Jars zu Ihrem Klassenpfad.

7
msknapp

Fügen Sie einfach die Berechtigung im Manifest uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" hinzu und Ihr Problem wird gelöst.

2
kamal

Mein Problem war, dass das Attribut Android: sharedUserId = "Android.uid.system" der App aus irgendeinem Grund nicht erlaubte,/sdcard/auf einem bestimmten Gerät zu lesen.

Da ich nur einen kurzen Test durchführen musste, entfernte ich das sharedUserId-Attribut, testete es und fügte es wieder hinzu.

1
thiagolr

Fügen Sie in der Manifestdatei im Abschnitt <uses-permission .... > diese Zeile Android:name="Android.permission.READ_EXTERNAL_STORAGE" hinzu. Ich denke, das könnte dein Problem lösen.

0
Rajan Menon

Ich hatte ein ähnliches Problem in Java, aber nicht in Android, wo ich die Konfigurationsdatei mit Pfad in Anführungszeichen lese. Ich habe mein Problem mit dem Entfernen von Anführungszeichen gelöst

Sie können es also tun, indem Sie die Funktion String ersetzen oder ohne Anführungszeichen eingeben 

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

0
Sam