如何使用 Google Assist API 实现助手

Posted

技术标签:

【中文标题】如何使用 Google Assist API 实现助手【英文标题】:How to implement an Assistant with Google Assist API 【发布时间】:2016-05-19 07:00:30 【问题描述】:

我一直在查看并阅读有关 Google Now on Tap(来自 http://developer.android.com/training/articles/assistant.html)的信息。

从那篇文章中发现 Now on Tap 是基于与 Marshmallow 捆绑的 Google 的 Assist API 非常有趣,我们似乎可以开发自己的助手(Google 在文章中使用的术语来指代像 Now 这样的应用程序on Tap) 使用 API。

但是,上面提到的文章只是非常简要地讨论了如何使用 Assist API,即使在互联网上搜索了几天之后,我也找不到任何关于如何使用它来开发自定义助手的更多信息。没有文档,也没有示例。

我想知道你们中是否有人可以分享使用 Assist API 的经验?任何帮助表示赞赏。

谢谢

【问题讨论】:

Google Now on Tap 仍然是一个东西,例如安卓10?我自己在手机上看不到该选项,我看到的所有文章和视频都可以追溯到 2015-2016 年。我只是看到 Google 助理开始使用,但没有恢复到 Google Now on Tap 的选项。 【参考方案1】:

您绝对可以使用从 Android 6.0 开始的 Assist API 来实现个人助理,就像 Google Now on Tap 一样。官方开发人员 (http://developer.android.com/training/articles/assistant.html) 指南准确地告诉您应该如何实现它。

一些开发人员可能希望实现自己的助手。如图 2 所示,Android 用户可以选择活动的助手应用程序。助手应用程序必须提供 VoiceInteractionSessionService 和 VoiceInteractionSession 的实现,如本示例所示,并且它需要 BIND_VOICE_INTERACTION 权限。然后它可以在 onHandleAssist() 中接收表示为 AssistStructure 实例的文本和视图层次结构。助手通过 onHandleScreenshot() 接收截图。

Commonsware 有四个用于基本 Assist API 使用的演示。 TapOffNow (https://github.com/commonsguy/cw-omnibus/tree/master/Assist/TapOffNow) 应该足以让您入门。

您不必使用 onHandleScreenshot() 来获取相关的文本数据,onHandleAssist() 中的 AssistStructure 将为您提供一个根 ViewNode,它通常包含您在屏幕上可以看到的所有内容。

您可能还需要实现某种功能来快速定位您想要关注的特定 ViewNode,使用递归搜索从此根 ViewNode 的子节点。

【讨论】:

感谢@lifelogger,它确实看到了您从开发人员文档中引用的段落,但是对于我作为 Android 的初学者来说,这很模糊。比如如何“实现VoiceInteractionSessionService和VoiceInteractionSession”(他们提供的例子对我帮助不大),如何将这样的实现集成到助手应用程序中,Android系统如何识别我的自定义助手应用程序等等。你的例子提供的肯定更有帮助。谢谢你 我已经试用了示例应用程序,发现它们只有在我们打开应用程序并按住主页按钮一段时间后才能工作。我想知道我们是否可以做些什么来让它完全取代 Google Now on Tap。例如,我们是否可以将其设置为默认助手,然后当用户在任何屏幕上按住主页按钮时,应用程序就会弹出?根据谷歌的说法,这似乎是可能的(“Android用户可以选择活动的助手应用程序”)但是经过大量搜索后我找不到办法...... PS。 sr,我没有 15 个 repu 点,所以我对你的支持是不可见的 :( 您可以将您开发的助手设置为默认设置,方法是转到设置-> 辅助和语音输入并选择您的。 请注意,Assist API 仅适用于 Android 6.0。 嘿@H.Nguyen,还有什么问题吗?如果不是,请接受我的回答。【参考方案2】:

有一个完整的例子here,但是开始太复杂了。 这是我在 android 7.1.1 上运行的示例

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.eaydin79.voiceinteraction">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:theme="@style/AppTheme" >
        <service 
            android:name="voiceInteractionService"
            android:permission="android.permission.BIND_VOICE_INTERACTION" >
            <meta-data 
                android:name="android.voice_interaction"
                android:resource="@xml/interaction_service" />
            <intent-filter>
                <action android:name="android.service.voice.VoiceInteractionService" />
            </intent-filter>
        </service>
        <service 
            android:name="voiceInteractionSessionService"
            android:permission="android.permission.BIND_VOICE_INTERACTION" >
        </service>
    </application>
</manifest>

这是存储在 res\xml 文件夹中的 interaction_service.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:sessionService="com.eaydin79.voiceinteraction.voiceInteractionSessionService"
    android:recognitionService="com.eaydin79.voiceinteraction.voiceInteractionService"
    android:supportsAssist="true" />

voiceInteractionService.java

package com.eaydin79.voiceinteraction;
import android.service.voice.VoiceInteractionService;
import android.service.voice.VoiceInteractionSession;

public class voiceInteractionService extends VoiceInteractionService 
    @Override
    public void onReady() 
        super.onReady();
    

voiceInteractionSessionService.java

package com.eaydin79.voiceinteraction;
import android.os.Bundle;
import android.service.voice.VoiceInteractionSession;
import android.service.voice.VoiceInteractionSessionService;

public class voiceInteractionSessionService extends VoiceInteractionSessionService     
    @Override
    public VoiceInteractionSession onNewSession(Bundle bundle) 
         return new voiceInteractionSession(this);
    

voiceInteractionSession.java

package com.eaydin79.voiceinteraction;
import android.app.VoiceInteractor;
import android.content.Context;
import android.os.Bundle;
import android.service.voice.VoiceInteractionSession;
import android.media.AudioManager;

public class voiceInteractionSession extends VoiceInteractionSession 
   
    voiceInteractionSession(Context context) 
        super(context);
    

    @Override
    public void onShow(Bundle args, int showFlags) 
        super.onShow(args, showFlags);
        //whatever you want to do when you hold the home button 
        //i am using it to show volume control slider
        AudioManager audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
        if (audioManager != null) audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_SAME, AudioManager.FLAG_SHOW_UI);
        hide();
    


【讨论】:

我发现的另一个例子here 感谢您发布此内容,我尝试在 Android 11 上构建此内容,但如何将其作为助手启用?我在任何地方都没有看到“辅助和语音输入”选项。有什么想法吗? @droid_dev 可能是 this flow 适配 Android 11,或者只是在 Youtube 上搜索类似的视频。

以上是关于如何使用 Google Assist API 实现助手的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React、Redux 和 Webpack 实现 Google API

如何使用 CORS 实现 JavaScript Google Places API 请求

如何使用 Smack API 实现 Google “Off the Record”

如何使用 Visual Assist “转到定义”函数?

使用Javascript中的Oauth授权将Google表格API v3迁移到v4之后如何实现makeApiCall()方法

使用 Eclipse,如何在 Content Assist 中隐藏超类方法?