こんにちは、KID.Aです。
今回はホーム画面からGoogleの音声アクションが行われた場合、
その音声をハンドリングする方法を考えてみようと思います。
現在、思い付く方法はCustom Voice Actionsかアクセシビリティイベントの2つです。
では早速みてみましょう。
Custom Voice Actions
Voice ActionsのCustom Voice Actionsはok Googleで発話した特定のキーワードで指定したAction Intentを発行することができます。
しかしCustom Voice Actionsの開発サイトをみてるとまだ実装はされておらず、Voice Actionsのサイトを要チェックしておいてと記載されております。
・Custom Voice Actionsの開発サイト
https://developers.google.com/voice-actions/custom-actions?hl=ja
そのため、現時点(2015/12)ではCustom Voice Actionsではハンドリングできない状況です。
AccessibilityService
アクセシビリティイベントを使用すればユーザの行動を監視することができます。
これを使用してGoogleの音声アクションを感知することができます。
実装
voice_action_service.xmlを作成します。
<?xml version="1.0" encoding="UTF-8" ?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeAllMask" android:accessibilityFeedbackType="feedbackAllMask" android:accessibilityFlags="flagDefault" android:canRetrieveWindowContent="true" android:description="@string/desc" />
AndroidManifest.xmlに追記します。
<service android:name=".VoiceActionService" android:label="VoiceActionService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/voice_action_service" /> </service>
AccessibilityServiceを作成します。
public class VoiceActionService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { AccessibilityNodeInfo accessibilityNodeInfo = event.getSource(); if (accessibilityNodeInfo != null) { String searchTextClassName = "com.google.android.apps.gsa.searchplate.SimpleSearchText"; if (searchTextClassName.equals(accessibilityNodeInfo.getClassName().toString()) && accessibilityNodeInfo.getText() != null) { Toast.makeText(getApplicationContext(), accessibilityNodeInfo.getText().toString(), Toast.LENGTH_SHORT).show(); } } } @Override public void onInterrupt() { } }
実行
作成したアプリをインストールします。
設定を開きます。
ユーザー補助 > インストールしたアプリを選択します。
ONにします。
OKを押下します。
ONになっていることを確認します。
ホーム画面に戻り「OK, Google」と発呼します。
認識中になります。
適当に発呼します。(今回はDesktopと発呼。特に意味はありません。)
発呼した文言がアクセシビリティイベントで取得できてトーストがでます。
実際に実行すると3回くらいonAccessibilityEventにイベントが発行されますので、ここら辺は気をつけたほうがよいです。
本来なら、Custom Voice Actionsで実装するようなことですが、まだ実装できないことということでもしホーム画面のGoogleの音声アクションをハンドリングしたい場合はアクセシビリティイベントを使うしか方法はなさそうですね。(早くCustom Voice Actionsが使えるようになればいいですね。)
マーケットに上がっている音声アクション系のアプリは必ずアクセシビリティを許可しないと使えないので、おそらく音声アクション系のアプリはアクセシビリティのイベントを利用していると思われます。
以上、Googleの音声アクションのハンドリング方法でした。