如何使用Google Assist API实施助理

时间:2016-02-09 10:26:58

标签: android android-6.0-marshmallow google-assist-api

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

从该文章中发现,Now on Tap基于与Marshmallow捆绑在一起的Google的Assist API非常有趣,我们似乎可以开发自己的助手(Google在文章中使用的术语来引用使用API​​的应用程序,如Now on Tap。

但是,上述文章仅非常简要地讨论了如何使用Assist API,即使在互联网上花了几天时间,我也无法找到有关如何使用它来开发自定义助手的任何其他信息。没有文档也没有例子。

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

由于

2 个答案:

答案 0 :(得分:9)

您可以使用启动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的子项进行递归搜索。

答案 1 :(得分:1)

有一个完整的例子 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();
    }

}