Bagaimana cara membuat daftar file di direktori android?

120

Inilah kode saya sejauh ini:

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

Namun sementara saya memiliki file di direktori itu, itu mengembalikan saya list.length = 0 ... ada ide?

Roger Travis
sumber

Jawaban:

328

Untuk mengakses file, izin harus diberikan dalam file manifes.

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

Coba ini:

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
sumber
7
Terima kasih Yury, anehnya file.length memberikan NullPointerException ... ada ide? Spasibo!
Roger Travis
8
Saya pikir Anda tidak memiliki file di folder yang ditentukan. Coba periksa file [] untuk null. Jika null maka Anda tidak memiliki hasil apa pun dan file.length menyebabkan pengecualian.
Yury
4
Tampaknya itu hanya kehilangan "/" :) Terima kasih!
Roger Travis
1
Bekerja seperti Pesona! Ponsel saya adalah Moto G4, Android N . Jika ada yang menghadap can't play video error. Anda harus pergi ke ponsel Anda settings --> apps --> your app --> permissions --> enable storage. Harus melakukan ini secara manual jika Anda menghadapi kesalahan ini. Pastikan Anda memiliki <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />dalam manifest Anda. Untuk orang-orang yang menghadapi NullPointerException- Anda mencoba mengakses file di penyimpanan internal aplikasi yang bersifat pribadi, maaf Anda tidak dapat melakukan itu.
coderpc
apakah ada sesuatu seperti fileList (). clear () ;? , jadi saya dapat menggunakan kembali metode ini
user55924
44

Saya baru saja menemukan bahwa:

new File("/sdcard/").listFiles() mengembalikan nol jika Anda tidak memiliki:

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

setel di file AndroidManifest.xml Anda.

Dan Brough
sumber
6
Aku tahu ini kebenaran, tapi ... Apakah ini jawaban? Atau harus menjadi komentar?
Joaquin Iurchuk
7
Selain itu, di Android 6.0+, izin perlu diberikan di Pengaturan-> Aplikasi-> Aplikasi Anda-> Izin.
vt.
1
Ini juga mengembalikan null jika Direktori kosong
Hitesh Sahu
11

Nah, AssetManagerdaftar file di dalam assetsfolder yang ada di dalam file APK Anda. Jadi yang coba Anda cantumkan dalam contoh di atas adalah [apk] / assets / sdcard / Pictures.

Jika Anda meletakkan beberapa gambar di dalam assetsfolder di dalam aplikasi Anda, dan mereka ada di Picturesdirektori, Anda akan melakukannya mgr.list("/Pictures/").

Di sisi lain, jika Anda memiliki file di sdcard yang berada di luar file APK Anda, di dalam Picturesfolder, maka Anda akan menggunakan Filesebagai berikut:

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

Dan tautan yang relevan dari dokumen:
File
Asset Manager

Buluh
sumber
Mencoba "File [] pictures = file.listFiles ();", tetapi juga memberikan NullPointException ... hmm ...
Roger Travis
1
Tampaknya itu hanya kehilangan "/" :) Terima kasih!
Roger Travis
1
Terima kasih telah menyelamatkan hari saya :)
Syed Nazar Muhammad
@Syedaruhammad Ha. Dan terima kasih telah menyelamatkan milikku, temanku. Selalu nikmati ucapan positif: D
Reed
11

Selain semua jawaban di atas:

Jika Anda menggunakan Android 6.0+ (API Level 23+), Anda harus secara eksplisit meminta izin untuk mengakses penyimpanan eksternal. Cukup memiliki

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

dalam manifestasi Anda tidak akan cukup. Anda juga secara aktif meminta izin dalam aktivitas Anda:

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

Saya sarankan membaca ini: http://developer.android.com/training/permissions/requesting.html#perm-request

gabriel
sumber
2

Anda pathtidak berada dalam folder aset. Entah Anda menghitung file dalam folder aset dengan AssetManager.list()atau Anda menghitung file pada kartu SD Anda denganFile.list()

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

atau

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

Coba ini:

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

Ada dua hal yang mungkin terjadi:

  • Anda tidak menambahkan READ_EXTERNAL_STORAGEizin ke AndaAndroidManifest.xml
  • Anda menargetkan Android 23 dan Anda tidak meminta izin itu kepada pengguna. Buka Android 22 atau minta izin itu dari pengguna.
Roc Boronat
sumber
0

Coba ini

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

Jika Anda menggunakan Android 10 / Q dan Anda melakukan semua hal yang benar untuk meminta izin akses untuk membaca penyimpanan eksternal dan masih tidak berfungsi, ada baiknya membaca jawaban ini:

Android Q (10) meminta izin untuk mendapatkan akses semua penyimpanan. Penyimpanan tercakup

Saya memiliki kode yang berfungsi, tetapi perangkat saya mengambilnya sendiri untuk memperbarui ketika berada di koneksi jaringan (biasanya tanpa koneksi.) Setelah di Android 10, akses file tidak lagi berfungsi. Satu-satunya cara mudah untuk memperbaikinya tanpa menulis ulang kode adalah dengan menambahkan atribut ekstra tersebut ke manifes seperti yang dijelaskan. Akses file sekarang berfungsi seperti di Android 9 lagi. YMMV, ini mungkin tidak akan terus berfungsi di versi mendatang.

Matt Emson
sumber