search
LoginSignup
6

More than 3 years have passed since last update.

posted at

updated at

Organization

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
6