音声コマンドで自分の作ったアプリのActivityを起動する
Android Wearでアプリを起動するのに音声入力でアプリが起動できるととても便利です。Wear用アプリを作る上では外せない要素だと思います。
Android Developersのトレーニングを見ると、AndroidManifest.xml
でintent-filterかけておくだけでいいということです。activityに設定したlabelをキーワードとして、Activityが起動するようになります。
ぶっちゃけると、ラベルをしっかり設定さえすれば、初期状態で音声入力によってActivityが起動するということであります。
Adding Voice Capabilities – Android Developers
しかしいくらやってみてもうまくいかなくて、何がいけないのかサッパリ分かりませんでした。
単純すぎるのか調べてもなかなかピタリとくる情報もなくて困っていたら、Stack over Flowを見て謎が解けました。
Wear: Open my app with custom voice Start command, not working – Stack Over Flow
つまるところ、mobile側のActivityにintent-filterをつけてないとうまく動作しないのです。
私はデバッグのため、wear側のアプリしか動かしていませんでした。(開発中のサンプルアプリはwearにしかインストールされていない状態)
スマホ側に音声コマンドを受け取るintent-filterがなかったためにWear上のActivityも起動しなかったということなんだと思います。
Wearアプリを開発する場合は、Wearモジュールだけでなく、mobileモジュールも実行してスマホにインストールしておかないと、ちゃんとした動作確認ができないということが分かりました。
Android StudioのNew Projectウィザードで作成した初期状態のままです。
wearモジュールもmobileモジュールも、Hello Worldの文字列を表示するだけのMainActivityがあるだけの状態です。
mobile側のActivityのラベルに「サンプル」と設定して、wear側のActivityのラベルにも「サンプル」と設定します。
この状態でOK Googleから「サンプル開始」と言うと、WearのMainActivityが起動します。スマホのMainActivityは起動しません。
mobile側のActivityのラベルに「サンプル」と設定して、wear側のActivityのラベルに「テスト」と設定します。
この状態でOK Googleから「サンプル開始」というと、スマホ側のMainActivityが起動します。(Wear端末には「アプリを開いています・・・」というメッセージが表示され、スマホ側で指定したActivityが起動します)
一方で「テスト開始」というと「テスト開始」でWeb検索を行った結果がWear端末に表示されます。
どちらにせよWearのMainActivityは起動しませんでした。
ちなみにスマホ側でOK Googleからの音声入力を行った場合は、全てWeb検索として扱われてしまい、MainActivityは起動しませんでした。
どういうことなんでしょう?
Wear端末はスマホとペアリングされている状態でなければ音声入力を使うことができません。
このことから、音声入力の処理を実際に行っているのはスマホ側であると考えられます。
おそらくスマホ側に入力結果に該当するActivityがあるかどうかが調べられ、なければWeb検索として処理されるのだと思います。
スマホ側に該当するActivityがあれば、そのActivityを開くぞという情報をwear端末へ送るのでしょう。その際にWear上にも同一のActivityがあれば、Wear上でActivityが開かれるんでしょう、多分。
この辺りの音声入力の結果、どのようなデータがどうやって送受信されているのかを調べる方法があればもっと分かりやすいとは思うのですが、私には調べる方法が分かりません。
Android Developers探したらどこかにあるんですかね・・・?
以前試した時は、mobile側のラベルに関係なくWearにインストールしたアプリのActivityが起動していました。
そのためいまひとつ腑に落ちません。
うまくいかなくなったのはWear端末のリセットを行ってからなので、何らかの設定が変わってしまったせいもあるかもしれません。OSのバージョンが5.0.2になったせいもあるかもしれません。