Как вывести список файлов в каталоге Android?

121

Вот мой код:

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

Тем не менее, хотя у меня есть файлы в этом каталоге, он возвращает мне list.length = 0 ... какие-нибудь идеи?

Роджер Трэвис
источник

Ответы:

329

Чтобы получить доступ к файлам, разрешения должны быть указаны в файле манифеста.

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

Попробуй это:

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
Спасибо, Юрий, как ни странно file.length дает исключение NullPointerException ... есть идеи? Spasibo!
Роджер Трэвис
8
Думаю, что у вас в указанной папке нет файлов. Попробуйте проверить файл [] на нуль. Если он равен нулю, то у вас нет результатов, и file.length вызывает исключение.
Юрий
4
Оказывается, просто не хватало "/" :) Спасибо!
Роджер Трэвис
1
Работал как Шарм! Мой мобильный Moto G4, Android N . Если кто сталкивается can't play video error. Вам нужно перейти на свой мобильный телефон. settings --> apps --> your app --> permissions --> enable storage. Если вы столкнулись с этой ошибкой, сделайте это вручную. Убедитесь, что <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />в вашем манифесте. Для людей, которые сталкиваются NullPointerException- вы пытаетесь получить доступ к файлам во внутреннем хранилище приложения, которые являются частными, извините, что вы не можете этого сделать.
coderpc
есть ли что-то вроде fileList (). clear () ;? , так что я могу повторно использовать этот метод
user55924
44

Я только что обнаружил, что:

new File("/sdcard/").listFiles() возвращает null, если у вас нет:

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

установить в вашем файле AndroidManifest.xml.

Дэн Бро
источник
6
Я знаю, что это правда, но ... Это ответ? Или должен быть комментарий?
Хоакин Юрчук
7
Кроме того, на Android 6.0+ разрешение необходимо предоставить в Настройки-> Приложения-> Ваше приложение-> Разрешения.
вт.
1
Он также возвращает ноль, если Справочник пуст
Хитеш Саху,
11

Ну, AssetManagerсписки файлов вassets папке, которая находится внутри вашего файла APK. Итак, в приведенном выше примере вы пытаетесь указать [apk] / assets / sdcard / Pictures.

Если вы поместите несколько изображений в assetsпапку внутри вашего приложения, и они будут в Picturesкаталоге, вы сделаетеmgr.list("/Pictures/") .

С другой стороны, если у вас есть файлы на SD-карте, которые находятся за пределами вашего файла APK, в Picturesпапке, вы должны использовать Fileтак:

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

И соответствующие ссылки из документов:
File
Asset Manager

камыш
источник
Пробовал, что «File [] pictures = file.listFiles ();», но он также дает исключение NullPointException ... хм ...
Роджер Трэвис
1
Оказывается, просто не хватало "/" :) Спасибо!
Роджер Трэвис
1
Спасибо за спасение моего дня :)
Сайед Назар Мухаммад
@SyedNazarMuhammad Ha. И спасибо за спасение моего, друг мой. Всегда получайте удовольствие от положительных замечаний: D
Рид
11

В дополнение ко всем приведенным выше ответам:

Если вы используете Android 6.0+ (уровень API 23+), вы должны явно запросить разрешение на доступ к внешнему хранилищу. Просто имея

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

в вашем манифесте будет недостаточно. Вы также активно запрашивали разрешение в своей деятельности:

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

Я рекомендую прочитать это: http://developer.android.com/training/permissions/requesting.html#perm-request

Габриель
источник
2

Ваш pathне находится в папке с ресурсами. Вы либо перечисляете файлы в папке с активами с помощью, AssetManager.list()либо перечисляете файлы на SD-карте с помощьюFile.list()

Александр Куляхтин
источник
1
String[] listOfFiles = getActivity().getFilesDir().list();

или

String[] listOfFiles = Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS).list();
rdkit
источник
1

Попробуй это:

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

Могут произойти две вещи:

  • Вы не добавляете READ_EXTERNAL_STORAGEразрешение наAndroidManifest.xml
  • Вы ориентируетесь на Android 23 и не запрашиваете у пользователя это разрешение. Перейдите на Android 22 или спросите у пользователя разрешение.
Рок Боронат
источник
0

Попробуйте эти

 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

Если вы используете Android 10 / Q и сделали все правильно, чтобы запросить разрешения на доступ для чтения внешнего хранилища, но оно по-прежнему не работает, стоит прочитать этот ответ:

Android Q (10) запрашивает разрешение на доступ ко всему хранилищу. Ограниченное хранилище

У меня был рабочий код, но мое устройство взяло на себя обновление, когда оно было подключено к сети (обычно оно было без подключения). В Android 10 доступ к файлам больше не работал. Единственный простой способ исправить это, не переписывая код, - это добавить этот дополнительный атрибут в манифест, как описано. Доступ к файлам теперь снова работает как в Android 9. YMMV, вероятно, он не будет работать в будущих версиях.

Мэтт Эмсон
источник