Jak wyświetlić listę plików w katalogu Androida?

121

Oto mój dotychczasowy kod:

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);
        }

Ale chociaż mam pliki w tym katalogu, zwraca mi list.length = 0 ... jakieś pomysły?

Roger Travis
źródło

Odpowiedzi:

329

Aby uzyskać dostęp do plików, uprawnienia muszą być podane w pliku manifestu.

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

Spróbuj tego:

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
źródło
7
Dzięki Yury, dziwnie file.length daje NullPointerException ... jakieś pomysły? Spasibo!
Roger Travis
8
Myślę, że nie masz plików w określonym folderze. Spróbuj sprawdzić, czy plik [] ma wartość null. Jeśli ma wartość null, nie masz żadnych wyników, a plik file.length powoduje wyjątek.
Yury
4
Wygląda na to, że po prostu brakowało znaku „/” :) Dzięki!
Roger Travis
1
Działał jak urok! Mój telefon jest Moto G4, Android N . Jeśli ktoś stoi can't play video error. Musisz przejść do telefonu komórkowego. settings --> apps --> your app --> permissions --> enable storage. Należy to zrobić ręcznie, jeśli napotkasz ten błąd. Upewnij się, że masz <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />w swoim manifeście. Dla osób, które mają do czynienia NullPointerException- próbujesz uzyskać dostęp do plików w pamięci wewnętrznej aplikacji, które są prywatne, przepraszam, że nie możesz tego zrobić.
coderpc
czy jest coś takiego jak fileList (). clear () ;? , więc mogę ponownie użyć tej metody
user55924
44

Właśnie odkryłem, że:

new File("/sdcard/").listFiles() zwraca wartość null, jeśli nie masz:

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

w pliku AndroidManifest.xml.

Dan Brough
źródło
6
Wiem, że to prawda, ale ... Czy to jest odpowiedź? A może powinien być komentarz?
Joaquin Iurchuk,
7
Ponadto w systemie Android 6.0+ uprawnienia należy nadać w menu Ustawienia-> Aplikacje-> Twoja aplikacja-> Uprawnienia.
.
1
Zwraca również wartość null, jeśli katalog jest pusty
Hitesh Sahu
11

Cóż, AssetManagerlista plików w assetsfolderze znajdującym się w pliku APK. Więc to, co próbujesz wymienić w powyższym przykładzie, to [apk] / asset / sdcard / Pictures.

Jeśli umieścisz zdjęcia w assetsfolderze wewnątrz aplikacji i znajdują się one w Pictureskatalogu, zrobisz to mgr.list("/Pictures/").

Z drugiej strony, jeśli masz pliki na karcie SD, które znajdują się poza plikiem APK, w Picturesfolderze, użyjesz w ten Filesposób:

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

I odpowiednie linki z dokumentacji: Menedżer zasobów
plików

Trzcina
źródło
Próbowałem, że „File [] pictures = file.listFiles ();”, ale daje też wyjątek NullPointException ... hmm ...
Roger Travis,
1
Wygląda na to, że po prostu brakowało znaku „/” :) Dzięki!
Roger Travis
1
Dzięki za uratowanie mojego dnia :)
Syed Nazar Muhammad
@SyedNazarMuhammad Ha. I dziękuję za uratowanie mojego, przyjacielu. Zawsze ciesz się pozytywną uwagą: D
Reed
11

Oprócz wszystkich powyższych odpowiedzi:

Jeśli używasz Androida 6.0+ (poziom API 23+), musisz wyraźnie poprosić o pozwolenie na dostęp do zewnętrznej pamięci. Po prostu mając

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

w twoim manifeście nie wystarczy. Aktywnie poprosiłeś również o pozwolenie w swojej działalności:

//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);
}

Polecam przeczytanie tego: http://developer.android.com/training/permissions/requesting.html#perm-request

gabriel
źródło
2

Twój pathnie znajduje się w folderze zasobów. Albo wyliczasz pliki w folderze zasobów za pomocą AssetManager.list()lub wyliczasz pliki na karcie SD za pomocąFile.list()

Alexander Kulyakhtin
źródło
1
String[] listOfFiles = getActivity().getFilesDir().list();

lub

String[] listOfFiles = Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS).list();
rdkit
źródło
1

Spróbuj tego:

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
źródło
1

Mogą się wydarzyć dwie rzeczy:

  • Nie dodajesz READ_EXTERNAL_STORAGEuprawnień do swojegoAndroidManifest.xml
  • Twoim celem jest Android 23 i nie pytasz użytkownika o to pozwolenie. Przejdź do Androida 22 lub poproś użytkownika o to pozwolenie.
Roc Boronat
źródło
0

Spróbuj tych

 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
źródło
0

Jeśli korzystasz z Androida 10 / Q i wykonałeś wszystkie poprawne czynności, aby zażądać uprawnień dostępu do odczytu pamięci zewnętrznej, a nadal nie działa, warto przeczytać tę odpowiedź:

Android Q (10) prosi o pozwolenie na dostęp do całej pamięci. Zakres przechowywania

Miałem działający kod, ale moje urządzenie samo zaktualizowało się, gdy było połączone z siecią (zwykle było to bez połączenia). W Androidzie 10 dostęp do pliku już nie działał. Jedynym łatwym sposobem naprawienia tego bez przepisywania kodu było dodanie tego dodatkowego atrybutu do manifestu zgodnie z opisem. Dostęp do plików działa teraz jak w systemie Android 9. YMMV, prawdopodobnie nie będzie działać w przyszłych wersjach.

Matt Emson
źródło