Wie liste ich Dateien in einem Android-Verzeichnis auf?

120

Hier ist mein Code bisher:

String path = Environment.getExternalStorageDirectory().toString()+"/Pictures";

        AssetManager mgr = getAssets();

        try {

            String list[] = mgr.list(path);
            Log.e("FILES", String.valueOf(list.length));

            if (list != null)
                for (int i=0; i<list.length; ++i)
                    {
                        Log.e("FILE:", path +"/"+ list[i]);
                    }

        } catch (IOException e) {
            Log.v("List error:", "can't list" + path);
        }

Obwohl ich Dateien in diesem Verzeichnis habe, gibt es mir list.length = 0 zurück ... irgendwelche Ideen?

Roger Travis
quelle

Antworten:

327

Um auf die Dateien zugreifen zu können, müssen die Berechtigungen in der Manifestdatei angegeben werden.

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

Versuche dies:

String path = Environment.getExternalStorageDirectory().toString()+"/Pictures";
Log.d("Files", "Path: " + path);
File directory = new File(path);
File[] files = directory.listFiles();
Log.d("Files", "Size: "+ files.length);
for (int i = 0; i < files.length; i++)
{
    Log.d("Files", "FileName:" + files[i].getName());
}
Yury
quelle
7
Danke Yury, seltsamerweise gibt file.length eine NullPointerException ... irgendwelche Ideen? Spasibo!
Roger Travis
8
Ich denke, dass Sie keine Dateien im angegebenen Ordner haben. Versuchen Sie, die Datei [] auf null zu überprüfen. Wenn es null ist, haben Sie keine Ergebnisse und file.length verursacht die Ausnahme.
Yury
4
Anscheinend fehlte nur ein "/" :) Danke!
Roger Travis
1
Arbeitete wie Charme! Mein Handy ist Moto G4, Android N . Wenn jemand vor can't play video error. Sie müssen zu Ihrem Handy gehen settings --> apps --> your app --> permissions --> enable storage. Sollte dies manuell tun, wenn Sie auf diesen Fehler stoßen. Stellen Sie sicher, dass Sie <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />in Ihrem Manifest haben. Für die Menschen, denen NullPointerExceptionSie gegenüberstehen - Sie versuchen, auf die Dateien im internen Speicher der App zuzugreifen, die privat sind. Entschuldigung, das können Sie nicht.
Coderpc
gibt es so etwas wie fileList (). clear ();? , so kann ich diese Methode wiederverwenden
user55924
43

Ich habe gerade entdeckt, dass:

new File("/sdcard/").listFiles() Gibt null zurück, wenn Sie nicht haben:

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

in Ihrer AndroidManifest.xml-Datei festlegen.

Dan Brough
quelle
6
Ich weiß, dass dies die Wahrheit ist, aber ... Ist das eine Antwort? Oder sollte ein Kommentar sein?
Joaquin Iurchuk
7
Unter Android 6.0+ muss die Berechtigung außerdem unter Einstellungen-> Apps-> Ihre App-> Berechtigungen erteilt werden.
vt.
1
Es gibt auch null zurück, wenn das Verzeichnis leer ist
Hitesh Sahu
11

Nun, die AssetManagerListen Dateien innerhalb derassets Ordner, der sich in Ihrer APK-Datei befindet. Was Sie also in Ihrem obigen Beispiel auflisten möchten, ist [apk] / assets / sdcard / Pictures.

Wenn Sie einige Bilder in den assetsOrdner Ihrer Anwendung legen und sie sich im PicturesVerzeichnis befinden, würden Sie dies tunmgr.list("/Pictures/") .

Wenn Sie andererseits Dateien auf der SD-Karte außerhalb Ihrer APK-Datei im PicturesOrdner haben, würden Sie Folgendes verwenden File:

File file = new File(Environment.getExternalStorageDirectory(), "Pictures");
File[] pictures = file.listFiles();
...
for (...)
{
log.e("FILE:", pictures[i].getAbsolutePath());
}

Und relevante Links aus den Dokumenten:
File
Asset Manager

