如何通过多个动作达成一个意图

2024-02-06

我想显示一个活动选择器,其中显示所有可以查看的应用程序and/or编辑一些数据。有没有一种简单的方法可以做到这一点,或者我是否必须实现自己的活动选择器对话框?或者也许我可以直接子类化Intent?谢谢。


我通过使用 EXTRA_INITIAL_INTENTS 找到了部分解决方案:

Intent viewIntent = new Intent(Intent.ACTION_VIEW);
Intent editIntent = new Intent(Intent.ACTION_EDIT);
viewIntent.setDataAndType(uri, type);
editIntent.setDataAndType(uri, type);
Intent chooserIntent = Intent.createChooser(editIntent, "Open in...");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { viewIntent });
startActivity(chooserIntent);

我说部分是因为如果一个应用程序同时支持 ACTION_VIEW 和 ACTION_EDIT ,它将在列表中显示两次,其中一个将打开文件进行查看,另一个用于编辑,并且您不一定知道哪个是哪个。我认为完整的解决方案需要一个自定义应用程序选择器,正如蒂姆建议的那样。

编辑(完整的解决方案!):

我找到了一个不涉及编写自定义应用程序选择器的解决方案。为了区分 ACTION_EDIT 应用程序和 ACTION_VIEW 应用程序,我找到了一种方法,通过使用 Tim 提供的代码行,将“(用于编辑)”字符串附加到其中一个应用程序的标签(在我的例子中为 ACTION_EDIT)。此外,为了确保附加字符串不会出现为应用程序名称的一部分,我将其颜色更改为青色:

PackageManager pm = kyoPrint.getPackageManager();
Intent viewIntent = new Intent(Intent.ACTION_VIEW);
Intent editIntent = new Intent(Intent.ACTION_EDIT);
viewIntent.setDataAndType(uri, type);
editIntent.setDataAndType(uri, type);
Intent openInChooser = Intent.createChooser(viewIntent, "Open in...");

