Как реализовать Ассистент с помощью Google Assist API

Я проверял и читал о Google Now on Tap (с http://developer.android.com/training/articles/assistant.html).

Из этой статьи было очень интересно узнать, что Now on Tap основан на Google Assist API в комплекте с Marshmallow, и нам представляется возможным разработать нашего собственного помощника (термин Google использовался в статье для обозначения приложения, такого как Now on Tap). используя API.

Однако в упомянутой статье очень кратко обсуждается, как использовать Assist API, и я не смог найти никакой дополнительной информации о том, как использовать его для разработки специального помощника, даже после нескольких дней поиска его в Интернете. Нет документации и нет примера.

Мне было интересно, если у кого-нибудь из вас есть опыт работы с Assist API, которым вы могли бы поделиться? Любая помощь приветствуется.

Спасибо

2 ответа

Решение

Вы можете определенно реализовать личного помощника, как Google Now on Tap, используя Assist API, начиная с Android 6.0. В официальном руководстве разработчика ( http://developer.android.com/training/articles/assistant.html) рассказывается, как именно вы должны его реализовать.

Некоторые разработчики могут захотеть реализовать свой собственный помощник. Как показано на рисунке 2, приложение активного помощника может выбрать пользователь Android. Приложение-помощник должно предоставлять реализацию VoiceInteractionSessionService и VoiceInteractionSession, как показано в этом примере, и для него требуется разрешение BIND_VOICE_INTERACTION. Затем он может получить текст и просмотреть иерархию, представленную как экземпляр AssistStructure в onHandleAssist(). Помощник получает скриншот через onHandleScreenshot().

Commonsware имеет четыре демонстрации для базового использования Assist API. TapOffNow ( https://github.com/commonsguy/cw-omnibus/tree/master/Assist/TapOffNow) должно быть достаточно для начала работы.

Вам не нужно использовать onHandleScreenshot() для получения соответствующих текстовых данных, AssistStructure в onHandleAssist () предоставит вам корневой ViewNode, который обычно содержит все, что вы можете видеть на экране.

Возможно, вам также потребуется реализовать некоторые виды функций, чтобы быстро найти конкретный ViewNode, на котором вы хотите сосредоточиться, используя рекурсивный поиск дочерних элементов из этого корневого ViewNode.

Существует полный пример здесь , но это слишком сложно , чтобы начать. Это мой пример работает на 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>

это файл Interaction_service.xml, хранящийся в папке res \ 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();
    }

}
Другие вопросы по тегам