Amazon Developer

as

Settings
Sign out
Notifications
Alexa
Amazonアプリストア
Ring
AWS
ドキュメント
Support
Contact Us
My Cases
開発
テスト
公開
収益化
ユーザーエンゲージメント
デバイスの仕様
リソース

Alexa.MediaDetailsNavigator(VSK Fire TV)

Alexa.MediaDetailsNavigator(VSK Fire TV)

特定のアイテムの詳細を表示するリクエスト(「ビデオタイトルの詳細を表示して」など)をユーザーが行うと、Alexa.MediaDetailsNavigatorインターフェースはDisplayDetailsディレクティブをLambdaに送信して、アイテムに関する情報を提供します。MediaDetailsNavigatorインターフェースは、UIControllerで説明されているUI状態レポートに基づいています。既にUIControllerを実装済みの場合は、MediaDetailsNavigatorも実装すると、これらのシナリオを処理するのに便利です。

詳細な説明

Alexa.MediaDetailsNavigatorインターフェースは、特定のメディアアイテムに関する詳細情報を提供します。たとえば、ユーザーは「アレクサ、アイアンマンの詳細を表示して」や「アレクサ、3番の詳細を表示して」のように話しかけることができます。 要素にフォーカスがある(選択されている)状態なら、単に「アレクサ、詳細を表示して」と話しかけることもできます。 このリクエストはナビゲーション命令ではないためUIControllerでは処理されず、メディア再生リクエストでもないためSearchAndPlayでも処理されません。むしろ、特定の「エンティティ」に関する詳細のリクエストです。

Alexaの対話では、エンティティは存在するアイテムのタイプを指します。Fire TVに関連する主なエンティティには、Video、Episode、Eventがあります。MediaDetailsNavigatorのサポートを構成するときは、アプリがサポートするエンティティを指定します。この意味的な詳細情報によって、アプリ画面の表示内容のコンテキストでAlexaがユーザーのリクエストを理解しやすくなります。

MediaDetailsNavigatorは、UIControllerで説明されているものと同じUIレポートを活用します。画面に表示されている要素を記載したUI状態レポートが送信されます(画面が変化するたびに更新されます)。ユーザーが画面上のアイテムに関する詳細をリクエストすると、AlexaはLambdaにDisplayDetailsという名前のMediaDetailsNavigatorディレクティブを送信します。このディレクティブには、UI状態に存在する特定の要素の名前と詳細情報が含まれています。

サポート対象の発話

ユーザーが特定のアイテムに関する詳細情報をリクエストすると、AlexaはLambdaにDisplayDetailsディレクティブ(名前空間はMediaDetailsNavigator)を送信します。サンプル発話には次のようなものがあります。

  • 「アレクサ、『ブレイキング・バッド』の詳細を表示して」
  • 「アレクサ、コメディ映画の詳細を表示して」
  • 「アレクサ、『ボッシュ』の詳細を表示して」
  • 「アレクサ、2番の詳細を表示して」
  • 「アレクサ、詳細を表示して」(エンティティにフォーカスがある場合)
  • 「アレクサ、これの詳細を表示して」(エンティティにフォーカスがある場合)

「エンティティにフォーカスがある場合」とは、ユーザーが画面で要素を選択している状態のことです。

次の表は、この発話をさまざまなロケールに対応するように翻訳したものです。

機能 サンプル発話 想定されるレスポンス
[タイトル]の詳細を表示する/見る
省略可能

Show details on interstellar

タイトルに関する詳細情報が表示されます。

機能 サンプル発話 想定されるレスポンス
[タイトル]の詳細を表示する/見る
省略可能

montre les informations sur [VideoName]

*affiche moi plus de détails à propos de [VideoName]

voir plus d'infos sur [VideoName]

タイトルに関する詳細情報が表示されます。

機能 サンプル発話 想定されるレスポンス
[タイトル]の詳細を表示する/見る
省略可能

montre les informations sur [VideoName]

*affiche moi plus de détails à propos de [VideoName]

voir plus d'infos sur [VideoName]

タイトルに関する詳細情報が表示されます。

