2015-10-01 2 views
1

Я пытаюсь перечислить все файлы в папке Downloads эмулятора с картой SDCard. Теперь, когда я делаю этоAndroid api level 23, как читать файлы на эмуляторе?

File file = Environment.getExternalStorageDirectory(); 

значение file является "/ хранение/18E2-1B1D/Скачать"

если я file.listFiles() возвращается null.

Я не понимаю, что это значит, 18E2-1B1D? Должен ли я писать отдельный код для эмулятора и устройств? Я установил все возможные разрешения, но он не работает. Также я проверил все потоки stackoverflow.

ответ

1

В 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, просто измените его и в коде.

+0

Environment.getExternalStorageDirectory(). IsDirectory() является истинным, поэтому он является фактическим каталогом? Что вы подразумеваете под словом «он еще не существует»? –

+0

Что такое 'Environment.getExternalStorageDirectory(). Exists()' return? – tynn

+0

Спасибо tynn, но проблема была в уровне API. Кажется, уровень 23 api еще не стабилен. Я перешел к api 19, и тот же код работал, как ожидалось. –

Смежные вопросы