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

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

Документация для 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, и результаты одинаковы, если телефон подключен к моему компьютеру или нет, поэтому я не думаю, что это связано с установкой при подключении.

4b9b3361

Ответ 1

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

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

Задача решена: D

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

Ответ 2

Для android версии 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));

}

Ответ 3

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

android:name="android.permission.READ_EXTERNAL_STORAGE" 

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

Настройки > Приложения > "Имя вашего приложения" > Разрешения > хранилище

Ответ 4

В документации к файлу "listFiles": Возвращает значение null, если это абстрактное имя пути не обозначает каталог или возникает ошибка ввода-вывода.

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

<application android:requestLegacyExternalStorage="true"

в вашем манифесте. Кажется, что некоторые последние apis нуждаются в этом.

В любом случае, zapl comment довольно короткий, но довольно проницательный. Вы можете "ls -ld" каталог на устройстве (через "adb shell" или некоторые другие оболочки). Если у вас есть разрешение "r" для каталога, вы можете вызвать listFiles(). В противном случае возвращается ноль. Обратите внимание, что вы можете получить доступ к файлам в нечитаемом каталоге, если вы знаете имена файлов и имеете разрешение "x" для каталога. Вы можете узнать, кто вы, с помощью команд whoami и groups.

Ответ 8

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

Ответ 9

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

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

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