Файл существует и каталог 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, и результатами является то же, включается ли телефон к моему компьютеру или не - таким образом, я не думаю, что это имеет отношение к монтированию при включении.

62
задан 21 December 2013 в 04:29

8 ответов

Для тех, которые имеют эту проблему, добавьте это к AndroidManifest.xml:

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

решенная проблема :D

РЕДАКТИРОВАНИЕ: Если это не работает, просто удостоверяются, ли путь корректен

86
ответ дан 31 October 2019 в 13:45

Для версии 23 андроида или выше , необходимо дать разрешение времени выполнения программно в 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));

}
21
ответ дан 31 October 2019 в 13:45

Для тех, которые имеют эту проблему Вы для предоставления разрешения чтения, добавьте это к AndroidManifest.xml:

android:name="android.permission.READ_EXTERNAL_STORAGE" 

и необходимо также дать разрешение от

Настройки> Приложения> "Название приложения" > Полномочия> устройство хранения данных

12
ответ дан 31 October 2019 в 13:45

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

0
ответ дан 31 October 2019 в 13:45

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

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

Строка someString = "C:\path"; someString=someString.replace (" \"","");

0
ответ дан 31 October 2019 в 13:45

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

3
ответ дан 31 October 2019 в 13:45

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

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

1
ответ дан 31 October 2019 в 13:45

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

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

BTW Вы не должны использовать +"" для преобразования чего-то в строку, это - плохая практика, так как это медленнее, чем String.valueOf. Я использовал бы StringUtils апача для присоединения к тому массиву в строку, но это требует добавления что банка к пути к классу.

8
ответ дан 31 October 2019 в 13:45

Другие вопросы по тегам:

Похожие вопросы: