it-roy-ru.com

Файл существует и IS каталог, но listFiles () возвращает ноль

Документация для File.listFiles() предполагает, что null будет возвращен ТОЛЬКО в том случае, если вызывающий его файл не является каталогом.

У меня есть следующее:

String dir = "/storage/emulated/0";
File f = new File(dir);
Log.v("Files",f.exists()+"");
Log.v("Files",f.isDirectory()+"");
Log.v("Files",f.listFiles()+"");

Журнал гласит:

true
true
null

По какой-то причине listFiles() возвращает null, хотя File распознается как действительный каталог. Я не очень знаком с поведением файловой иерархии Android, поэтому я думаю, что проблема заключается в этом.

Для справки, я отлаживаю на своем Moto X, и результаты одинаковы, независимо от того, подключен телефон к моему компьютеру или нет - поэтому я не думаю, что это связано с подключением при подключении.

55
Wilson

Для тех, кто с этой проблемой, добавьте это в AndroidManifest.xml: 

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

Проблема решена: D

Правка: Если это не работает, просто убедитесь, что путь правильный

77
BamsBamx

Для Android версии 23 или выше вам необходимо программно дать разрешение run time в методе onresume, как показано ниже, 

public final String[] EXTERNAL_PERMS = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE
};

public final int EXTERNAL_REQUEST = 138;

requestForPermission();

public boolean requestForPermission() {

    boolean isPermissionOn = true;
    final int version = Build.VERSION.SDK_INT;
    if (version >= 23) {
        if (!canAccessExternalSd()) {
            isPermissionOn = false;
            requestPermissions(EXTERNAL_PERMS, EXTERNAL_REQUEST);
        }
    }

    return isPermissionOn;
}

public boolean canAccessExternalSd() {
    return (hasPermission(Android.Manifest.permission.WRITE_EXTERNAL_STORAGE));
}

private boolean hasPermission(String perm) {
    return (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(this, perm));

}
14
varotariya vajsi

Если вы хотите разрешить чтение, добавьте его в AndroidManifest.xml:

Android:name="Android.permission.READ_EXTERNAL_STORAGE" 

и вы также должны дать разрешение от 

Настройки> Приложения> «Название вашего приложения» > Разрешения> Хранилище

10
Ravi Joshi

Из документации метода File 'listFiles': Возвращает нуль, если это абстрактное имя пути не обозначает каталог или если произошла ошибка ввода-вывода.

Возможно, произошла ошибка ввода-вывода. Проверьте разрешения для этого каталога, имеет ли пользователь, запускающий программу Java, разрешение на чтение этого каталога? Если нет, то есть ваш ответ. Если они делают, то, возможно, каталог пуст.

Кстати, вы не должны использовать + "" для преобразования чего-либо в строку, это плохая практика, так как она медленнее, чем String.valueOf. Я бы использовал Apache StringUtils для объединения этого массива в строку, но для этого нужно добавить этот jar-файл в ваш путь к классам.

7
msknapp

Просто добавьте разрешение в манифесте uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" , и ваша проблема будет решена.

2
kamal

Моя проблема заключалась в том, что по какой-то причине атрибут Android: sharedUserId = "Android.uid.system" не позволял приложению читать/sdcard/на определенном устройстве.

Поскольку мне нужно было сделать только быстрый тест, я удалил атрибут sharedUserId, протестировал и добавил его обратно.

1
thiagolr

В файле манифеста в разделе <uses-permission .... > добавьте эту строку Android:name="Android.permission.READ_EXTERNAL_STORAGE". Я думаю, что это может решить вашу проблему.

0
Rajan Menon

У меня была та же проблема в Java, но не в Android, где я читаю конфигурационный файл с путем в кавычках. Я решил свою проблему, просто удалив кавычки

Таким образом, вы можете сделать это с помощью функции замены строк или передать ее без кавычек 

String someString = "C:\path"; SomeString = someString.replace ("\" "," ");

0
Sam