如今,Android用户不再需要打开浏览器并执行搜索来了解他们在使用应用程序时偶然发现的事情。 他们可以改用助手。 如果您拥有运行Android 6.0或更高版本的设备,则可能已经熟悉其默认助手,该助手最初称为Google Now on Tap。 最近,它的名称已更改为screen search 。
助手,尽管上下文相关,但通常不是很准确。 为了提高准确性,应用程序开发人员必须使用Assist API。 在此快速提示中,我将介绍API的基础知识,并帮助您开始创建自己的自定义助手。
1.启用默认助手
如果您从未在设备或仿真器上使用过助手,则可能尚未启用它。 要启用它,请按住主页按钮。 在弹出的对话框中,按“ 是,我在”按钮。

现在,您只需长按主页按钮,就可以从任何应用程序访问默认助手。 值得注意的是,默认助手是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的结构化数据测试工具来确保该字符串有效。

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>
标记,用于指定VoiceInteractionService
和VoiceInteractionSessionService
子类的完全限定名称。
这是一个示例元数据文件:
<?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