Подтвердить что ты не робот

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

Здесь мой код:

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... любые идеи?

Спасибо!

4b9b3361

Ответ 1

Попробуйте следующее:

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

Ответ 2

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

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

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

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

Ответ 3

Ну, 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

Ответ 4

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

Если вы находитесь на 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

Ответ 5

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

Ответ 6

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

или

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

Ответ 7

Есть две вещи, которые могут произойти:

  • Вы не добавляете READ_EXTERNAL_STORAGE разрешение на AndroidManifest.xml
  • Вы ориентируетесь на Android 23, и вы не запрашиваете это разрешение для пользователя. Спуститесь на Android 22 или попросите пользователя получить это разрешение.

Ответ 8

Попробуйте следующее:

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

}

}