Alexaスキル向け位置情報サービスを使用する
位置情報サービスを使用すると、スキルでユーザーのAlexa搭載デバイスのリアルタイム位置情報を取得する権限を、ユーザーからAlexaへのリクエストがあったときにユーザーに要求することができます。位置情報は、地理座標系(緯度、経度、高度など)で表されます。この情報は、スマートフォンや車載ナビゲーションシステムといったモバイルデバイスの位置情報のプロキシとして使用できます。
位置情報サービスを使用するよう設定されたスキルをユーザーが有効にすると、位置情報データをスキルと共有することへの同意を求めるプロンプトがAlexaアプリに表示されます。ユーザーはいつでもAlexaアプリのAlexaプライバシー設定ページにアクセスして、スキルの権限を管理できます。
ユーザーが音声によって、位置情報の共有を同意できるようにするには、Alexaスキルで音声による同意確認を使用するを参照してください。
位置情報サービスのしくみ
次の図は、位置情報サービス機能による、Alexa、ユーザーのデバイス、スキルの連携を示しています。
位置情報サービスを使用するための要件
位置情報を使用するスキルは、次の要件を満たす必要があります。
- 開発者コンソールの公開ページに、スキルに適用するプライバシーポリシーへのリンクを含める必要があります。
- 子ども向けスキルでは使用できません。子ども向けスキルの詳細については、子ども向けAlexaスキルを参照してください。
- 位置情報を受け取る権限のリクエストは、スキルで提供する機能やサービスをサポートするために必要な場合にのみ行います。
- 取得した個人情報は、そのユーザーの許可を得た場合にのみ、プライバシーに関する通達および関連法令に則って利用する必要があります。
- 位置情報やその他のユーザー情報を使用して、バックグラウンドでユーザーのアカウントをリンクすることはできません。つまり、1人のAlexaユーザーを同じ位置情報を持つアカウントプールのユーザーに関連付けることは認められません。ユーザーのAmazonアカウント情報は検証済みのものではなく、古い情報の可能性があります。
- ユーザーが位置情報を必要とするリクエストを使用してスキルを呼び出すたびに、スキルは最新の位置情報を取得し、ユーザーの前回のリクエストで取得した位置情報データを上書きする必要があります。つまり、スキルには最新のデータのみを保存する必要があります。
地理座標系を基準にしたデバイスのアドレス
「大通り585番地」のようなデバイスのアドレスは、デバイスの地理座標系とは異なるものです。モバイルデバイスは移動するので、モバイルデバイスの現在の位置情報が、登録されたDevice Settingsと大きく異なる可能性もあります。Amazon Echoのような固定デバイスの場合、AlexaはDevice Settings APIを使用してデバイスの物理アドレスを提供できます。固定デバイスが、位置情報サービスを介して地理座標系を提供することはありません。
モバイルデバイスの場合、スキルは、Device Settings APIの代わりに位置情報サービスを使用してデバイスの現在の位置情報を取得する必要がありますが、これにはいくつか例外があります。ピザ配達スキルの場合であれば、地理座標系ではなく実際のデバイスのアドレスを使用することによって、正確な場所にピザを配達できます。地域検索やナビゲーションのスキルでは、ユーザーの現在地が自宅の住所と異なる場合があるため、デバイスのアドレスよりも地理座標系の方が便利です。
位置情報サービスを使用するようスキルを設定する
位置情報サービスを使用するようスキルを設定するには、次の手順を実行します。
ステップ1: 位置情報サービスの権限を有効にする
位置情報サービスの権限を有効にする必要があります。この設定により、スキルがユーザーの動的な位置情報を使用する必要があることをAlexaに伝えます。スキルで位置情報サービスが設定されており、ユーザーの権限で許可されている場合、Alexaはサービスプロバイダーインターフェース(SPI)内のユーザーの位置情報を渡します。
位置情報サービスの権限を有効にする
- Alexa開発者コンソールにサインインし、スキルに移動します。
- 左側のツールをクリックし、アクセス権限をクリックします。
- 位置情報サービスを有効にします。
注: 位置情報サービスを有効にしない場合、スキルはユーザーの位置情報データを受け取りません。
ステップ2: 位置情報サービスデータを処理できるようスキルサービスのロジックを変更する
スキルのソースコード内では、ユーザーの位置情報データを、カスタムスキルのコンテキストで確認できます。これは、AlexaがAWS Lambda関数またはウェブサービスに送信するJSONオブジェクトです。このデータは、context
オブジェクトのGeolocationセクション(context.Geolocation
)に含まれます。
次のコード例では、ユーザーのデバイスの地理座標系を出力しています。
var isGeoSupported = context.System.device.supportedInterfaces.Geolocation;
var geoObject = context.Geolocation;
if (isGeoSupported) {
var ACCURACY_THRESHOLD = 100; // 100メートルの精度が必要
if (geoObject && geoObject.coordinate && geoObject.coordinate.accuracyInMeters < ACCURACY_THRESHOLD ) {
console.log(geoObject); // 精度が100メートル以内であれば、地理座標系オブジェクトを印刷
}
}
適切な権限が付与されている場合、位置情報サービスを利用するAlexa搭載デバイスを使用しているユーザーのみが、地理座標系をスキルと共有できます。ユーザーのデバイスが位置情報を共有できるかどうかを判断するには、context.System.device.supportedInterfaces
オブジェクトにGeolocation
フィールドがあるかどうかを確認します。
Geolocation
フィールドがない場合、ユーザーのデバイスは位置情報データを提供できません。Amazon Echoなどの固定デバイスがこれに該当します。そのような場合、位置情報を必要としないユーザーエクスペリエンスを提供する必要があります。たとえば、ユーザーのリアルタイム位置情報を受け取ることができないことを知らせるプロンプトを表示します。
次のコードは、Geolocation
オブジェクトの例を示しています。
coordinate
オブジェクトにはlatitudeInDegrees
、longitudeInDegrees
、accuracyInMeters
が必須となっていますが、Alexaと共有するデバイスではaltitude
、heading
、speed
はオプションのオブジェクトとなっています。そのため、これらのオプションのフィールドはスキルで使用できない場合があります。各プロパティの詳細については、Geolocationオブジェクトのプロパティを参照してください。
ステップ3: スキルをテストする
地理座標系を処理するスキルロジックを記述したら、Alexaアプリなどのモバイルデバイスを使用してテストできます。
ユーザーが発話するたびに、ユーザーの位置情報(有効な場合)がスキルに渡されます。たとえば、次のやり取りでは、ユーザーの位置情報がAlexaに2回送信されます。ユーザーが移動中の場合、各発話には異なるユーザー位置情報データが含まれることがあります。位置情報サービスは、位置情報データのリアルタイムストリーミングをサポートしていません。
以下は、テストダイアログの例です。
ユーザー: アレクサ、いちばん近くにある喫茶店に行きたいんだけど。
スキル: 目黒区下目黒2008番地の喫茶店Aへの道順を伝えます。
ユーザー: アレクサ、近くに映画館はある?
スキル: 最寄りの映画館は、品川区上大崎1100番地にあります。
地理座標系情報は、位置情報サービスを使用してこのデータを取得するハードウェアデバイスから提供されます。Alexaでは、このデータのソースの制御は行いません(GPSからのものか、IP由来のものかなど)。つまり、スキルに送信されるユーザーの位置情報データの粒度や精度をAlexaが制御することはありません。ただし、スキルの目的を果たすだけの精度があるかどうかをスキルが判断できるように、Alexaを搭載したモバイルデバイスは、精度のメトリクス(メートル単位の精度、context.Geolocation.coordinates.accuracyInMeters
)を提供する必要があります。
Geolocationオブジェクトのプロパティ
パラメーター | 説明 | 型 | 必須 |
---|---|---|---|
|
ユーザーのデバイスで位置情報の共有が有効になっているかどうかを示すプロパティです。 注:
Geolocation オブジェクトには、locationServices オブジェクト、coordinate オブジェクトのいずれかが含まれる必要があります。 |
オブジェクト |
✕ |
|
位置情報の共有アクセスが有効か無効かを示すプロパティです。次のいずれかになります。 |
列挙型文字列 |
◯( |
|
位置情報の共有ステータスです。次のいずれかになります。 |
列挙型文字列 |
◯( |
|
デバイスでGPSデータが更新されたときのISO 8601形式(RFC 3339形式を推奨)のデバイス時刻です。例: |
XYZ |
◯ |
|
デバイスの座標です。 注:
Geolocation オブジェクトには、locationServices オブジェクト、coordinate オブジェクトのいずれかが含まれる必要があります。 |
オブジェクト |
◯( |
|
赤道からの角度です。範囲:[-90.0, 90.0] |
倍精度 |
◯( |
|
本初子午線からの角度です。範囲:[-180.0, 180] |
倍精度 |
◯( |
|
緯度および経度の不確実性(メートル単位)です。範囲:[0, MAX_INTEGER] |
倍精度 |
◯( |
|
GPS制限内の海抜距離(メートル単位)です。範囲:[-6350, 18000] |
倍精度 |
✕ |
|
GPS制限内の海抜距離(メートル単位)です。範囲:[-6350, 18000] |
倍精度 |
✕ |
|
標高の不確実性(メートル単位)です。範囲:[0, MAX_INTEGER] |
倍精度 |
✕ |
|
デバイスの向いている方位です。 |
オブジェクト |
✕ |
|
真北からの角度です。範囲: [0.0, 360.0] |
倍精度 |
✕ |
|
方向の精度パラメーターです。範囲:[0, MAX_INTEGER] |
倍精度 |
✕ |
|
デバイスの速度です。 |
オブジェクト |
✕ |
|
GPS制限内の速度(メートル/秒)です。範囲:[0, 1900] |
倍精度 |
✕ 自動車を除く(契約が必要) |
|
速度の精度パラメーターです。範囲:[0, MAX_INTEGER] |
倍精度 |
✕ |
実装
以下のセクションでは、次のアクションをスキルコードに実装する方法について説明します。
データの鮮度と精度を確認する
スキルでこのデータを使用する前に、位置情報データの鮮度と精度の両方を確認する必要があります。運転中などは、ユーザーの場所が急激に変わることがあります。そのような場合、10分前のGPSデータでは精度が非常に低くなってしまいます。
鮮度をチェックするには、Geolocation.timestamp
とIntentRequestのtimestamp(request.timestamp
)の差を確認します。差が小さいと、データの鮮度が高くなります。Geolocation.timestamp
値は、ユーザーの位置情報がデバイス内部で測定された時刻です。request.timestamp
値は、スキルが呼び出されたときとほぼ同時刻になります。
鮮度と精度のチェックを組み合わせることによって、位置情報データが使用可能かどうかを判断するロジックを作成できます。次のコードでは、100メートルの精度と1分の鮮度が求められるデータをテストしています。
var isGeoSupported = context.System.device.supportedInterfaces.Geolocation;
var geoObject = context.Geolocation;
if (isGeoSupported) {
var freshness = ( new Date(request.timestamp) - new Date(geoObject.timestamp) ) / 1000; // 鮮度(秒単位)
var ACCURACY_THRESHOLD = 100; // 100メートルの精度が必要
if ( geoObject && geoObject.coordinate && geoObject.coordinate.accuracyInMeters < ACCURACY_THRESHOLD && freshness < 60 ) {
// ユーザーのコードはこちら
}
}
実行時に権限を取得することへの同意をユーザーに求める
Geolocation
オブジェクトに地理座標データがない場合があります。これは、context.Geolocation
がnullであるかどうかをテストすることで確認できます。開発者コンソールで位置情報サービスを有効にしている場合、このデータが不足していると、context.Geolocation
は次の3つの理由からnullになる可能性があります。
-
ケース1 - ユーザーのデバイスがAmazon Echoなどの固定デバイスであるか、位置情報をAlexaに送信するように設定されていません。この場合、有効なモバイルデバイスではないため、デバイスの座標はデフォルトで使用できません。ケース1に該当するかどうかを確認するには、
context.System.device.supportedInterfaces.Geolocation
フィールドをチェックし、trueに設定されているかどうかを確認します(前述のコード例を参照)。ケース1に該当しない場合、ケース2のテストに進みます。 -
ケース2 - ユーザーがスキルと位置情報を共有するよう設定していません。この場合は、AskForPermissionsConsentカードを使用してユーザーに権限を要求して、この問題を解決することを検討します。ケース2の場合、位置情報を取得するための権限をAlexaやスキルに提供するようユーザーに依頼します。ユーザーに依頼するには、
AskForPermissionsConsent
カードを応答として返します。このカードは、ユーザーのAlexaアプリに手順カードを送信します。このカードには、Alexaまたはスキルの位置情報の共有を有効にする手順が記載されています。 -
ケース3 - ユーザーのハードウェアで位置情報の共有が無効になっているか、ユーザーがAlexaと位置情報を共有するよう設定していません。たとえば、ユーザーのデバイス(携帯電話など)の位置情報サービスが無効になっている可能性があります。この場合は、Alexaとの位置情報共有を有効にするようにユーザーに依頼することを検討します。
複数のケースが同時に該当する場合もあります。たとえば、ユーザーが位置情報共有の権限をスキルに付与しておらず、デバイスの位置情報共有も無効になっていることなどがあり得ます。
次のコード例は、タクシー予約という仮想スキルにAskForPermissionsConsent
カードを生成する応答を返します。次のような応答を簡単に作成できるよう、Alexa Skills Kit SDK for Node.jsを使用することをお勧めします。
var isGeolocationSupported = context.System.device.supportedInterfaces.Geolocation;
if ( isGeolocationSupported ) { // デバイスが位置情報ベースの機能をサポートするかどうか
var geoObject = context.Geolocation;
if ( ! geoObject || ! geoObject.coordinate ) {
return responseBuilder
.speak('タクシー予約は、お客様の位置情報を使用します。位置情報の共有を有効にするには、Alexaアプリに移動し、指示に従って操作してください。')
.withAskForPermissionsConsentCard(['alexa::devices:all:geolocation:read'])
.getResponse();
} else {
// 位置情報データを使用
}
}
応答には、card
とoutputSpeech
の2つのセクションがあります。カードのタイプはAskForPermissionsConsent
であり、ユーザーに送信する手順カードの種類をAlexaに示します。このカードでは、権限リストで権限スコープのリストを指定できます。位置情報の権限の場合、スキルは権限のリストの一部としてalexa::devices:all:geolocation:read
を渡す必要があります。
手順カードの送信と併せて、スキルはAlexaがユーザーに伝える内容を指定する必要があります。以下は、スキルと位置情報を共有する権限をユーザーに要求する場合の例です。
{Skill_name} would like to use your location.To turn on location sharing, please go to your Alexa app, and follow the instructions.
{Skill_name} souhaite utiliser votre position.Pour activer le partage de position, veuillez accéder à votre application Alexa et en suivre les instructions.
{Skill_name} möchte deinen Standort verwenden.Um die Standortfreigabe zu aktivieren, gehe zu deiner Alexa-App und folge den Anweisungen.
{Skill_name} आपके स्थान का उपयोग करना चाहेंगे। स्थान साझाकरण चालू करने के लिए, कृपया अपने एलेक्सा ऐप पर जाएं और निर्देशों का पालन करें।
{Skill_name} vorrebbe utilizzare la tua posizione.Per attivare la condivisione della posizione, vai alla tua app Alexa e segui le istruzioni.
{Skill_name}は、お客様の位置情報を使用します。位置情報の共有を有効にするには、Alexaアプリに移動し、指示に従って操作してください。
{Skill_name} gostaria de usar sua localização.Para compartilhar sua localização, vá até seu aplicativo Alexa, e siga as instruções.
{Skill_name} quisiera usar tu ubicación.Para dar permiso a compartir tu ubicación, ve a tu aplicación Alexa y sigue las instrucciones.
応答のoutputSpeech
セクションで音声を指定します。口頭による指示がなければ、ユーザーはスキルにエラーが発生していると思うかもしれません。
この応答が返されると、次の一連のイベントが発生します。
-
ユーザーに次のメッセージが読み上げられます。「タクシー予約は、お客様の位置情報を使用します。位置情報の共有を有効にするには、Alexaアプリに移動し、指示に従って操作してください。」
-
位置情報の共有を行うための権限で不足しているものがないか、Alexaが個別に確認します。
-
位置情報の共有を有効にするための手順が記載されたホームカードがAlexaから送信され、セッションが終了します。
不足している権限によっては、AlexaからユーザーのAlexaアプリに別の手順カードが送信されます。スキルにはユーザーの位置情報を使用する権限があるがAlexaにはない場合と、スキルにユーザーの位置情報を使用する権限がない場合とでは、カードの内容が異なります。
ただし、Alexaにもスキルにもユーザーの権限がない場合は、次のような手順カードが作成されます。
4.ユーザーがカードで指示されたアクションを実行し、スキルを再度使用すると、context.Geolocation
オブジェクトに有効なcoordinates
オブジェクトが格納されます。
Amazonがデバイスの位置情報を受け取れる | スキルがAmazonから位置情報を受け取れる | スキルによる位置情報へのアクセス | スキルのアクション |
---|---|---|---|
TRUE |
TRUE |
◯ |
なし |
TRUE |
FALSE |
✕ |
位置情報の権限をリクエストするための権限カードを表示させます |
FALSE |
TRUE |
✕ |
ユーザーにAlexaとの位置情報の共有を有効にするように依頼します |
FALSE |
FALSE |
✕ |
位置情報の権限をリクエストするための権限カードを表示させます |
必要となる特定の権限を検出する
既に述べたように、スキルとAlexaのそれぞれにデバイスの位置情報へのアクセス権限があるかどうかを確認できます。スキルでこの情報を使用すれば、AskForPermissionsConsent
カードが返されたときの読み上げをさらにカスタマイズできます。
スキルに位置情報を読み取る権限があるかどうかを確認するには、context.System.user
の値を確認します。このオブジェクトには、現在のユーザーに関するメタデータが含まれます。たとえば、ユーザーがスキルに付与した権限のセットを追跡するpermissions.scopes
オブジェクトなどです。個々のスコープの値を調べることができます。たとえば、スキルに権限がある場合、scopes['alexa::devices:all:geolocation:read'].status
は「GRANTED」となります。
スキルに権限が不足している場合にのみ手順カードを送信するには、次のようなコードを使用します。
if ( isGeolocationSupported ) { // デバイスが位置情報ベースの機能をサポートするかどうか
var geoObject = context.Geolocation;
if ( ! geoObject || ! geoObject.coordinate ) {
var skillPermissionGranted = context.System.user.permissions.scopes['alexa::devices:all:geolocation:read'].status === "GRANTED";
if ( !skillPermissionGranted) {
// AskForPermissionsConsentカードをここで返す
...
スキルに権限があっても地理座標系データがリクエストで利用できない場合は、スキルからユーザーに再度プロンプトを表示する必要があります。
モバイルデバイスで位置情報の共有が無効になっているかどうかを検出する
ケース1とケース2に該当しない場合は、ケース3を検討します。ケース3は、Alexaやスキルに権限の問題はないものの、スキルがデバイスの位置情報を取得できないというケースです。この場合は、ユーザーのデバイスで位置情報の共有が有効になっているかどうか、またはその他の技術的な問題が発生していないかどうかを確認してください。たとえば、ユーザーがトンネル内を運転している場合は、GPSが受信できなくなることがあります。
デバイスの位置情報サービスが有効になっているかどうかを調べるには、context.Geolocation
のlocationServices
オブジェクトを調べます。このオブジェクトが存在する場合、このオブジェクトは、デバイスが位置情報を共有しているかどうかを示すことを目的としています。ただし、ユーザーのデバイスがlocationServices
オブジェクトを提供していない場合は、このオブジェクトを使用できないことがあります。
context.Geolocation.locationServices.access
が"ENABLED"、context.Geolocation.locationServices.status
が"RUNNING"になっている場合、デバイスは位置情報を共有しています。それ以外の状態の場合は、デバイスには位置情報の共有が設定されていません。
位置情報の共有が有効になっているにもかかわらず、スキルがデバイスの位置情報を受信できない場合は、ユーザーに状況を知らせる必要があります。その場合は、次のようなメッセージを使用します。「タクシー予約が、お客様の位置情報にアクセスできません。しばらく待ってから、後でもう一度試してみてください。」
ただし、位置情報の共有が無効になっている場合は、位置情報の共有を有効にするようにスキルからユーザーにリクエストすることができます。その場合は、次のようなメッセージを使用します。「タクシー予約が、お客様の位置情報にアクセスできません。デバイスの設定に移動し、位置情報の共有を有効にして、もう一度お試しください。」
関連リソース
最終更新日: 2023 年 11 月 07 日