快速提示:如何使用Android的Assist API

如今,Android用户不再需要打开浏览器并执行搜索来了解他们在使用应用程序时偶然发现的事情。 他们可以改用助手。 如果您拥有运行Android 6.0或更高版本的设备,则可能已经熟悉其默认助手,该助手最初称为Google Now on Tap。 最近,它的名称已更改为screen search

助手,尽管上下文相关,但通常不是很准确。 为了提高准确性,应用程序开发人员必须使用Assist API。 在此快速提示中,我将介绍API的基础知识,并帮助您开始创建自己的自定义助手。

1.启用默认助手

如果您从未在设备或仿真器上使用过助手,则可能尚未启用它。 要启用它,请按住主页按钮。 在弹出的对话框中,按“ 是,我在”按钮。

启用Google屏幕搜索

现在,您只需长按主页按钮,就可以从任何应用程序访问默认助手。 值得注意的是,默认助手是Google应用的一部分,并且只有在登录Google帐户后才能发挥最佳作用。

2.发送信息给助手

默认助手非常强大。 它可以根据屏幕的当前内容自动提供上下文相关的信息。 它是通过分析活动活动的视图层次结构来实现的。

要查看它的实际效果,请在您的Android Studio项目中创建一个新活动,并将以下具有流行小说名称的TextView小部件添加到其布局中:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Alice's Adventures in Wonderland"
    android:id="@+id/my_text"
    />

如果您现在运行应用程序并长按主页按钮,则默认助手将显示与TextView小部件的内容有些相关的卡片。

助手显示的卡片

通过向助手发送其他信息,可以提高其准确性。 为此,您必须首先重写Activity类的onProvideAssistContent()方法。

@Override
public void onProvideAssistContent(AssistContent outContent) {
    super.onProvideAssistContent(outContent);
}

现在,您可以使用AssistContent对象将信息发送给助手。 例如,如果您希望助手显示一张卡片,让用户在Goodreads上阅读有关小说的信息,则可以使用setWebUri()方法。

outContent.setWebUri(
    Uri.parse(
      "https://www.goodreads.com/book/show/13023.Alice_in_Wonderland"
    )
);

这是新卡的外观:

优惠卡

Assist API还允许您使用setStructuredData()方法将结构化数据传递给助手,该方法需要JSON-LD字符串。 生成JSON-LD字符串的最简单方法是使用JSONObject类及其put()方法。

以下示例代码向您展示了如何生成和发送有关小说的结构化数据:

outContent.setStructuredData(
    new JSONObject()
        .put("@type", "Book")
        .put("author", "Lewis Carroll")
        .put("name", "Alice in Wonderland")
        .put("description", 
            "This is an 1865 novel about a girl named Alice, " + 
            "who falls through a rabbit hole and " +
            "enters a fantasy world."
        ).toString()
);

如果您选择手动编码JSON-LD字符串,建议您使用Google的结构化数据测试工具来确保该字符串有效。

使用结构化数据测试工具验证JSON-LD

3.创建自定义助手

如果您对Google应用助手的数据处理方式不满意,则应考虑创建自己的助手。 这样做不需要太多的努力。

所有自定义助理必须具有以下内容:

  • VoiceInteractionService对象
  • VoiceInteractionSession对象
  • VoiceInteractionSessionService对象
  • 描述自定义助手的XML元数据文件

首先,创建一个名为MyAssistantSession的新Java类,并使其成为VoiceInteractionSession类的子类。 此时,Android Studio应该自动为其生成一个构造函数。

public class MyAssistantSession extends VoiceInteractionSession {
    public MyAssistantSession(Context context) {
        super(context);
    }
}

通过重写onHandleAssist()方法,可以定义助手的行为。 现在,让我们分析上一步中生成的JSON-LD字符串,并将其内容显示为Toast消息。 您可能已经猜到了,要检索JSON-LD字符串,必须使用AssistContent对象的getStructuredData()方法。

以下代码显示了如何将JSON-LD字符串的description键的值显示为Toast消息。

@Override
public void onHandleAssist(Bundle data, 
              AssistStructure structure, AssistContent content) {
    super.onHandleAssist(data, structure, content);

    try {
        // Fetch structured data
        JSONObject structuredData = 
            new JSONObject(content.getStructuredData());
        
        // Display description as Toast
        Toast.makeText(
            getContext(), 
            structuredData.optString("description"),
            Toast.LENGTH_LONG
        ).show();
    } catch (JSONException e) {
        e.printStackTrace();
    }

}

VoiceInteractionSession对象必须在内部被实例化VoiceInteractionSessionService对象。 因此,创建一个名为MyAssistantSessionService的新Java类,并使它成为VoiceInteractionSessionService的子类。 在其onNewSession()方法中,调用MyAssistantSession的构造函数。

public class MyAssistantSessionService 
                extends VoiceInteractionSessionService {
    @Override
    public VoiceInteractionSession onNewSession(Bundle bundle) {
        return new MyAssistantSession(this);
    }
}

我们的助手还需要一个VoiceInteractionService对象。 因此,创建一个名为MyAssistantService的应用程序 。 您不必在其中编写任何代码。

public class MyAssistantService extends VoiceInteractionService {

}

要指定助手的配置详细信息,您必须创建一个XML元数据文件并将其放置在项目的res / xml文件夹中。 文件的根元素必须是<voice-interaction-service>标记,用于指定VoiceInteractionServiceVoiceInteractionSessionService子类的完全限定名称。

这是一个示例元数据文件:

<?xml version="1.0" encoding="utf-8"?>
<voice-interaction-service 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:sessionService="com.tutsplus.myassistantapp.MyAssistantSessionService"
    android:recognitionService="com.tutsplus.myassistantapp.MyAssistantService"
    android:supportsAssist="true"
/>

最后,在项目的AndroidManifest.xml文件中声明服务时,请确保它们需要BIND_VOICE_INTERACTION权限。

<service android:name=".MyAssistantService"
    android:permission="android.permission.BIND_VOICE_INTERACTION">
  <meta-data android:name="android.voice_interaction"
    android:resource="@xml/assist_metadata" />
  <intent-filter>
    <action android:name="android.service.voice.VoiceInteractionService"/>
  </intent-filter>
</service>

<service android:name=".MyAssistantSessionService"
    android:permission="android.permission.BIND_VOICE_INTERACTION">
</service>

您的自定义助手现已准备就绪。

4.使用自定义助手

为了能够使用自定义助手,您必须将其设置为Android设备的默认助手。 因此,请打开“ 设置”应用,然后导航至“ 应用”>“默认应用”>“辅助和语音输入” 。 接下来,单击“ 协助应用程序”选项以选择您的助手。

选择自定义助手

此时,如果您运行应用程序并长按主页按钮,则应该能够看到自定义助手的Toast消息。

定制助手敬酒

结论

在此快速提示中,您学习了如何使用Assist API与Android平台上的助手进行交互。 您还学习了如何创建基本的自定义助手。 但请注意:由于助理可以读取用户屏幕上几乎所有的文本,因此您必须确保自定义助理以安全的方式处理敏感数据。

翻译自: https://code.tutsplus.com/tutorials/quick-tip-how-to-use-androids-assist-api--cms-27933

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值