如何为 ACTION_GET_CONTENT 返回多个文件?
Posted
技术标签:
【中文标题】如何为 ACTION_GET_CONTENT 返回多个文件?【英文标题】:How to return several files for ACTION_GET_CONTENT? 【发布时间】:2021-12-03 04:06:04 【问题描述】:通过系统文件管理器后,我制作的文件管理器能够在通过 ACTION_GET_CONTENT 询问时(例如,通过 K9 电子邮件客户端)返回一个文件:
Uri uri = SearchOut.getUriFromFile(this, context.getPackageName(), file);
Intent intent = new Intent();
intent.setDataAndType(uri, getContentResolver().getType(uri));
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
setResult(Activity.RESULT_OK, intent);
K9正常获取文件。
我的文件管理器也可以共享多个文件:
ArrayList<Uri> urilist = ...
Intent shareIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, urilist);
shareIntent.setType("application/octet-stream");
context.startActivity(Intent.createChooser(shareIntent, "Sharing files..."));
然后我可以打开K9并加载所有文件。
那么,当通过 ACTION_GET_CONTENT 请求几个文件时,如何将它们返回给 K9?
正如我上面写的,我知道如何用 K9 发送多个文件,或者当 K9 询问时返回 1 个文件,但我不知道如何在 K9 询问时返回多个文件。系统文件管理器确实返回了几个文件,K9 愉快地加载了所有文件。
【问题讨论】:
but I don't know how to return several files when K9 asks.
“当 K9 询问时”发生了什么?你的意思是?这样的问题看起来如何?谁被问到?它与行动获取内容有什么关系?你的帖子很混乱。
所以你说 K9 使用 ACTION_GET_CONTENT 和 startActivityForResult 并且用户选择了你的应用程序并且用户选择了几个文件,现在你想将 uris 转移到 K9?将它们放在返回 uri 中,就像您在应用使用该操作时从 onActivityResult 中的意图中提取它们一样。
对不起,如果我不清楚。 “当 K9 询问时”是指当您按下附件按钮时请求的操作。根据 K9 开发人员的说法,这是一个标准的 ACTION_GET_CONTENT 意图。此意图在新版本的 android 中由系统处理,但我的系统文件管理器允许我通过在“使用另一个应用程序浏览文件”选项中选择它来使用我的文件管理器。如果我然后仅选择 1 个文件,则它适用于上述代码。但我不知道如何为多个文件构建意图,因为 intent.setDataAndType
不接受 URI 列表。
是的,getIntent().getAction()
返回android.intent.action.GET_CONTENT
。
@blackapps 抱歉,我不明白您在第二个回答中的建议。我尝试使用ArrayList<Uri>
、new Intent(Intent.ACTION_SEND_MULTIPLE)
和shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, urilist)
建立使用setResult(Activity.RESULT_OK, intent)
返回它的意图,但K9 没有加载文件。换句话说,我需要建立一个意图作为我写的第一个意图,但要针对多个文件而不是一个。
【参考方案1】:
我使用ClipData
解决了这个问题(需要 API >= 16)。但不确定这是否是构建 ClipData 的最佳方式:
ClipData clipData = null;
for (Uri u : getSelectedFilesToArrayOfUri())
if (clipData == null)
clipData = ClipData.newRawUri(null, u);
else
clipData.addItem(new ClipData.Item(u));
intent.setClipData(clipData);
intent.setType("application/octet-stream");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
setResult(Activity.RESULT_OK, intent);
【讨论】:
如果只有一个uri,你不应该使用clip data.z 是的,该块仅对超过 2 个 uris 和 API >= 16 执行。以上是关于如何为 ACTION_GET_CONTENT 返回多个文件?的主要内容,如果未能解决你的问题,请参考以下文章