機能 サンプル発話 想定されるレスポンス
[タイトル]の詳細を表示する/見る
省略可能

zeig mir mehr details über [VideoName] an

details zu [VideoName] sehen

タイトルに関する詳細情報が表示されます。

機能 サンプル発話 想定されるレスポンス
[タイトル]の詳細を表示する/見る
省略可能

interstellar की जानकारी दिखाओ

タイトルに関する詳細情報が表示されます。

機能 サンプル発話 想定されるレスポンス
[タイトル]の詳細を表示する/見る
省略可能

*mostra mi ulteriori informazioni/dettagli su aladdin

*mostra mi / vedi dettagli su aladdin

タイトルに関する詳細情報が表示されます。

機能 サンプル発話 想定されるレスポンス
[タイトル]の詳細を表示する/見る
省略可能

坂道のアポロンの詳細を見せて

タイトルに関する詳細情報が表示されます。

機能 サンプル発話 想定されるレスポンス
[タイトル]の詳細を表示する/見る
省略可能

Procurar/procura/procure por todos Mostrar/mostra/mostre

detalhes Mostrar/mostra/mostredetalhes do [VideoName]

タイトルに関する詳細情報が表示されます。

機能 サンプル発話 想定されるレスポンス
[タイトル]の詳細を表示する/見る
省略可能

muéstra me información de aladín

enséña me información de aladín

ver detalles sobre enséña aladín

ver detalles de aladín

タイトルに関する詳細情報が表示されます。

UI状態レポートの送信

UI状態レポートを送信するには、UIControllerに記載されている手順に従ってください。

VSK対応アプリ

Alexa Client LibraryでMediaDetailsNavigatorのサポートを追加する必要があります。initializeAlexaClientメソッドで、supportedCapabilitiesのリストにgetMediaDetailsNavigatorCapabilityを追加します。

    private void initializeAlexaClient() {
        // AlexaClientManagerの共有インスタンスを取得します。
        final AlexaClientManager clientManager = AlexaClientManager.getSharedInstance();

        // スキルIDを収集します。
        final String alexaSkillId = "<スキルIDを挿入>";

        // スキルでサポートされている機能のリストを作成します。
        final List<AlexaVideoCapability> supportedCapabilities = new ArrayList<>();
        supportedCapabilities.add(getAlexaChannelControllerCapability());
        supportedCapabilities.add(getAlexaPlaybackControllerCapability());
        supportedCapabilities.add(getAlexaRemoteVideoPlayerCapability());
        supportedCapabilities.add(getAlexaSeekControllerCapability());
        supportedCapabilities.add(getAlexaKeypadControllerCapability());
        supportedCapabilities.add(getAlexaUIControllerCapability()); // UIコントローラーのサポートを追加します。
        supportedCapabilities.add(getMediaDetailsNavigatorCapability()); // MediaDetailsNavigatorのサポートを追加します。

        // initialize()を呼び出してAlexa Client Libraryを初期化します。
        clientManager.initializeClient(getApplicationContext(),
                alexaSkillId,
                AlexaClientManager.SKILL_STAGE_DEVELOPMENT,
                supportedCapabilities);
    }

VSK対応デバイス

詳細については、UI状態レポートの送信を参照してください。ただし、手順3 - 検出中にプロパティがプロアクティブに報告されることを指定するで、次のようにMediaDetailsNavigatorのサポートを指定します。

{
    "event": {
        "header": {
            "correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
            "messageId": "93e434b3-74ee-4a87-aad8-317a363ceb6d",
            "name": "Discover.Response",
            "namespace": "Alexa.Discovery",
            "payloadVersion": "3.0"
        },
        "payload": {
            "endpoints": [
                {
                    "capabilities": [
                        {
                            "interface": "Alexa.MediaDetailsNavigator",
                            "type": "AlexaInterface",
                            "version": "3.0",
                            "configurations": {
                                "entityTypes": [
                                    "Video",
                                    "App"
                                ]
                            }
                        }
                    ],
                    "cookie": {
                        "cookie1": "key1",
                        "cookie2": "key2"
                    },
                    "description": "ユーザーに表示されるデバイスの説明",
                    "endpointId": "一意のデバイス識別子",
                    "friendlyName": "上の階のAmazonプレーヤー",
                    "manufacturerName": "Amazon"
                }
            ]
        }
    }
}

