8

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

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

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

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

谢谢

4

2 回答 2

12

从 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 的子节点使用递归搜索。

于 2016-03-08T04:31:25.223 回答
1

这里有一个完整的例子,但是开始起来太复杂了。这是我的示例适用于 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" />

语音交互服务.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();
    }
}

语音交互会话服务.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);
    }
}

语音交互会话.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();
    }

}
于 2021-03-20T21:31:35.700 回答