Schilf
quelle
Versuchte, dass "File [] images = file.listFiles ();", aber es gibt auch eine NullPointException ... hmm ...
Roger Travis
1
Anscheinend fehlte nur ein "/" :) Danke!
Roger Travis
1
Danke, dass du meinen Tag gerettet
hast
@ SyedNazarMuhammad Ha. Und danke, dass du meine gerettet hast, mein Freund. Genießen Sie immer eine positive Bemerkung: D
Reed
11

Zusätzlich zu allen obigen Antworten:

Wenn Sie mit Android 6.0+ (API Level 23+) arbeiten, müssen Sie explizit um Erlaubnis bitten, auf externen Speicher zugreifen zu dürfen. Einfach haben

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

in deinem Manifest wird nicht genug sein. Sie haben auch aktiv die Erlaubnis für Ihre Aktivität angefordert:

//check for permission
if(ContextCompat.checkSelfPermission(this,
            Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED){
    //ask for permission
    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_EXTERNAL_STORAGE_PERMISSION_CODE);
}

Ich empfehle dies zu lesen: http://developer.android.com/training/permissions/requesting.html#perm-request

Gabriel
quelle
2

Ihr pathbefindet sich nicht im Assets-Ordner. Entweder Sie zählen Dateien im Assets-Ordner mit auf AssetManager.list()oder Sie zählen Dateien auf Ihrer SD-Karte mit aufFile.list()

Alexander Kulyakhtin
quelle
1
String[] listOfFiles = getActivity().getFilesDir().list();

oder

String[] listOfFiles = Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS).list();
rdkit
quelle
1

Versuche dies:

public class GetAllFilesInDirectory {

public static void main(String[] args) throws IOException {

    File dir = new File("dir");

    System.out.println("Getting all files in " + dir.getCanonicalPath() + " including those in subdirectories");
    List<File> files = (List<File>) FileUtils.listFiles(dir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
    for (File file : files) {
        System.out.println("file: " + file.getCanonicalPath());
    }

}

}
Iman Marashi
quelle
1

Es gibt zwei Dinge, die passieren könnten:

  • Sie fügen READ_EXTERNAL_STORAGEIhrer Berechtigung keine Berechtigung hinzuAndroidManifest.xml
  • Sie zielen auf Android 23 ab und bitten den Benutzer nicht um diese Erlaubnis. Gehen Sie zu Android 22 oder fragen Sie den Benutzer nach dieser Erlaubnis.
Roc Boronat
quelle
0

Probiere diese

 String appDirectoryName = getResources().getString(R.string.app_name);
    File directory = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + getResources().getString(R.string.app_name));
    directory.mkdirs();
    File[] fList = directory.listFiles();
    int a = 1;
    for (int x = 0; x < fList.length; x++) {

        //txt.setText("You Have Capture " + String.valueOf(a) + " Photos");
        a++;
    }
    //get all the files from a directory
    for (File file : fList) {
        if (file.isFile()) {
            list.add(new ModelClass(file.getName(), file.getAbsolutePath()));
        }
    }
Mujahid Khan
quelle
0

Wenn Sie mit Android 10 / Q arbeiten und die richtigen Schritte unternommen haben, um Zugriffsberechtigungen zum Lesen des externen Speichers anzufordern, und dies immer noch nicht funktioniert, sollten Sie diese Antwort lesen:

Android Q (10) bittet um Erlaubnis, auf den gesamten Speicher zugreifen zu dürfen. Speicherbereich

Ich hatte Arbeitscode, aber mein Gerät hat es auf sich genommen, es zu aktualisieren, wenn es über eine Netzwerkverbindung bestand (normalerweise ohne Verbindung). In Android 10 funktionierte der Dateizugriff nicht mehr. Die einzige einfache Möglichkeit, das Problem zu beheben, ohne den Code neu zu schreiben, bestand darin, das zusätzliche Attribut wie beschrieben zum Manifest hinzuzufügen. Der Dateizugriff funktioniert jetzt wieder wie in Android 9. YMMV, es wird wahrscheinlich in zukünftigen Versionen nicht mehr funktionieren.

Matt Emson
quelle