Как получить больший контроль над Android SAF UI (например, ACTION_OPEN_DOCUMENT)? - PullRequest
0 голосов
/ 18 января 2019

Я бы хотел, чтобы SAF «запустил навигатор в указанном документе, если это папка» (как его называют в документах).

Это не работает, поэтому мне также интересно, могу ли я добавить ярлыки хранилища в пользовательский интерфейс SAF. Смотрите картинку по этой ссылке: https://i.imgur.com/yGtcGMM.jpg

Но я думаю, что более возможно запустить пользовательский интерфейс SAF в определенной папке, поэтому я мог бы пойти на такой подход на данный момент. Я пробовал это в onCreate(...) -метод:

String pathAsString = Environment.getExternalStorageDirectory() + "/myscientificapp/measurements/";
File pathAsFile = new File(pathAsString);

if (pathAsFile.exists()) { Log.d(TAG, "pathAsFile exists!"); } //This is printed in Logcat

android.net.Uri pathAsUri = Uri.fromFile(pathAsFile);
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pathAsUri); //Does not make effect
startActivityForResult(intent, REQUEST_OPEN_DOCUMENT);

Дело в том, что это не работает .. или я не знаю, как это сделать. : /

Я немного читал об этих местах. Например, на Medium.com разработчик говорит:

При выборе местоположения для сохранения файла с помощью ACTION_CREATE_DOCUMENT или при открытии документа новый EXTRA_INITIAL_URI позволяет переопределить исходное местоположение по умолчанию (последнее местоположение, выбранное пользователем) с вашим собственным пользовательским начальным местоположением.

А на Android-документах мы можем прочитать об этом EXTRA_INITIAL_URI :

Абоненты могут установить URI документа через DocumentsContract # EXTRA_INITIAL_URI, чтобы указать начальное местоположение навигатора документов. Система приложит все усилия, чтобы запустить навигатор в указанном документе, если это папка, или папка, которая содержит указанный документ, если нет.

Мы также можем прочитать об этом в DocumentsContract # EXTRA_INITIAL_URI :

EXTRA_INITIAL_URI

...
Устанавливает желаемое начальное местоположение, видимое пользователю, когда отображается средство выбора файлов.
...
Местоположение должно указывать URI документа или URI дерева с идентификатором документа. Если этот URI идентифицирует не-каталог, навигатор документа попытается использовать родительский документ в качестве исходного местоположения.

Исходное местоположение зависит от системы, если этот дополнительный элемент отсутствует или не удалось найти навигатор документа желаемое начальное местоположение.

Языки высокой абстракции во всей своей красе, но я хотел бы хотя бы получить некоторые подробности о том, как использовать эту функцию.

Но здесь, в Stackoverflow, некоторые разработчики говорят нам, что не будет работать .

И некоторые темы пока не получили ответа .

Так что по некоторым источникам это должно работать.

Кто-то, кто знает, как создавать ярлыки в пользовательском интерфейсе SAF (см. Рисунок)? Или как заставить SAF «запускать навигатор в указанном документе, если это папка», например, с ACTION_CREATE_DOCUMENT? (Если я правильно помню, эти функции существовали в Windows 95, например:>)

EDIT: Я удалил некоторые ссылки на git-проект из-за возможного «гниения ссылок», о котором намекнул @A Jar of Clay.

Я также попытался передать дерево Uri (как рекомендовано @CommonsWare) из ACTION_OPEN_DOCUMENT_TREE в метод intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pathAsTreeUri);. Но SAF не начался в месте, которое я прошел как Ури. (

1 Ответ

0 голосов
/ 24 января 2019

Этот ответ от Алекса Бейкера сработал для меня, и я смотрю на меня так, как будто он может сработать и для вас.

DocumentFile file = DocumentFile.fromTreeUri(context, uri);
intent.putExtra(EXTRA_INITIAL_URI, file.getUri());

resultData.getData (), который вы получаете от ACTION_OPEN_DOCUMENT_TREE, - это URI, с которого вы начинаете в fromTreeUri ().

Похоже на "Расположение должно указывать URI документа или дерево URI с идентификатором документа." «с идентификатором документа» представляется существенным. Я мог бы использовать resultData.getData () из ACTION_OPEN_DOCUMENT напрямую, и это сработало. Использование resultData.getData с ACTION_OPEN_DOCUMENT_TREE напрямую не работало, но работало после указанной процедуры.

Во всяком случае, у меня сработало, надеюсь, оно у вас тоже работает.

...