我一直在查看并阅读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的经验可以分享?任何帮助表示赞赏。
由于
答案 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();
}
}