如何为 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&lt;Uri&gt;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 返回多个文件?的主要内容,如果未能解决你的问题,请参考以下文章

Intent.ACTION_GET_CONTENT用法

如何为用户返回每月最大日期

如何为迭代器返回“null”值?

如何为返回列表的方法创建适当的单元测试?

如何为丢失的资源建模权限?

如何为 JQUERY 数据表返回 JSON 数据?