繁体   English   中英

提供ACTION_OPEN_DOCUMENT的默认路径

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM