Документация для 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, и результатами является то же, включается ли телефон к моему компьютеру или не - таким образом, я не думаю, что это имеет отношение к монтированию при включении.
Для тех, которые имеют эту проблему, добавьте это к AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
решенная проблема :D
РЕДАКТИРОВАНИЕ: Если это не работает, просто удостоверяются, ли путь корректен
Для версии 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));
}
Для тех, которые имеют эту проблему Вы для предоставления разрешения чтения, добавьте это к AndroidManifest.xml:
android:name="android.permission.READ_EXTERNAL_STORAGE"
и необходимо также дать разрешение от
Настройки> Приложения> "Название приложения" > Полномочия> устройство хранения данных
В файле манифеста в эти <uses-permission .... >
раздел, добавьте эту строку android:name="android.permission.READ_EXTERNAL_STORAGE"
. Я думаю, что это может решить Вашу проблему.
У меня была та же проблема в Java, но не в андроиде, где я читаю файл конфигурации с путем в кавычках. Я решил свою проблему только с удалением кавычек
, Таким образом, можно сделать это Строковой заменой, функционируют или дают его без кавычек
Строка someString = "C:\path"; someString=someString.replace (" \"","");
Просто добавьте разрешение в декларации uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
, и Ваша проблема будет разрешена.
Моя проблема состояла в том, что по некоторым причинам android:sharedUserId = "android.uid.system" атрибут не позволял приложению читать/sdcard/на определенном устройстве.
, Поскольку я должен был сделать только быстрый тест, я удалил атрибут sharedUserId, протестированный, и добавил его назад.
Из Файла 'listFiles' документация метода: пустой указатель Возвратов, если этот абстрактный путь не обозначает каталог, или если ошибка ввода-вывода происходит.
Поэтому, возможно, ошибка ввода-вывода произошла. Проверьте полномочия на том каталоге, пользователь, запускающий программу Java, имеют разрешение прочитать тот каталог? В противном случае существует Ваш ответ. Если они делают, то, возможно, каталог пуст.
BTW Вы не должны использовать +"" для преобразования чего-то в строку, это - плохая практика, так как это медленнее, чем String.valueOf. Я использовал бы StringUtils апача для присоединения к тому массиву в строку, но это требует добавления что банка к пути к классу.