2011-12-27 18 views
69

Oto mój kod do tej pory:Jak wyświetlić listę plików w katalogu android?

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

Jednak gdy mam pliki w tym katalogu, to zwraca mi list.length = 0 ... jakieś pomysły?

Odpowiedz

208

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

Dzięki Yury, dziwnie file.length daje NullPointerException ... jakieś pomysły? Spasibo! –

+8

Myślę, że nie masz plików w określonym folderze. Spróbuj sprawdzić plik [] pod kątem wartości NULL. Jeśli jest wartość null, nie masz żadnych wyników, a plik.length powoduje wyjątek. – Yury

+3

Wygląda na to, że brakowało tylko "/" :) Dzięki! –

2

Twój path nie znajduje się w folderze aktywów. Albo wyliczyć pliki w folderze aktywów poprzez AssetManager.list() lub wyliczyć pliki na karcie SD za pomocą File.list()

6

dobrze, AssetManager list plików w folderze assets który jest wewnątrz pliku APK. Więc co próbujesz wyświetlić w powyższym przykładzie to [apk]/assets/sdcard/Pictures.

Jeśli umieścisz kilka zdjęć w folderze assets wewnątrz aplikacji, a one były w katalogu Pictures, zrobiłbyś mgr.list("/Pictures/").

Z drugiej strony, jeśli masz pliki na sdcard, które są poza pliku APK, w folderze Pictures, to użyłby File jak tak:

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

i odpowiednich linków z docs :
File
Asset Manager

+0

Próbowałem, że "File [] pictures = file.listFiles();", ale daje także wyjątek NullPointException ... hmm ... –

+1

Wygląda na to, że brakowało tylko "/" :) Dzięki! –

+1

Dzięki za uratowanie mojego dnia :) –

32

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

new File("/sdcard/").listFiles() zwraca NULL jeśli nie masz:

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

ustawiona w pliku AndroidManifest.xml.

+1

Wiem, że to prawda, ale ... Czy to jest odpowiedź? A może powinienem być komentarzem? –

+5

Ponadto na Androidzie 6.0+ należy udzielić pozwolenia w Ustawieniach-> Aplikacje-> Twoja aplikacja-> Uprawnienia. –

+0

Zwraca również wartość null, jeśli katalog jest pusty –

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

lub

String[] listOfFiles = Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS).list(); 
0

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

} 

} 
1

Są dwie rzeczy, które mogą się zdarzyć:

  • Nie jesteś dodając READ_EXTERNAL_STORAGE pozwolenie na swojej AndroidManifest.xml
  • Skierujesz na Androida 23 i nie pytasz o to pozwolenie dla użytkownika. Zejdź na Androida 22 lub poproś użytkownika o to pozwolenie.
6

Oprócz wszystkich powyższych odpowiedzi:

Jeśli jesteś na Androida 6.0+ (poziom API 23+) trzeba wyraźnie poprosić o zezwolenie na dostęp do pamięci zewnętrznej.Po prostu posiadanie w twoim manifeście nie wystarczy, aby uzyskać w twoim manifeście. Również aktywnie wystąpić 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 czytanie tego: http://developer.android.com/training/permissions/requesting.html#perm-request

Powiązane problemy