Google Assistantアプリで位置情報を取得する


Actions on Google ではパーミッションを適切に求めることで、
位置情報を初めとしたユーザーの情報を取得することが可能です。

大まかな流れ

大きく分けるとこんな感じです。

  1. fulfillment で許可を求める処理を動かす
  2. 許可を求めた結果を Intent で受ける
  3. 取得した情報を自由にゴニョゴニョする

1. fulfillment で許可を求める処理を動かす

許可を求める処理はnpmパッケージの actions-on-google で定義されている Permmision クラスを用います。
Permission クラスはレスポンスの一種で以下のように記述します。

import { Permission } from 'actions-on-google'

app.intent('TestIntent', conv => {
  const context = '「位置情報を使ってもいいですか」の前に喋ってほしい内容'
  const permission = ['DEVICE_PRECISE_LOCATION']

  conv.ask(new Permission({ context, permission }))
})

上記のコードを動かすと TestIntent に入った場合に、位置情報を取得していいかユーザーに質問するようになります。

位置情報以外の許可を求めたい場合はこちらを見てください。位置情報以外にもユーザー名などがいくつかあります。
https://developers.google.com/actions/reference/rest/Shared.Types/Permission

2. 許可を求めた結果を Intent で受ける

ユーザーに許可を求めた後は actions_intent_PERMISSION というイベントが発火しますので、それを Dialogflow で捕まえます。
新しいインテントを作り下図のように設定しましょう。

許可を求めた情報は fulfillment からアクセスしますので、インテントの下部にある fulfillment の設定を Enable にするのを忘れずに。

3. 取得した情報を自由にゴニョゴニョする

2で示した画像と同じインテント名を付けていたら下記のコードで位置情報にアクセスできます。

app.intent('PermissionConfirm', (conv, params, confirmationGranted) => {
  if (!confirmationGranted) { // ユーザーが承認したかどうか
    conv.close('位置情報が取得できませんでした')
  }

  console.log(conv.device.location) // 位置情報が入っているオブジェクト
  conv.close('位置情報が取得できました')
})

今回許可を求めた DEVICE_PRECISE_LOCATION の場合は conv.device.location の中に情報が入っていますが、
他のパーミッションの場合は conv.user など違う場所に情報が入っています。

下記のページにリクエストに含まれる情報は記載されていますので、許可を求めた情報に合わせて確認してください。
https://developers.google.com/actions/reference/rest/Shared.Types/AppRequest

注意点

一度聞いたパーミッションでも毎回許可を求めなくてはいけません。
名前など一度得た情報をユーザーごとに覚えておきたい場合は以下の二点を行う必要があります。

  • アカウントリンキングでスキルを使っているユーザーを識別できるようにする
  • Firestore などのどこかしらにユーザーの情報を保存する