MediaDetailsNavigatorのサポートを指定するには、表示されるオブジェクトをcapabilities配列に含めます。これには、entityTypes配列を含むconfigurationsオブジェクトの指定も含まれます。この配列で、アプリがサポートするエンティティのタイプを指定します。Alexaのエンティティタイプは多数ありますが、MediaDetailsNavigatorインターフェースでサポートされるエンティティタイプは VideoAppの2つだけです。

エンティティ 説明
Video ビデオコンテンツの識別データを表します。
App ユーザーが発話で指定した明示的なアプリ名を表します。

UI状態レポートの例とスキーマ、ペイロードの定義、データ構造

送信するUI状態レポートについては、UIControllerドキュメントのUI状態レポートの例とスキーマのセクションに記載されています。同様に、UIControllerドキュメントのペイロードの定義にはUI状態レポートのペイロード定義、データ構造にはUIレポートのデータ構造が記載されています。MediaDetailsNavigatorは、UIControllerで実装済みの機能に基づいています。

DisplayDetailsディレクティブの例

ユーザーが、サポート対象の発話に記載したようなリクエストを行うと、MediaDetailsNavigatorインターフェースはDisplayDetailsという名前のディレクティブをLambdaに送信します。ディレクティブの例を以下に示します。

{
    "directive": {
        "endpoint": {
            "cookie": {},
            "endpointId": "<ターゲットエンドポイントの識別子>",
            "scope": {
                "token": "<OAuth2ベアラートークン>",
                "type": "BearerToken"
            }
        },
        "header": {
            "correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
            "messageId": "9451490f-9457-4197-93be-200f9e37b776",
            "name": "DisplayDetails",
            "namespace": "Alexa.MediaDetailsNavigator",
            "payloadVersion": "3.0"
        },
        "payload": {
            "entity":
                {
                    "externalIds": {
                        "mediaBrowseId": "ref1"
                    },
                    "value": "はじまりへの旅",
                    "type": "Video"
                }
         }
    }
}

ペイロードの定義

DisplayDetailsディレクティブのpayloadは、返されるエンティティのタイプによって異なります。前の例では、payloadVideoエンティティが含まれています。エンティティタイプがVideoAppの場合、以下のペイロードが返されます。

Video

Videoは、ビデオコンテンツの識別データを表します。たとえば、「マンチェスター・バイ・ザ・シー」という映画の場合は、以下のようなフィールドが含まれます。

Videoペイロードのフィールド 説明
externalIds オブジェクト
ASIN このエンティティの外部ASINです。 文字列 B01M3X9T06
└─ gracenote Gracenote IDです。 文字列 MV0000000666661
userConfirmations アイテムのユーザー確認に関する情報を含むオブジェクトです。 オブジェクト
└─ entitlementVoiceActivation 視聴期間または視聴権限の音声有効化に成功したかどうかをパートナーに通知するフラグです。有効な値 - CONFIRMED(省略可能)。 列挙型(デフォルトポリシー:認識されない値は無視) CONFIRMED
uri ビデオへのURIマッピングです。 URI entity://provider/movie/manchesterbythesea
value ビデオの名前です。 文字列 マンチェスター・バイ・ザ・シー

App

Appは、ユーザーが発話で指定した明示的なアプリ名を表します。たとえば、「Amazonプライム・ビデオの『マンチェスター・バイ・ザ・シー』」の場合は、以下のようなフィールドが含まれます。

Appペイロードのフィールド 説明
externalIds オブジェクト
└─ ENTITY_ID アプリのリストに含まれるアプリ識別子です。 文字列 amzn1.alexa-ask-target.app.72095
value アプリの名前です。 文字列 Prime Video

UI状態レポートとUIControllerディレクティブの例

以下は、サンプル画面、送信されるUI状態レポート、ユーザーの発話、AlexaからLambdaに送信されるDisplayDetailsディレクティブを示す例です。

名前による選択の例

画面には、さまざまなタイトルが表示されています。ユーザーは具体的に名前を指定して、特定のアイテムの詳細を表示します。

ユーザーに表示される画面:

例1
{
  "context": {
    "properties": [

    ]
  },
  "event": {
    "header": {
      "messageId": "abc-123-def-456",
      "namespace": "Alexa",
      "name": "ChangeReport",
      "payloadVersion": "3"
    },
    "endpoint": {
      "scope": {
        "type": "AMAZON.BearerToken",
        "token": "access-token-from-Amazon"
      },
      "endpointId": "endpoint-001"
    },
    "payload": {
      "change": {
        "cause": {
          "type": "AMAZON.PHYSICAL_INTERACTION"
        },
        "properties": [
          {
            "namespace": "Alexa.UIController",
            "name": "uiElements",
            "value": {
              "scene": {
                "sceneId": "scene-id-004"
              },
              "elements": [
                {
                  "entity": {
                    "type": "AMAZON.ItemList",
                    "externalIds": {
                      "entityId": "webpage-001"
                    }
                  },
                  "elementId": "elementId-001",
                  "uiSupportedActions": [
                    "SCROLL_DOWN",
                    "SCROLL_FORWARD"
                  ],
                  "elements": [
                    {
                      "entity": {
                        "type": "AMAZON.VideoObject",
                        "name": {
                          "value": "アイアンマン"
                        },
                        "externalIds": {
                          "entityId": "video-001"
                        }
                      },
                      "ordinal": 1,
                      "elementId": "elementId-002",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.VideoObject",
                        "name": {
                          "value": "インターステラー"
                        },
                        "externalIds": {
                          "entityId": "video-002"
                        }
                      },
                      "ordinal": 2,
                      "elementId": "elementId-003",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.VideoObject",
                        "name": {
                          "value": "はじまりへの旅"
                        },
                        "externalIds": {
                          "entityId": "video-003"
                        }
                      },
                      "ordinal": 3,
                      "elementId": "elementId-004",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.VideoObject",
                        "name": {
                          "value": "リベンジャー 復讐のドレス"
                        },
                        "externalIds": {
                          "entityId": "video-004"
                        }
                      },
                      "ordinal": 4,
                      "elementId": "elementId-005",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.VideoObject",
                        "name": {
                          "value": "ガーディアンズ・オブ・ギャラクシー"
                        },
                        "externalIds": {
                          "entityId": "video-005"
                        }
                      },
                      "ordinal": 5,
                      "elementId": "elementId-006",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.VideoObject",
                        "name": {
                          "value": "パッセンジャー"
                        },
                        "externalIds": {
                          "entityId": "video-006"
                        }
                      },
                      "ordinal": 6,
                      "elementId": "elementId-007",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    }
                  ]
                }
              ]
            },
            "timeOfSample": "2017-02-03T16:20:50.52Z",
            "uncertaintyInMilliseconds": 0
          }
        ]
      }
    }
  }
}

ユーザーの発話: 「アレクサ、『はじまりへの旅』の詳細を表示して」

{
    "directive": {
        "endpoint": {
            "cookie": {},
            "endpointId": "<ターゲットエンドポイントの識別子>",
            "scope": {
                "token": "<OAuth2ベアラートークン>",
                "type": "BearerToken"
            }
        },
        "header": {
            "correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
            "messageId": "9451490f-9457-4197-93be-200f9e37b776",
            "name": "DisplayDetails",
            "namespace": "Alexa.MediaDetailsNavigator",
            "payloadVersion": "3.0"
        },
        "payload": {
            "entity":
                {
                    "externalIds": {
                        "mediaBrowseId": "ref1"
                    },
                    "value": "はじまりへの旅",
                    "type": "Video"
                }
         }
    }
}

序数による選択の例

画面に表示されるコンテンツには、異なる序数(位置順を示す1、2、3などの番号)が振られています。ユーザーは、タイトル名の代わりにこの序数を使用してアイテムを識別し、特定のアイテムの詳細を表示します。

ユーザーに表示される画面:

例1 - 序数
{
  "context": {
    "properties": [

    ]
  },
  "event": {
    "header": {
      "messageId": "abc-123-def-456",
      "namespace": "Alexa",
      "name": "ChangeReport",
      "payloadVersion": "3"
    },
    "endpoint": {
      "scope": {
        "type": "AMAZON.BearerToken",
        "token": "access-token-from-Amazon"
      },
      "endpointId": "endpoint-001"
    },
    "payload": {
      "change": {
        "cause": {
          "type": "AMAZON.PHYSICAL_INTERACTION"
        },
        "properties": [
          {
            "namespace": "Alexa.UIController",
            "name": "uiElements",
            "value": {
              "scene": {
                "sceneId": "scene-id-004"
              },
              "elements": [
                {
                  "entity": {
                    "type": "AMAZON.ItemList",
                    "externalIds": {
                      "entityId": "webpage-001"
                    }
                  },
                  "elementId": "elementId-001",
                  "uiSupportedActions": [
                    "SCROLL_DOWN",
                    "SCROLL_FORWARD"
                  ],
                  "elements": [
                    {
                      "entity": {
                        "type": "AMAZON.VideoObject",
                        "name": {
                          "value": "アイアンマン"
                        },
                        "externalIds": {
                          "entityId": "video-001"
                        }
                      },
                      "ordinal": 1,
                      "elementId": "elementId-002",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.VideoObject",
                        "name": {
                          "value": "インターステラー"
                        },
                        "externalIds": {
                          "entityId": "video-002"
                        }
                      },
                      "ordinal": 2,
                      "elementId": "elementId-003",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.VideoObject",
                        "name": {
                          "value": "はじまりへの旅"
                        },
                        "externalIds": {
                          "entityId": "video-003"
                        }
                      },
                      "ordinal": 3,
                      "elementId": "elementId-004",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.VideoObject",
                        "name": {
                          "value": "リベンジャー 復讐のドレス"
                        },
                        "externalIds": {
                          "entityId": "video-004"
                        }
                      },
                      "ordinal": 4,
                      "elementId": "elementId-005",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.VideoObject",
                        "name": {
                          "value": "ガーディアンズ・オブ・ギャラクシー"
                        },
                        "externalIds": {
                          "entityId": "video-005"
                        }
                      },
                      "ordinal": 5,
                      "elementId": "elementId-006",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.VideoObject",
                        "name": {
                          "value": "パッセンジャー"
                        },
                        "externalIds": {
                          "entityId": "video-006"
                        }
                      },
                      "ordinal": 6,
                      "elementId": "elementId-007",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    }
                  ]
                }
              ]
            },
            "timeOfSample": "2017-02-03T16:20:50.52Z",
            "uncertaintyInMilliseconds": 0
          }
        ]
      }
    }
  }
}

ユーザーの発話: 「アレクサ、1番の詳細を表示して」

{
    "directive": {
        "endpoint": {
            "cookie": {},
            "endpointId": "<ターゲットエンドポイントの識別子>",
            "scope": {
                "token": "<OAuth2ベアラートークン>",
                "type": "BearerToken"
            }
        },
        "header": {
            "correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
            "messageId": "9451490f-9457-4197-93be-200f9e37b776",
            "name": "DisplayDetails",
            "namespace": "Alexa.MediaDetailsNavigator",
            "payloadVersion": "3.0"
        },
        "payload": {
            "entities":
                {
                    "externalIds": {
                        "mediaBrowseId": "ref1"
                    },
                    "value": "アイアンマン",
                    "type": "Video"
                }
          }
    }
}

「これを選択」の例

この例では、詳細を表示するタイトル(「マーベラス・ミセス・メイゼル」)をユーザーが選択し、アプリ画面にコンテンツの詳細が表示されています。次に、ユーザーは「これを選択して」と話しかけます。 ユーザーが指示対象をタイトル(「マーベラス・ミセス・メイゼル」)から短い略語(「これ」)に変更しているため、この発話パターンは「前方照応」と呼ばれます。どちらの場合も、指示対象は同じアイテムです。

ユーザーに表示される画面:

