Alexa.MediaDetailsNavigator
特定のアイテムの詳細を表示するリクエスト(「ビデオタイトルの詳細を表示して」など)をユーザーが行うと、Alexa.MediaDetailsNavigator
インターフェースはDisplayDetails
ディレクティブをLambdaに送信して、アイテムに関する情報を提供します。MediaDetailsNavigator
インターフェースは、UIController
で説明されているUI状態レポートに基づいています。既にUIController
を実装済みの場合は、MediaDetailsNavigator
も実装すると、これらのシナリオを処理するのに便利です。
MediaDetailsNavigator
インターフェースは、クラウド側の統合のみをサポートしています。- 詳細な説明
- サポート対象の発話
- UI状態レポートの送信
- UI状態レポートの例とスキーマ、ペイロードの定義、データ構造
- DisplayDetailsディレクティブの例
- ペイロードの定義
- UI状態レポートとUIControllerディレクティブの例
- サンプルアプリの統合
詳細な説明
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
インターフェースでサポートされるエンティティタイプは Video
とApp
の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
は、返されるエンティティのタイプによって異なります。前の例では、payload
にVideo
エンティティが含まれています。エンティティタイプがVideo
とApp
の場合、以下のペイロードが返されます。
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
ディレクティブを示す例です。
名前による選択の例
画面には、さまざまなタイトルが表示されています。ユーザーは具体的に名前を指定して、特定のアイテムの詳細を表示します。
ユーザーに表示される画面:
{
"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などの番号)が振られています。ユーザーは、タイトル名の代わりにこの序数を使用してアイテムを識別し、特定のアイテムの詳細を表示します。
ユーザーに表示される画面:
{
"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"
}
}
}
}
「これを選択」の例
この例では、詳細を表示するタイトル(「マーベラス・ミセス・メイゼル」)をユーザーが選択し、アプリ画面にコンテンツの詳細が表示されています。次に、ユーザーは「これを選択して」と話しかけます。 ユーザーが指示対象をタイトル(「マーベラス・ミセス・メイゼル」)から短い略語(「これ」)に変更しているため、この発話パターンは「前方照応」と呼ばれます。どちらの場合も、指示対象は同じアイテムです。
ユーザーに表示される画面:
{
"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.Thing
がMediaDetailsNavigator
でサポートされるアイテムのタイプではないからです。
ユーザーに表示される画面:
{
"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
の統合サンプルは、クラウド側のサンプルアプリで確認できます。サンプルアプリには、MediaDetailsNavigator
のDiscover
ディレクティブを使用して機能のサポートを宣言する方法と、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インターフェースを参照してください。