Como listar arquivos em um diretório Android?

120

Aqui está o meu código até agora:

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

No entanto, embora eu tenha arquivos nesse diretório, ele me retorna list.length = 0 ... alguma idéia?

Roger Travis
fonte

Respostas:

328

Para acessar os arquivos, as permissões devem ser dadas no arquivo de manifesto.

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

Tente o seguinte:

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
fonte
7
Obrigado Yury, estranhamente file.length dá uma NullPointerException ... alguma idéia? Spasibo!
Roger Travis
8
Eu acho que você não tem arquivos na pasta especificada. Tente verificar o arquivo [] quanto a nulo. Se for nulo, você não terá nenhum resultado e file.length causará a exceção.
Yury
4
Parece que estava faltando um "/" :) Obrigado!
Roger Travis
1
Trabalhou como charme! Meu celular é Moto G4, Android N . Se alguém estiver enfrentando can't play video error. Você precisa ir para o seu celular. settings --> apps --> your app --> permissions --> enable storage. Deve fazer isso manualmente se estiver enfrentando esse erro. Verifique se você possui <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />seu manifesto. Para as pessoas que estão enfrentando NullPointerException- você está tentando acessar os arquivos no armazenamento interno do aplicativo, que são privados, desculpe-os por não poder fazer isso.
Coderpc 23/06
existe algo como fileList (). clear () ;? , para que eu possa reutilizar esse método
user55924 12/1218
44

Acabei de descobrir que:

new File("/sdcard/").listFiles() retorna nulo se você não tiver:

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

definido no seu arquivo AndroidManifest.xml.

Dan Brough
fonte
6
Eu sei que isso é verdade, mas ... Isso é uma resposta? Ou deveria ser um comentário?
Joaquin Iurchuk
7
Além disso, no Android 6.0+, a permissão precisa ser concedida em Configurações-> Aplicativos-> Seu aplicativo-> Permissões.
vt.
1
Ele também retornará nulo se o diretório estiver vazio
Hitesh Sahu
11

Bem, as AssetManagerlistas de arquivos dentro da assetspasta que estão dentro do seu arquivo APK. Então, o que você está tentando listar no seu exemplo acima é [apk] / assets / sdcard / Pictures.

Se você colocar algumas imagens dentro da assetspasta dentro do seu aplicativo e elas estiverem no Picturesdiretório, façamgr.list("/Pictures/") .

Por outro lado, se você tiver arquivos no sdcard que estão fora do seu arquivo APK, na Picturespasta, use Fileo seguinte:

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

E links relevantes dos documentos:
File
Asset Manager

Reed
fonte
Tentou que "arquivo [] fotos = file.listFiles ();", mas também dá um NullPointException ... hmm ...
Roger Travis
1
Parece que estava faltando um "/" :) Obrigado!
Roger Travis
1
Obrigado por salvar meu dia :)
Syed Muhammad Nazar
@SyedNazarMuhammad Ha. E obrigado por salvar a minha, meu amigo. Sempre aprecie uma observação positiva: D
Reed
11

Além de todas as respostas acima:

Se você estiver no Android 6.0+ (API Nível 23+), solicite explicitamente permissão para acessar o armazenamento externo. Simplesmente ter

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

no seu manifesto não será suficiente. Você também solicitou ativamente a permissão em sua atividade:

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

Eu recomendo a leitura: http://developer.android.com/training/permissions/requesting.html#perm-request

gabriel
fonte
2

Você pathnão está na pasta de ativos. Você enumera arquivos na pasta de ativos por meio de AssetManager.list()ou enumera arquivos no seu cartão SD por meio deFile.list()

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

ou

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

Tente o seguinte:

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
fonte
1

Há duas coisas que podem estar acontecendo:

  • Você não está adicionando READ_EXTERNAL_STORAGEpermissão ao seuAndroidManifest.xml
  • Você está direcionando o Android 23 e não está solicitando essa permissão ao usuário. Vá para o Android 22 ou solicite essa permissão ao usuário.
Roc Boronat
fonte
0

Tente esse

 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
fonte
0

Se você está no Android 10 / Q e fez todas as ações corretas para solicitar permissões de acesso para ler o armazenamento externo e ainda não funcionar, vale a pena ler esta resposta:

O Android Q (10) solicita permissão para acessar todo o armazenamento. Armazenamento com escopo

Eu tinha código de trabalho, mas meu dispositivo assumiu a responsabilidade de atualizar quando estava em uma conexão de rede (geralmente sem conexão). Uma vez no Android 10, o acesso ao arquivo não funcionava mais. A única maneira fácil de corrigi-lo sem reescrever o código foi adicionar esse atributo extra ao manifesto, conforme descrito. O acesso ao arquivo agora funciona como no Android 9 novamente. YMMV, provavelmente não continuará funcionando em versões futuras.

Matt Emson
fonte