タッチイベントのテストについて検索しても具体的なやり方が見つからなくて、諦めかけていた1ヶ月前の自分に向けた記事です。
もしもっと簡単な方法が常識みたいに存在してたら教えてください。
問題
Echo Spot、Echo Showの画面に選択肢を表示して、ユーザーのタッチを処理して進行するスキルを作りたい。
でも、実機は持ってません。
以上の記事を参考にして、画面に選択肢を表示させる方法はわかりました。
また、Display.ElementSelectedというイベントを処理すればいいらしいこともわかりました。
選択肢にはtokenという、どれを選んだか識別するための文字列を仕込んでおいて、タッチされたときにtokenを取り出して処理を分岐させるということですね。
しかし、開発者コンソールのテスト画面で、シミュレーターに表示されている選択肢をクリックしても何も起こりません。
タッチイベントのシミュレートはしてくれないようです。
どうすればいいんだろう…
答え
スキルでは任意の選択可能要素にtokenフィールドを設定でき、設定したトークンは要素が選択されるとDisplay.ElementSelectedリクエストで送信されます。このようなイベントの例を次に示します。
"request": {
"type": "Display.ElementSelected",
"requestId": "amzn1.echo-api.request.7zzzzzzzzz",
"timestamp": "2018-06-06T20:05:04Z",
"locale": "ja-JP",
"token": "getTopicName-Cookie-Contest"
}
これか。
1. Alexaシミュレーターでスキルを起動して、選択肢が提示されるところで、音声で選択をした体で入力のシミュレートを行います。(例えば番号で選択する場面なら「3番」とかを入力する)
2. そのとき表示されるJSON入力をコピーします。
3. lambdaのテストイベント設定画面を開き、コピーしたJSONを貼り付けます。
その中には、以下のようなリクエストデータが含まれていますので、
```diff
"request": {
"type": "IntentRequest",
"requestId": "amzn1.echo-api.request.7zzzzzzzzz",
"timestamp": "2018-12-15T11:33:22Z",
"locale": "ja-JP",
"intent": {省略}
}
Display.ElementSelectedリクエストに書き換えます。
"request": {
- "type": "IntentRequest",
+ "type": "Display.ElementSelected",
"requestId": "amzn1.echo-api.request.7zzzzzzzzz",
"timestamp": "2018-12-15T11:33:22Z",
"locale": "ja-JP",
- "intent": {省略}
+ "token": "その選択肢に設定したtoken"
}
これで、そのテストを実行すれば、lambda上で結果の出力を得られます。
Display.ElementSelectedのハンドラで処理され、音声での入力と同じ結果が得られれば問題ないでしょう。
実機での動作が確認できないので不安でしたが、審査は通りました。
余談
ディスプレイインターフェースを有効にしたときに自動的に追加されるインテントのうち、NextIntentとPreviousIntentは処理が必須です(審査されます)。が、スキルで「前」とか「次」を使わない場合はわざわざ個別に対応しなくても、ErrorHandler(どのハンドラにも引っかからなかったイベントをまとめて処理するハンドラ)に任せて「すみません、わかりませんでした」みたいな答えを返せば大丈夫だと思います。
私はErrorHandlerをコピペしたきりで返答が英語だったため、一度審査に落ちました。
なお、当該スキルはこちらです。クソゲーかな? でもキャンペーンでEcho Showがもらえる条件はクリアしたはず!