17

Background

Android M presents a new way to handle selected text (link here), even from outside of your app . Text selection can be handled as such:

enter image description here

I know it's possible to handle the selected text from outside the app, because if I go to the web browser (or any other place that allows text selection), I can see that I can use the "API demos" app to handle the selected text.

The problem

I can't see a lot of information about how to do it.

The question

  1. What should be added in code (and manifest) to be able to handle the selected text from outside the app ?
  2. Is it possible to limit the selection to certain types of texts ? For example, offer to show the app only if the text type is a valid phone number ?
4

2 回答 2

16

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

M 开发者预览模拟器

单击它会从 API Demos 应用程序中调出一个活动,显示突出显示的文本:

另一个 M 开发者预览模拟器

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


警告:以下解释来自检查 API Demos 代码和 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) 具有以下内容<intent-filter>

        <intent-filter >
            <action android:name="android.intent.action.PROCESS_TEXT"/>
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>

该文档没有讨论 MIME 类型。我没有进行任何实验来确定是否需要 MIME 类型,以及我们可能会得到什么(text/html对于有跨度的东西?)。

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

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

于 2015-05-28T22:48:39.687 回答
0

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

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

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

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

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);
    }
}
于 2015-12-13T09:32:15.593 回答