如何使用从您的应用程序外部提供的“文本选择”的新Android Mfunction?

背景

Android M提供了一种处理所选文本的新方法( 此处链接),甚至可以从应用程序外部进行处理。 文本选择可以这样处理:

在此处输入图像描述

我知道可以从应用程序外部处理所选文本,因为如果我转到Web浏览器(或允许文本选择的任何其他地方),我可以看到我可以使用“API演示”应用程序来处理所选文本。

问题

我看不到很多关于如何做的信息。

这个问题

  1. 应该在代码(和清单)中添加什么才能从应用程序外部处理选定的文本?
  2. 是否可以将选择限制在某些types的文本中? 例如,仅当文本types是有效的电话号码时才提供显示应用程序?

首先,澄清问题:在M模拟器上,如果突出显示文本,您将看到新的浮动操作模式。 如果单击溢出图标,您将看到“API DEMOS”显示:

M开发人员预览模拟器

单击它会显示API演示应用程序中的活动,显示突出显示的文本:

另一个M开发人员预览模拟器

替换字段中的值并单击按钮可将替换文本替换为突出显示的内容。


警告 :以下说明来自检查API演示代码和M Developer Preview文档。 在M为realz发货之前,这种情况很可能会发生变化。 YMMV,除非您使用公制系统,在这种情况下YKMV。

有问题的活动,即接收文本,支持ACTION_PROCESS_TEXT作为Intent操作。 EXTRA_PROCESS_TEXT将保留一些文本,如果文本是只读的, EXTRA_PROCESS_TEXT_READONLY将保留它。 该活动将通过startActivityForResult()调用。 结果Intent可以有自己的EXTRA_PROCESS_TEXT值,它将是替换文本。

那么,针对具体问题:

应该在代码(和清单)中添加什么才能从应用程序外部处理选定的文本?

往上看。 请注意,API演示活动( ProcessText )具有此

       

该文档不讨论MIMEtypes。 我没有运行任何实验来确定是否需要MIMEtypes,以及我们可能获得的其他内容( text/html是否有跨度的东西?)。

是否可以将选择限制在某些types的文本中? 例如,仅当文本types是有效的电话号码时才提供显示应用程序?

鉴于文件,这似乎是不可能的。 话虽如此,这当然是一个合理的想法(例如,通过清单中的元数据来宣传正则expression式或多个正则expression式,文本必须匹配)。

Android开发者博客上的这篇文章可能是相关的,它描述了如何将Google Translate选项添加到溢出文本选择菜单中。

使用Android文本选择行为的Android应用已启用此function,因此无需执行额外步骤。 为其应用创建自定义文本选择行为的开发人员可以通过以下步骤轻松实现此function:

通过PackageManager扫描具有PROCESS_TEXT意图filter的所有包(例如: com.google.android.apps.translate – 如果已安装),并将它们作为MenuItems添加到应用程序的TextView选项中

要查询包管理器,首先使用操作Intent.ACTION_PROCESS_TEXT构建一个intent,然后检索支持的活动并为每个检索到的活动添加一个项目并附加一个intent以启动该操作

 public void onInitializeMenu(Menu menu) { // Start with a menu Item order value that is high enough // so that your "PROCESS_TEXT" menu items appear after the // standard selection menu items like Cut, Copy, Paste. int menuItemOrder = 100; for (ResolveInfo resolveInfo : getSupportedActivities()) { menu.add(Menu.NONE, Menu.NONE, menuItemOrder++, getLabel(resolveInfo)) .setIntent(createProcessTextIntentForResolveInfo(resolveInfo)) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } }