Фон
В Android 4.4 (KitKat), Google сделал доступ к SD-карте довольно ограниченным.
Начиная с Android Lollipop (5.0), разработчики могут использовать новый API, который просит пользователя подтвердить доступ к определенным папкам, как написано на это сообщение Google-Groups.
Проблема
Сообщение направляет вас посетить два веб-сайта:
Это выглядит как внутренний пример (возможно, позже будет показан в демонстрациях API), но довольно сложно понять, что происходит.
Это официальная документация по новому API, но в нем недостаточно информации о том, как ее использовать.
Вот что он вам говорит:
Если вам действительно нужен полный доступ ко всему поддереву документов, начните с запуска ACTION_OPEN_DOCUMENT_TREE, чтобы пользователь мог выбрать каталог. Затем передайте полученный getData() в fromTreeUri (Context, Uri), чтобы начать работу с выбранным пользователем деревом.
При навигации по дереву экземпляров DocumentFile вы всегда можете использовать getUri(), чтобы получить Uri, представляющий базовый документ для этот объект для использования с openInputStream (Uri) и т.д.
Чтобы упростить код на устройствах, работающих под управлением KITKAT или ранее, вы можете используйте fromFile (Файл), который эмулирует поведение DocumentProvider.
Вопросы
У меня есть несколько вопросов о новом API:
- Как вы его используете?
- Согласно сообщению, ОС будет помнить, что приложению было предоставлено разрешение на доступ к файлам/папкам. Как вы проверяете, можете ли вы получить доступ к файлам/папкам? Есть ли функция, которая возвращает мне список файлов/папок, к которым я могу получить доступ?
- Как вы справляетесь с этой проблемой в Kitkat? Является ли это частью библиотеки поддержки?
- Есть ли экран настроек в ОС, который показывает, какие приложения имеют доступ к файлам/папкам?
- Что произойдет, если приложение установлено для нескольких пользователей на одном устройстве?
- Есть ли другая документация/учебник об этом новом API?
- Можно ли отозвать разрешения? Если да, то есть ли намерение отправляться в приложение?
- Будет ли запрос разрешать работу рекурсивно в выбранной папке?
- Будет ли использование разрешения также давать пользователю возможность множественного выбора по выбору пользователя? Или приложение должно конкретно указывать, какие файлы/папки разрешить?
- Есть ли способ эмулятора попробовать новый API? Я имею в виду, что у него есть раздел SD-карты, но он работает как основное внешнее хранилище, поэтому весь доступ к нему уже предоставлен (с использованием простого разрешения).
- Что происходит, когда пользователь заменяет SD-карту другим?