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

Posted

技术标签:

【中文标题】如何使用从您的应用程序外部提供的“文本选择”的新 Android M 功能?【英文标题】:How to use the new Android M feature of "Text Selection" to be offered from outside of your app? 【发布时间】:2015-08-11 15:24:22 【问题描述】:

背景

android M 提供了一种处理选定文本的新方法(链接 here),即使是在您的应用之外。文本选择可以这样处理:

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

问题

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

问题

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

【问题讨论】:

您链接到的内容中没有任何内容描述“来自您的应用之外”。 @CommonsWare 这就是我问这个问题的原因,因为它不见了。正如我所写的,我知道这是可能的,因为我已经在模拟器上运行了它,选择了 API 演示之外的文本。它甚至出现在我自己的应用程序上。从上下文菜单中选择“API 演示”会打开“API 演示”应用程序,它会显示我选择的内容。 @androiddeveloper 链接不正确。你可能想用这个来更新它:developer.android.com/about/versions/marshmallow/… @Saket 他们可能有错字。无论如何,谢谢。 【参考方案1】:

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

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

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


警告:以下解释来自检查 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 Demos 活动 (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 对于有跨度的东西?)。

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

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

【讨论】:

我觉得这个问题很清楚。我写的信息丢失了,我注意到了这个功能,但找不到如何使用它,因为它不存在。为了以防万一,我重新编辑了它。关于答案,谢谢。现在将勾选它,因为我认为你是正确的。 我写了一个关于这个的建议:code.google.com/p/android/issues/detail?id=174972。希望其他人会喜欢这个。 Mime 类型是必需的,至少我从实验中学到的。它适用于文本/纯文本。没有尝试过其他的 mime 类型 问题:我注意到在 Android O 上我们可以指定文本的类型,但由于某种原因,到目前为止我已经成功地将电话号码用于拨号操作。你能看看吗:***.com/q/50423546/878126? 是否可以为上下文菜单上显示的操作分配一个图标?我注意到在某些应用程序上有一个图标,但大多数没有。【参考方案2】:

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

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

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

要查询包管理器,首先使用操作构建一个意图 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);
    

【讨论】:

hidro - 你知道onInitializeMenu是怎么触发的吗?

以上是关于如何使用从您的应用程序外部提供的“文本选择”的新 Android M 功能?的主要内容,如果未能解决你的问题,请参考以下文章

从您的应用程序向 Google Play 商店发送费率

如何直接从您的 Angular 项目中调用 Firebase Cloud Function

从您的应用程序发送一封带有 Swift 附件图像的电子邮件

Iphone:如何从您的应用程序在 google maps api 中启动路线

hp服务器换主板后如何识别阵列

使用 PHP 从您的主机空间的下载链接中保存 mp3 文件