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

8 52

8 ответов:

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

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

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

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

для тех, кто с этой проблемой вы дать разрешение на чтение, добавьте это в AndroidManifest.XML-код:

android:name="android.permission.READ_EXTERNAL_STORAGE" 

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

Настройки > Приложения > "название" > разрешения > для хранения

для 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));

}

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

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

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

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

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

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

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

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

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

строка someString= "C:\path"; someString=someString.заменить("\"","");