Comment lister des fichiers dans un répertoire Android?

120

Voici mon code pour l'instant:

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

Pourtant, même si j'ai des fichiers dans ce répertoire, cela me renvoie list.length = 0 ... des idées?

Roger Travis
la source

Réponses:

329

Pour accéder aux fichiers, les autorisations doivent être données dans le fichier manifeste.

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

Essaye ça:

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
la source
7
Merci Yury, étrangement file.length donne une NullPointerException ... des idées? Spasibo!
Roger Travis
8
Je pense que vous n'avez pas de fichiers dans le dossier spécifié. Essayez de vérifier le fichier [] pour null. S'il est nul, vous n'avez aucun résultat et file.length provoque l'exception.
Yury
4
Apparemment, il manquait juste un "/" :) Merci!
Roger Travis
1
A travaillé comme Charm! Mon mobile est Moto G4, Android N . Si quelqu'un fait face can't play video error. Vous devez vous rendre sur votre mobile. Vous settings --> apps --> your app --> permissions --> enable storage. devez le faire manuellement si vous rencontrez cette erreur. Assurez-vous que vous avez <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />dans votre manifeste. Pour les personnes confrontées NullPointerException, vous essayez d'accéder aux fichiers du stockage interne de l'application qui sont privés, désolé, vous ne pouvez pas faire cela.
coderpc
y a-t-il quelque chose comme fileList (). clear () ;? , donc je peux réutiliser cette méthode
user55924
44

Je viens de découvrir que:

new File("/sdcard/").listFiles() renvoie null si vous n'avez pas:

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

défini dans votre fichier AndroidManifest.xml.

Dan Brough
la source
6
Je sais que c'est la vérité, mais ... Est-ce une réponse? Ou devrait être un commentaire?
Joaquin Iurchuk
7
De plus, sur Android 6.0+, l'autorisation doit être accordée dans Paramètres-> Applications-> Votre application-> Autorisations.
vt.
1
Il renvoie également null si le répertoire est vide
Hitesh Sahu
11

Eh bien, la AssetManagerliste des fichiers dans le assetsdossier qui se trouve à l'intérieur de votre fichier APK. Donc, ce que vous essayez de lister dans votre exemple ci-dessus est [apk] / assets / sdcard / Pictures.

Si vous mettez des images dans le assetsdossier à l'intérieur de votre application et qu'elles se trouvent dans le Picturesrépertoire, vous le feriez mgr.list("/Pictures/").

D'un autre côté, si vous avez des fichiers sur la carte SD qui sont en dehors de votre fichier APK, dans le Picturesdossier, alors vous utiliseriez Filecomme ceci:

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

Et des liens pertinents de la documentation:
File
Asset Manager

Roseau
la source
J'ai essayé que "File [] pictures = file.listFiles ();", mais cela donne aussi une NullPointException ... hmm ...
Roger Travis
1
Apparemment, il manquait juste un "/" :) Merci!
Roger Travis
1
Merci d'avoir sauvé ma journée :)
Syed Nazar Muhammad
@SyedNazarMuhammad Ha. Et merci d'avoir sauvé le mien, mon ami. Profitez toujours d'une remarque positive: D
Reed
11

En plus de toutes les réponses ci-dessus:

Si vous utilisez Android 6.0+ (niveau API 23+), vous devez explicitement demander l'autorisation d'accéder au stockage externe. Avoir simplement

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

dans votre manifeste ne suffira pas. Vous avez également activement demandé l'autorisation dans votre activité:

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

Je recommande de lire ceci: http://developer.android.com/training/permissions/requesting.html#perm-request

Gabriel
la source
2

Votre pathn'est pas dans le dossier des actifs. Soit vous énumérez les fichiers dans le dossier des ressources au moyen de, AssetManager.list()soit vous énumérez les fichiers sur votre carte SD au moyen deFile.list()

Alexandre Kulyakhtin
la source
1
String[] listOfFiles = getActivity().getFilesDir().list();

ou

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

Essaye ça:

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
la source
1

Il y a deux choses qui pourraient se produire:

  • Vous n'ajoutez pas de READ_EXTERNAL_STORAGEpermission à votreAndroidManifest.xml
  • Vous ciblez Android 23 et vous ne demandez pas cette autorisation à l'utilisateur. Descendez sur Android 22 ou demandez à l'utilisateur cette autorisation.
Roc Boronat
la source
0

Essayez ces

 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
la source
0

Si vous êtes sur Android 10 / Q et que vous avez fait toutes les bonnes choses pour demander des autorisations d'accès pour lire le stockage externe et que cela ne fonctionne toujours pas, il vaut la peine de lire cette réponse:

Android Q (10) demande la permission d'accéder à tout le stockage. Stockage étendu

J'avais un code de travail, mais mon appareil a pris sur lui de se mettre à jour lorsqu'il était sur une connexion réseau (il était généralement sans connexion.) Une fois dans Android 10, l'accès aux fichiers ne fonctionnait plus. Le seul moyen simple de le réparer sans réécrire le code était d'ajouter cet attribut supplémentaire au manifeste comme décrit. L'accès aux fichiers fonctionne à nouveau comme dans Android 9. YMMV, il ne continuera probablement pas à fonctionner dans les versions futures.

Matt Emson
la source