// Append " (for editing)" to applicable apps, otherwise they will show up twice identically
Spannable forEditing = new SpannableString(" (for editing)");
forEditing.setSpan(new ForegroundColorSpan(Color.CYAN), 0, forEditing.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
List<ResolveInfo> resInfo = pm.queryIntentActivities(editIntent, 0);
Intent[] extraIntents = new Intent[resInfo.size()];
for (int i = 0; i < resInfo.size(); i++) {
    // Extract the label, append it, and repackage it in a LabeledIntent
    ResolveInfo ri = resInfo.get(i);
    String packageName = ri.activityInfo.packageName;
    Intent intent = new Intent();
    intent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
    intent.setAction(Intent.ACTION_EDIT);
    intent.setDataAndType(uri, type);
    CharSequence label = TextUtils.concat(ri.loadLabel(pm), forEditing);
    extraIntents[i] = new LabeledIntent(intent, packageName, label, ri.icon);
}

openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
startActivity(openInChooser);

编辑2:错误

如果第一个意图没有找到任何活动,则不会显示任何活动,包括第二个意图找到的任何活动。我最终编写了自己的选择器。我只是填充了 ExpandableListView,其中包含每种意图类型的标题及其各自作为子项的活动(存储为单独的 LabeledIntents)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过多个动作达成一个意图 的相关文章

随机推荐

  • 长赋值和双赋值不是原子的 - 这有什么关系?

    我们知道 long 和 double 赋值在 Java 中不是原子的 除非它们被声明为 volatile 我的问题是它在我们的编程实践中到底有多重要 例如 如果您看到下面的类 其对象在多个线程之间共享 The below class is
  • Facebook向多个朋友“发送”对话

    这个想法是 用户可以请求几个朋友对他们所做的事情提供反馈 我有一个朋友选择器 效果很好 从这里我得到用户 ID 然后我调用发送对话框 结果有多个收件人 而只有一个 有谁知道为什么 FB ui method send name Test to
  • Blazor WebAssembly:同一组件渲染上的多个路由

    我实际上正在试验 Blazor WebAssembly 除了一件事之外 一切都很好 我的想法是我想共享相同的组件来创建或编辑项目 组件的名称是 CreateOrEdit razor 我有两条路线 page master maker crea
  • 单击注销按钮后终止会话并重定向到登录页面

    我在JSP中有以下代码
  • Sass 加载器和 webpack 4

    如何在 webpack 4 中使用 sass 加载器 我读了很多关于这方面的内容 大多数网站建议使用 ExtractTextPlugin 但 ExtractTextPlugin 不适用于 webpack 4 我写了以下内容webpack c
  • 将 IplImage IPL_DEPTH_32S 转换为 QImage Format_RGB32 的最快方法

    将 IplImage IPL DEPTH 32S 转换为 QImage Format RGB32 最快的方法是什么 我需要从摄像头捕捉图片并将其显示在表格上 频率为每秒 30 帧 我尝试使用 QImage 构造函数 QImage qImag
  • jquery触发事件

    我们如何在活动对象上调用触发单击事件 continue live keypress function if e which 32 e which 13 this trigger click 当我按按钮上的 Enter 时 它会进入 if 块
  • Xcode 4.5 + UIScrollView:看不到支柱和弹簧(OSX 10.8 Mountain Lion)

    免责声明 iOS 开发全新 对我轻松一些 在 Xcode 4 5 中遇到了一个有趣的情况 我的尺寸检查器看起来像这样 和我根本看不到支柱和弹簧区域 真正奇怪的部分是 当我点击连接检查器之类的东西时 我确实看到了支柱和弹簧区域 但只看到了一瞬
  • 如何在不同存储库中的多个解决方案之间共享源代码库?

    我有一个公共库 我想在几个解决方案之间共享 该库存储在不同的 github 存储库中 我们将共享库放在单独的 GitHub 存储库中并创建了 nuget 包 可以将其安装在每个所需的项目 解决方案中 缺点是更改库中的代码涉及几个步骤 更改代
  • HTML5 Web 存储抽象库

    根据我对 HTML5 中 Web 存储的了解 有许多不同的存储选项 不同浏览器的支持也不同 是否有任何流行的库用于在 HTML5 应用程序中抽象 Web 存储 有几个基于 YUI 的库用于抽象底层存储 YUI 2 存储实用程序 http d
  • 以编程方式获取 ec2 定价?

    有没有办法以编程方式获取 AWS 定价 每种实例类型的每小时成本 S3 上每月每 GB 存储的成本等 另外 有成本监控工具吗 例如 是否有一种工具可以按小时报告您的 EC2 实例使用情况 而不是每月 亚马逊就是这么做的 提前致谢 UPDAT
  • 在 WebRequest 中强制进行基本身份验证

    我正在集成将使用的网络服务 HTTP POST 用于请求和检索数据 远程服务器 需要根据 RFC 2617 进行基本身份验证 我的身份验证尝试失败了 它失败的原因是 即使我将 NetworkCredential 对象附加到 HttpWebR
  • Angular 6 ng build --prod 错误“错误错误:ngIfElse 必须是 TemplateRef,但收到‘true’。”

    ERROR 错误 ngIfElse 必须是 TemplateRef 但收到 true HTML 文件
  • 每行显示 3 个项目 - while 循环 - php/mysql [重复]

    这个问题在这里已经有答案了 我目前正在开发一个循环来显示 mysql 表中的项目 有没有一种简单的方法可以每行显示 3 个项目 到目前为止 我设法在 html 表格内的一行中显示所有项目 我将不胜感激任何帮助 代码 不带 html 表标签
  • 自动刷新网页

    我有一个网页 允许用户执行各种操作 进而修改数据库 此外 此 Web 应用程序需要跟踪数据库中随时间不断变化的各个字段 每隔几秒刷新一次页面是实现此目的的最佳方法吗 例如 如果页面上有一个很长的列表需要滚动 则由于刷新导致页面不断重置 因此
  • Android:如何录制视频并实时处理其帧?

    我有一个 SurfaceView 和一个 MediaRecorder 我用它来显示和录制视频 现在我想实时访问该视频上的各个帧以对其进行一些处理 我可以通过 MediaRecorder 对象访问帧吗 或者我必须添加一个监听器 None
  • 蛋白质序列编码

    我正在开发一个Python程序来计算一组字符串 蛋白质序列 的突变残基和位置的数字编码 存储在fasta格式文件中 每个蛋白质序列用逗号分隔 我正在尝试找到突变的位置和序列 我的fasta文件如下 MTAQDDSYSDGKGDYNTIYLG
  • Guzzle send() 方法导致 cURL 错误 35 Too much open files

    尝试使用 Guzzle 5 执行以下代码 client new GuzzleClient defaults headers User Agent gt static userAgentString request client gt cre
  • 如何将 ngOptions 与包含 HTML 实体的字符串一起使用?

    我正在使用 ng Options 构建选择菜单 但我的标签之一中有一个 HTML 实体 amp 标签显示为Books amp Stuff not Books Stuff 我的玉石是这样的 select ng show isType sele
  • 如何通过多个动作达成一个意图

    我想显示一个活动选择器 其中显示所有可以查看的应用程序and or编辑一些数据 有没有一种简单的方法可以做到这一点 或者我是否必须实现自己的活动选择器对话框 或者也许我可以直接子类化Intent 谢谢 我通过使用 EXTRA INITIAL