Java / Android - не удается получить доступ к файлам на SD-карте - PullRequest
0 голосов
/ 12 сентября 2018

Я разрабатываю приложение для Android для Android 8.0 , где мне нужно открывать / читать и удалять файлы с внешнего накопителя / SD-карты.

Моя проблема в том, что File file[] = directory.listFiles() возвращает NULL, но в каталоге есть файл.

Вот представление отладчика из моего приложения:

Debugging App

Как видите, я получаю путь к файлу в виде URI через запрос Intent (переменная resource). В настоящее время на SD-карте выбрана папка Test.

Затем я хочу получить все файлы в этом каталоге, но функция listFiles() всегда возвращает NULL! Но в папке 1 изображение:

Actual content of the folder

Интересно, что этот код работает на Android 4.4, 5.0, 6.0 и 7.0, но не на Android 8!

Разрешения устанавливаются в Manifest.xml и запрашиваются / проверяются при каждом запуске:

Requested Permissions

Примечание: Android показывает только 1 запрос на разрешение при запуске приложения, но не должен ли он запрашивать 2 разрешения?

Надеюсь, кто-то из вас поможет мне решить проблему.

С уважением, Michael

1 Ответ

0 голосов
/ 12 сентября 2018

Решение:

Попробуйте использовать:

DocumentFile directory = DocumentFile.fromTreeUri(context, Uri.parse(resources.getUri()));

Вместо:

File directory = new File(resources.getPath());

См. Также

ContextCompat.getExternalFilesDirs решает ошибка доступа

Универсальная истина:

1.Android 7.0 предоставляет упрощенный API для доступа к директориям внешнего хранилища.

Доступ к каталогу по областям В Android 7.0 приложения могут использовать новые API для запроса доступа к конкретному внешнему хранилищу *Каталоги 1029 *, включая каталоги на съемных носителях, таких как SD-карты ...

Подробнее см. В обучении Доступ к Scoped Directory Access .


2.Изменения в Android O.

Начиная с Android O , Storage Access Framework позволяет провайдерам пользовательских документов создавать доступные файловые дескрипторы для файлов, находящихся в удаленных данных.источник ...

Разрешения , до Android O , если приложение запрашивало разрешение во время выполнения, и разрешение было предоставлено, система также неправильно предоставила приложениеостальные разрешения, принадлежавшие к той же группе разрешений и зарегистрированные в манифесте.

В приложениях, ориентированных на Android O , это поведение было исправлено.Приложению предоставляются только те разрешения, которые оно явно запросило.Однако, как только пользователь предоставляет разрешение приложению, все последующие запросы на разрешения в этой группе разрешений автоматически предоставляются.

Например, READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE ...

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...