Edited at

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 で捕まえます。

新しいインテントを作り下図のように設定しましょう。

confirm.png

許可を求めた情報は 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 などのどこかしらにユーザーの情報を保存する