Come elencare i file in una directory Android?


120

Ecco il mio codice finora:

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

Tuttavia, anche se ho file in quella directory, mi restituisce list.length = 0 ... qualche idea?

Risposte:


329

Per accedere ai file, le autorizzazioni devono essere fornite nel file manifest.

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

Prova questo:

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
Grazie Yury, stranamente file.length dà una NullPointerException ... qualche idea? Spasibo!
Roger Travis,

8
Penso che tu non abbia file nella cartella specificata. Prova a controllare il file [] per null. Se è nullo, non si hanno risultati e file.length causa l'eccezione.
Yury

4
Sembra che mancasse solo una "/" :) Grazie!
Roger Travis,

1
Ha funzionato come Charm! Il mio cellulare è Moto G4, Android N . Se qualcuno sta affrontando can't play video error. Devi andare sul tuo cellulare settings --> apps --> your app --> permissions --> enable storage. Dovrebbe farlo manualmente se stai riscontrando questo errore. Assicurati di avere <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />nel file manifest. Per le persone che stanno affrontando NullPointerException: stai cercando di accedere ai file nella memoria interna dell'app che sono privati, mi dispiace che tu non possa farlo.
coderpc

c'è qualcosa come fileList (). clear () ;? , quindi posso riutilizzare questo metodo
user55924

44

Ho appena scoperto che:

new File("/sdcard/").listFiles() restituisce null se non si dispone di:

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

impostato nel file AndroidManifest.xml.


6
So che questa è la verità, ma ... è una risposta? O dovrebbe essere un commento?
Joaquin Iurchuk

7
Inoltre, su Android 6.0+ l'autorizzazione deve essere concessa in Impostazioni-> App-> La tua app-> Autorizzazioni.
vt.

1
Inoltre, restituisce null se Directory è vuota
Hitesh Sahu

11

Bene, AssetManagerelenca i file all'interno della assetscartella che si trova all'interno del tuo file APK. Quindi quello che stai cercando di elencare nel tuo esempio sopra è [apk] / assets / sdcard / Pictures.

Se metti alcune immagini all'interno della assetscartella all'interno della tua applicazione e fossero nella Picturesdirectory, lo faresti mgr.list("/Pictures/").

D'altra parte, se hai file sulla sdcard che si trovano al di fuori del tuo file APK, nella Picturescartella, allora dovresti usare Filecosì:

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

E i collegamenti pertinenti dai documenti:
File
Asset Manager


Ho provato "File [] pictures = file.listFiles ();", ma fornisce anche una NullPointException ... hmm ...
Roger Travis

1
Sembra che mancasse solo una "/" :) Grazie!
Roger Travis,

1
Grazie per avermi salvato la giornata :)
Syed Nazar Muhammad

@SyedNazarMuhammad Ha. E grazie per aver salvato il mio, amico mio. Goditi sempre un'osservazione positiva: D
Reed

11

Oltre a tutte le risposte sopra:

Se utilizzi Android 6.0+ (API Level 23+) devi chiedere esplicitamente il permesso per accedere alla memoria esterna. Semplicemente avendo

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

nel tuo manifest non sarà sufficiente. Hai anche richiesto attivamente il permesso nella tua attività:

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

Consiglio di leggere questo: http://developer.android.com/training/permissions/requesting.html#perm-request


2

Il tuo pathnon è nella cartella delle risorse. O si enumerano i file all'interno della cartella delle risorse tramite AssetManager.list()o si enumerano i file sulla scheda SD medianteFile.list()


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

o

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

1

Prova questo:

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

Ci sono due cose che potrebbero accadere:

  • Non stai aggiungendo l' READ_EXTERNAL_STORAGEautorizzazione al tuoAndroidManifest.xml
  • Stai prendendo di mira Android 23 e non stai chiedendo tale autorizzazione all'utente. Vai ad Android 22 o chiedi all'utente tale autorizzazione.

0

Prova questi

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

0

Se sei su Android 10 / Q e hai fatto tutte le cose corrette per richiedere le autorizzazioni di accesso per leggere la memoria esterna e ancora non funziona, vale la pena leggere questa risposta:

Android Q (10) chiede l'autorizzazione per accedere a tutto lo spazio di archiviazione. Archiviazione con ambito

Avevo un codice funzionante, ma il mio dispositivo si è incaricato di aggiornare quando era su una connessione di rete (di solito era senza connessione). Una volta in Android 10, l'accesso ai file non funzionava più. L'unico modo semplice per risolverlo senza riscrivere il codice era aggiungere quell'attributo extra al manifest come descritto. L'accesso ai file ora funziona di nuovo come in Android 9. YMMV, probabilmente non continuerà a funzionare nelle versioni future.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.