例2
{
  "context": {
    "properties": [

    ]
  },
  "event": {
    "header": {
      "messageId": "abc-123-def-456",
      "namespace": "Alexa",
      "name": "ChangeReport",
      "payloadVersion": "3"
    },
    "endpoint": {
      "scope": {
        "type": "AMAZON.BearerToken",
        "token": "access-token-from-Amazon"
      },
      "endpointId": "endpoint-001"
    },
    "payload": {
      "change": {
        "cause": {
          "type": "PHYSICAL_INTERACTION"
        },
        "properties": [
          {
            "namespace": "Alexa.UIController",
            "name": "uiElements",
            "value": {
              "scene": {
                "sceneId": "scene-id-001"
              },
              "elements": [
                {
                  "entity": {
                    "type": "AMAZON.VideoObject",
                    "name": {
                      "value": "マーベラス・ミセス・メイゼル"
                    },
                    "externalIds": {
                      "entityId": "video-001"
                    }
                  },
                  "elementId": "element-010",
                  "uiSupportedActions": [
                    "SELECT"
                  ],
                  "elements": [
                    {
                      "entity": {
                        "type": "AMAZON.Thing",
                        "name": {
                          "value": "プライムで今すぐ観る"
                        },
                        "externalIds": {
                          "entityId": "webPageButton-001"
                        }
                      },
                      "elementId": "element-011",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.Thing",
                        "name": {
                          "value": "シーズンとエピソード"
                        },
                        "externalIds": {
                          "entityId": "webPageButton-002"
                        }
                      },
                      "elementId": "element-012",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.Thing",
                        "name": {
                          "value": "ウォッチリストに追加"
                        },
                        "externalIds": {
                          "entityId": "webPageButton-003"
                        }
                      },
                      "elementId": "element-013",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.Thing",
                        "name": {
                          "value": "その他の視聴方法"
                        },
                        "externalIds": {
                          "entityId": "webPageButton-003"
                        }
                      },
                      "elementId": "element-013",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },                    
                    {
                      "entity": {
                        "type": "AMAZON.Thing",
                        "name": {
                          "value": "この作品をご覧になったお客様は次の作品もご覧になっています"
                        },
                        "externalIds": {
                          "entityId": "webPageButton-004"
                        }
                      },
                      "elementId": "element-014",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                  ]
                }
              ]
            },
            "timeOfSample": "2017-02-03T16:20:50.52Z",
            "uncertaintyInMilliseconds": 0
          },
          {
            "namespace": "Alexa.UIController",
            "name": "focusedUIElement",
            "value": {
              "scene": {
                "sceneId": "scene-id-001"
              },
              "element": {
                "entity": {
                  "type": "AMAZON.Thing",
                  "name": {
                    "value": "プライムで今すぐ観る"
                  },
                  "externalIds": {
                    "entityId": "webPageButton-003"
                  }
                },
                "elementId": "element-013",
                "uiSupportedActions": [
                  "SELECT"
                ]
              }
            },
            "timeOfSample": "2017-02-03T16:20:50.52Z",
            "uncertaintyInMilliseconds": 0
          }
        ]
      }
    }
  }
}

ユーザーの発話: 「アレクサ、これを選択して」

{
    "directive": {
        "endpoint": {
            "cookie": {},
            "endpointId": "<ターゲットエンドポイントの識別子>",
            "scope": {
                "token": "<OAuth2ベアラートークン>",
                "type": "BearerToken"
            }
        },
        "header": {
            "correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
            "messageId": "9451490f-9457-4197-93be-200f9e37b776",
            "name": "DisplayDetails",
            "namespace": "Alexa.MediaDetailsNavigator",
            "payloadVersion": "3"
        },
        "payload": {
            "entity":
                {
                    "externalIds": {
                        "entityId": "video-001"
                    },
                    "value": "マーベラス・ミセス・メイゼル",
                    "type": "Video"
                }

        }
    }
}

AMAZON.Thingアイテムの詳細をリクエストした場合のエラーシナリオ

送信するUI状態レポートでは、画面上の要素をさまざまなエンティティタイプに分類します。詳細については、UIControllerドキュメントのEnum<EntityTypes>を参照してください。ユーザーがAMAZON.Thingに分類される要素の詳細をリクエストした場合、MediaDetailsNavigatorディレクティブは送信されません。これは、AMAZON.ThingMediaDetailsNavigatorでサポートされるアイテムのタイプではないからです。

