В File.listFiles() метод
Возвращает NULL, если этот абстрактный путь не обозначает каталог, или если происходит ошибка ввода/вывода.
Скорее всего file
обозначает каталог. Возможно, он просто еще не существует или разрешение отклонено, что приводит к ошибке ввода-вывода.
18E2-1B1D
- это всего лишь идентификатор карты SD, поэтому вам не стоит беспокоиться об этом. В конце эмулятор и устройства должны работать одинаково, если вы используете только API высокого уровня.
Но на уровне 23-го уровня Android изменилась модель разрешения. Теперь вам нужно request permissions во время выполнения. Вызов
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
должен вернуть PackageManager.PERMISSION_GRANTED
. Если нет, то вам необходимо позвонить
requestPermissions(new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, id);
и обрабатывать результат асинхронно в onRequestPermissionsResult (int, String[], int[]).
Разрешение должно быть определено в манифесте. Если вы хотите использовать WRITE_EXTERNAL_STORAGE
, просто измените его и в коде.
Environment.getExternalStorageDirectory(). IsDirectory() является истинным, поэтому он является фактическим каталогом? Что вы подразумеваете под словом «он еще не существует»? –
Что такое 'Environment.getExternalStorageDirectory(). Exists()' return? – tynn
Спасибо tynn, но проблема была в уровне API. Кажется, уровень 23 api еще не стабилен. Я перешел к api 19, и тот же код работал, как ожидалось. –