В моем приложении я хочу дать пользователям возможность выбрать файл из каталога данных приложения. Это мой код:
// use ACTION_OPEN_DOCUMENT because ACTION_GET_CONTENT will give us
// gallery and other stuff we don’t need
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
Uri uri = Uri.parse(getExternalFilesDir(null).getAbsolutePath());
Log.d(TAG, "Browsing " + uri.toString());
intent.setDataAndType(uri, "*/*");
// show the entire internal storage tree
intent.putExtra("android.content.extra.SHOW_ADVANCED", true);
startActivityForResult(intent, 42);
Logcat показывает мне, что я устанавливаю URI file:///sdcard/Android/data/my.app/files
, но пользовательский интерфейс средства выбора файлов по умолчанию имеет корень общего хранилища (/sdcard
).
Следующий код работает (требуется API 26+ в соответствии с документацией, намерение доступно из API как DocumentsContract.EXTRA_INITIAL_URI
):
// works only with this intent, at the expense of gallery etc. appearing
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
// apparently we need a valid content URI
Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary%3AAndroid%2Fdata%2Fmy.app%2Ffiles");
intent.putExtra("android.provider.extra.INITIAL_URI", uri);
Log.d(TAG, "Browsing " + uri.toString());
intent.setType("*/*");
// show the entire internal storage tree
intent.putExtra("android.content.extra.SHOW_ADVANCED", true);
startActivityForResult(intent, 42);
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri);
Однако, ACTION_GET_CONTENT
вызывает появление всевозможных провайдеров, таких как «Галерея» и «Музыка», когда все, что мне нужно, это локальная файловая система (а на самом деле только частное поддерево приложения). Если я изменю намерение на ACTION_OPEN_DOCUMENT
, предоставленный мною URI игнорируется.
Как заставить пользовательский интерфейс средства выбора файлов запускаться в каталоге по моему выбору, с минимальным выбором поставщиков контента?
Редактировать: Тестирование этого на Anbox, которое я только что понял, только на API 25 - на самом деле мне нужен способ, который работает на API, начиная с 24.