ユーザーに表示される画面:

例5
{
  "context": {
    "properties": []
  },
  "event": {
    "header": {
      "messageId": "abc-123-def-456",
      "namespace": "Alexa",
      "name": "ChangeReport",
      "payloadVersion": "3"
    },
    "endpoint": {
      "scope": {
        "type": "BearerToken",
        "token": "access-token-from-Amazon"
      },
      "endpointId": "avl-endpoint-id-001"
    },
    "payload": {
      "change": {
        "cause": {
          "type": "PHYSICAL_INTERACTION"
        },
        "properties": [
          {
            "namespace": "Alexa.UIController",
            "name": "uiElements",
            "value": {
              "scene": {
                "sceneId": "scene-id-004"
              },
              "elements": [
                {
                  "entity": {
                    "type": "AMAZON.Thing"
                  },
                  "elementId": "uiNode-000",
                  "uiSupportedActions": [
                    "SCROLL_FORWARD",
                    "SCROLL_DOWN"
                  ],
                  "elements": [
                    {
                      "entity": {
                        "type": "AMAZON.Thing",
                        "name": {
                          "value": "ホーム"
                        }
                      },
                      "elementId": "uiNode-001",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.Thing",
                        "name": {
                          "value": "番組"
                        }
                      },
                      "elementId": "uiNode-002",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.Thing",
                        "name": {
                          "value": "IMDB FREEDIVE:無料の広告付き映画およびTV番組"
                        }
                      },
                      "elementId": "uiNode-010",
                      "uiSupportedActions": []
                    },
                    {
                      "entity": {
                        "type": "AMAZON.Thing",
                        "name": {
                          "value": "はじまりへの旅"
                        }
                      },
                      "elementId": "uiNode-011",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.Thing",
                        "name": {
                          "value": "フリンジ"
                        }
                      },
                      "elementId": "uiNode-012",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.Thing",
                        "name": {
                          "value": "ドライヴ"
                        }
                      },
                      "elementId": "uiNode-013",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.Thing",
                        "name": {
                          "value": "Forte"
                        }
                      },
                      "elementId": "uiNode-014",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                    {
                      "entity": {
                        "type": "AMAZON.Thing",
                        "name": {
                          "value": "パディントン"
                        }
                      },
                      "elementId": "uiNode-015",
                      "uiSupportedActions": [
                        "SELECT"
                      ]
                    },
                  ]
                }
              ]
            },
            "timeOfSample": "2017-02-03T16:20:50.52Z",
            "uncertaintyInMilliseconds": 0
          }
        ]
      }
    }
  }
}

ユーザーの発話: 「アレクサ、『はじまりへの旅』を選択して」

フォーカスのあるUI要素のタイプがAMAZON.Thingであり、このエンティティタイプでは「詳細の表示」がサポートされていないため、ディレクティブは送信されません。このことを示すメッセージがユーザーに送信されます。

サンプルアプリの統合

MediaDetailsNavigatorの統合サンプルは、クラウド側のサンプルアプリで確認できます。サンプルアプリには、MediaDetailsNavigatorDiscoverディレクティブを使用して機能のサポートを宣言する方法と、MediaDetailsNavigatorから送信されるDisplayDetailsディレクティブを処理する方法を示すLambdaコードが含まれています。

以下のセクションでは、サンプルアプリでのDisplayDetailsディレクティブのユースケースを詳しく説明します。サンプルアプリをテストするためにクラスやメソッドを実装する必要はありません。以下のコードスニペットは、必要なメソッドの実装場所と使用方法を示しています。実際のアプリコードでは、独自のロジックを使用する必要があります。

サンプルアプリでテストするには、任意の画面のUIコンテンツを変更し、Alexaで新しいUIコンテンツを音声ターゲットとしてテストします。

DisplayDetailsディレクティブ

サンプルアプリは、Lambda経由でAlexaからディレクティブを受信します。このディレクティブは、onMessageメソッドではDisplayDetailsと呼ばれます。

