[英]Supply default path for ACTION_OPEN_DOCUMENT
在我的应用程序中,我想为用户提供一种从应用程序的数据目录中选择文件的方法。 这是我的代码:
// 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
,但是文件选择器UI默认为共享存储根( /sdcard
)。
以下代码有效(根据文档要求使用API 26+,该意图可从该文档作为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
会导致出现各种类型的提供程序,例如Gallery和Music。 如果我将意图更改为ACTION_OPEN_DOCUMENT
,那么我提供的URI将被忽略。
我如何才能使文件选择器UI在您选择的目录中启动,而内容提供商的选择却很少?
编辑:在Anbox上进行测试,我才意识到这仅在API 25上进行-实际上,我需要一种可在24级以下的API上工作的方法。
可能没有一个普遍可行的解决方案,但是以下内容已在某些构建中起作用(尽管不适用于其他构建):
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary%3AAndroid%2Fdata%2Fmy.app%2Ffiles");
intent.setData(uri);
intent.setType("*/*");
intent.putExtra("android.provider.extra.INITIAL_URI", uri);
intent.putExtra("android.content.extra.SHOW_ADVANCED", true);
startActivityForResult(intent, 42);
uri
必须是com.android.externalstorage.documents
提供程序的content
URI。 URI路径为/document/primary%3A
,后跟要开始的文件夹的文件系统路径。该路径必须相对于共享存储根(即,在设备上删除开头的/sdcard/
或等效文件,并确保结果不以斜杠开头)并转义。
对Intent#setData()
的调用无助于设置默认位置(与某些第三方文件管理器不同),但可以防止显示不需要的存储提供程序(例如Gallery和Music)。
android.provider.extra.INITIAL_URI
额外设置了初始URI,但这可能在API 26之前不起作用(尽管它在某些Android版本上也有效)。
android.content.extra.SHOW_ADVANCED
额外导致设备存储可作为提供程序使用(否则,取决于Android的风格,它可能要求用户选择它或根本不使用它)。
同样,仍然不是一个完美的解决方案,但我设法获得了最接近的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.