protected void onMessage(final Intent intent) {
    Log.d(TAG, MessageFormat.format("ADMからメッセージを受信しました: {0}", intent.toString()));
    
    //...
    else if ("DisplayDetails".equals(directiveName)) {

                // jsonオブジェクトをチェックします。
                if (!jsonTree.isJsonObject()) {
                    // 無効なメッセージJSONです。
                    Log.e(TAG, "無効なメッセージJSONです");
                    return;
                }

                // 基になるディレクティブとペイロードを抽出します。
                final JsonObject jsonObject = jsonTree.getAsJsonObject();

                final JsonObject jDirective = jsonObject.get("directive").getAsJsonObject();
                final JsonElement jPayload = jDirective.get("payload");

                // ペイロードをチェックします。
                if (jPayload == null || !jPayload.isJsonObject()) {
                    // 無効なペイロードです。
                    Log.e(TAG, "無効なペイロードです。ペイロードがnullであるか、JsonObjectではありません");
                    return;
                }

                final String jPayloadString = jPayload.getAsJsonObject().toString();

                final MediaDetailsElement mediaDetailsElement = gson.fromJson(jPayloadString, MediaDetailsElement.class);
                Log.d(TAG, "MediaDetailsNavigatorディレクティブは" + mediaDetailsElement + "です");

                // ディレクティブを検証します。
                if (!isMediaDetailsElementValid(mediaDetailsElement)) {
                    Log.e(TAG, "受信したMediaDetailsElementディレクティブが無効なため、処理できません");
                    return;
                }

                final Intent mediaDetailsIntent = new Intent();
                final String currentSceneId = getCurrentSceneId();
                final String packageName = FireTVApp.getInstance().getPackageName();
                if (HOME_BROWSER_SCENE_IDENTIFIER.equals(currentSceneId)) {
                    Log.d(TAG, MessageFormat.format("mediaDetailsElementインテントの対象をホーム画面に設定しています: {0}",
                            MainActivity.class.getName()));
                    mediaDetailsIntent.setClassName(packageName, MainActivity.class.getName());
                } else if (VIDEO_DETAIL_SCENE_IDENTIFIER.equals(currentSceneId)) {
                    Log.d(TAG, MessageFormat.format("mediaDetailsElementインテントの対象を詳細画面に設定します: {0}",
                            DetailsActivity.class.getName()));
                    mediaDetailsIntent.setClassName(packageName, DetailsActivity.class.getName());
                } else {
                    Log.w(TAG, MessageFormat.format("現在の画面には詳細を表示するアイテムがありません。現在のシーン: {0}", currentSceneId));
                    return;
                }

                mediaDetailsIntent.setAction(ACTION_ON_MEDIA_DETAILS);
                mediaDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

                // エンティティからインテントにエントリを追加します。
                mediaDetailsIntent.putExtra(EXTRA_MEDIA_DETAILS_NAVIGATOR_TYPE, mediaDetailsElement.getEntity().getType());
                mediaDetailsIntent.putExtra(EXTRA_MEDIA_DETAILS_NAVIGATOR_VALUE, mediaDetailsElement.getEntity().getValue());
                final ExternalIds externalIds = mediaDetailsElement.getEntity().getExternalIds();
                if (externalIds != null) {
                    Log.d(TAG, MessageFormat.format("externalIdsが存在します: {0}", externalIds));
                    mediaDetailsIntent.putExtra(EXTRA_MEDIA_DETAILS_NAVIGATOR_ENTITY_ID, externalIds.getEntityId());
                }

                Log.d(TAG, MessageFormat.format("mediaDetailsElementインテントを送信しています: {0}", mediaDetailsIntent));
                FireTVApp.getInstance().startActivity(mediaDetailsIntent);
                Log.d(TAG, "DisplayDetailsディレクティブの処理が完了しました");
            } else {
                Log.e(TAG, "不明なディレクティブを受信しました");
            }
        }
    }

サンプルアプリの構成の詳細については、Alexa.UIControllerインターフェース(VSK Fire TV)を参照してください。


Last updated: 2021年10月13日