Alexa.Presentation.APLインターフェースのリファレンス
Alexa.Presentation.APL
インターフェースは、Echo Showなどの画面付きデバイスでコンテンツを表示するディレクティブとリクエストを提供します。
supportedInterfacesのAlexa.Presentation.APL
ユーザーのデバイスにAPL対応の画面がある場合は、context.System.device.supportedInterfaces
オブジェクトに[Alexa.Presentation.APL]
が含まれています。
Alexa.Presentation.APL
ディレクティブを返す前に、必ずsupportedInterfaces
を確認してください。ASK SDKでこの確認を行う例は、ASK SDK v2でのAlexa Presentation Languageの使用で、ユーザーのデバイスがAPLに対応していることを確認するを参照してください。
利用可能なextensions
Extensionsは、追加のAPL機能を提供するオプションの拡張機能です。一部のextensionsは、スキルマニフェストでextensionを宣言する必要があります。ユーザーのデバイスがこれらのextensionをサポートしている場合、context
オブジェクトにはExtensions.available
プロパティが含まれます。このプロパティには、使用可能なextensionのURIが各項目のキーに指定されたマップが含まれます。
次の例は、Smart MotionとEntity Sensingをサポートするデバイスからのリクエストを示しています。
{
"version": "1.0",
"session": {},
"context": {
"AudioPlayer": {
"playerActivity": "IDLE"
},
"Viewports": [
{
"type": "APL",
"id": "<string>"
}
],
"Extensions": {
"available": {
"alexaext:smartmotion:10": {},
"alexaext:entitysensing:10": {}
}
}
}
}
context.Extensions
プロパティには、次の条件の両方を満たすエクステンションが含まれます。
-
スキルマニフェストの
requestedExtensions
プロパティでリクエストされていること。マニフェストでextensionをリクエストする方法の詳細については、スキルマニフェストでextensionをリクエストするを参照してください。
-
extensionがこのデバイスでサポートされていること。
マニフェストに含めることができるのは一部のextensionです。要件を確認するには使用する各extensionのトピックを参照してください。
ディレクティブ
RenderDocumentディレクティブ
指定されたdocument
に含まれているAPLコンテンツを表示するようデバイスに命令します。オプションで、1つまたは複数のdatasources
を指定してコンテンツをドキュメントにバインドすることもできます。
次のRenderDocument
の例では、2つのText
コンポーネントとhelloworldData
というデータソースを含むドキュメントを送信します。
{
"type": "Alexa.Presentation.APL.RenderDocument",
"token": "helloworldToken",
"document": {
"type": "APL",
"version": "1.9",
"mainTemplate": {
"parameters": [
"payload"
],
"items": [
{
"type": "Container",
"height": "100%",
"width": "100%",
"items": [
{
"type": "Text",
"id": "helloTextComponent",
"text": "${payload.helloworldData.properties.helloText}",
"textAlign": "center",
"textAlignVertical": "center",
"maxLines": 3,
"grow": 1
},
{
"type": "Text",
"id": "newHelloTextComponent",
"text": "${payload.helloworldData.properties.newHelloText}",
"textAlign": "center",
"textAlignVertical": "bottom",
"maxLines": 3,
"opacity": 0
}
]
}
]
}
},
"datasources": {
"helloworldData": {
"type": "object",
"objectId": "helloworld",
"properties": {
"helloText": "ハローワールド。 このAPLドキュメントは、helloworldDataというデータソースのテキストを表示します。",
"newHelloText": "元のハローテキストを非表示にして、これを表示しました。"
}
}
}
}
オーサリングツールでスキルとともにドキュメントを保存し、RenderDocument
ディレクティブにリンクすることもできます。次の例では、"hello world"ドキュメントが"helloworld-by-link"という名前で保存されていることを前提としています。
{
"directives": [
{
"type": "Alexa.Presentation.APL.RenderDocument",
"token": "helloworldToken",
"document": {
"src": "doc://alexa/apl/documents/helloworld-by-link",
"type": "Link"
},
"datasources": {
"helloworldData": {
"type": "object",
"objectId": "helloworld",
"properties": {
"helloText": "ハローワールド。 このAPLドキュメントは、helloworldDataというデータソースのテキストを表示します。",
"newHelloText": "元のハローテキストを非表示にして、これを表示しました。"
}
}
}
}
]
}
RenderDocumentのプロパティ
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
|
文字列 |
◯ |
|
|
文字列 |
◯ |
ドキュメントを指定する文字列です。ドキュメントを参照する後続のディレクティブを発行するために使用します。たとえば、 |
|
オブジェクト |
◯ |
デバイスに送信するAPLドキュメントを表すオブジェクトです。 |
|
次のいずれかになります: |
〇 |
送信するドキュメントの種類を示します。 |
|
URL |
|
オーサリングツールでドキュメントを識別するURLです。APLの場合、リンクの構文は |
|
追加ドキュメントのマップ、またはドキュメントへの参照 |
✕ |
名前が付けられたAPLAドキュメントまたはリンクを含むオブジェクトです。これらのドキュメントは、aplAudioToSpeechトランスフォーマーのtemplateパラメーターで参照できます。 |
|
データソースオブジェクトのマップ |
✕ |
APLドキュメントにデータをバインドするために、ほかのオブジェクトを含むことができるオブジェクトです。 |
document
プロパティには、ドキュメントのURLが設定されたsrc
プロパティか、ドキュメント全体のJSONが常に含まれている必要があります。
ASK SDK v2でRenderDocument
を送信する方法の例は、ASK SDK v2でのAlexa Presentation Languageの使用ページのリクエストハンドラーの応答でRenderDocumentを返すを参照してください。
オーサリングツールに保存されたAPLドキュメントへのリンク
オーサリングツールでAPLドキュメントを保存すると、RenderDocument
ディレクティブでそのドキュメントをリンクすることができます。つまり、APLドキュメントのJSONをエクスポートしてコードにコピーする必要はありません。
オーサリングツールのドキュメントへリンクするには、次の構文を記述します。
doc://alexa/apl/documents/<document-name>
<document-name>
は、オーサリングツールでドキュメントを保存するときに使用した名前です。
RenderDocument
ディレクティブで使用できるようにするには、開発者コンソールで対話モデルをビルドします。オーサリングツールでドキュメントを変更した場合は、対話モデルを再ビルドすることで、更新されたドキュメントをRenderDocument
で使用できるようになります。オーサリングツールでのドキュメントのビルドと保存の詳細については、オーサリングツールを使用したAPLドキュメントの作成を参照してください。
RenderDocumentとその他のスキルディレクティブ
- 応答では、
RenderDocument
と、Dialog.Delegate
を除く任意のDialog
ディレクティブを組み合わせることができます。たとえば、Dialog.ElicitSlot
を使用して、ユーザーにスロット値の入力を求め、同時にRenderDocument
でそのスロットに関連する情報を画面に表示できます。 - 応答では、
RenderDocument
と次のインターフェースのディレクティブを組み合わせることはできません。AudioPlayer
Display
VideoApp
ExecuteCommandsディレクティブ
token
によって識別され、現在レンダリングされているドキュメントに対して、指定したcommands
を実行するようにデバイスに指示します。
次の例では、helloworldToken
トークンで識別されたドキュメントに対して動作するExecuteCommands
ディレクティブを送信します。このディレクティブには、次の2つのコマンドがあります。
- 1番目の
AnimateItem
コマンドは、helloTextComponent
コンポーネントの不透明度を3秒間で0に変更して、ビューからフェードアウトさせます。 - 2番目の
AnimateItem
コマンドは、newHelloTextComponent
コンポーネントの不透明度を3秒間で0から1に変更して、ビューにフェードインさせます。
{
"type": "Alexa.Presentation.APL.ExecuteCommands",
"token": "helloworldToken",
"commands": [
{
"type": "AnimateItem",
"componentId": "helloTextComponent",
"duration": "3000",
"easing": "linear",
"value": [
{
"property": "opacity",
"to": "0.0"
}
]
},
{
"type": "AnimateItem",
"componentId": "newHelloTextComponent",
"duration": "3000",
"easing": "linear",
"value": [
{
"property": "opacity",
"to": "1.0"
}
]
}
]
}
ExecuteCommandsプロパティ
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
|
文字列 |
◯ |
|
|
文字列 |
◯ |
これらのコマンドの対象となるドキュメントを表示するための |
|
コマンド配列 |
◯ |
トークンによって識別され、レンダリングされたドキュメントで実行されるコマンドです。このコマンド配列は、暗黙的なSequentialコマンドのように動作します。つまり、コマンドは並列ではなく、順番に実行されます。 |
ExecuteCommands
ディレクティブは、token
で識別された特定のドキュメントに対して、コマンドを実行します。ExecuteCommands
ディレクティブで指定するtoken
は、対象となるドキュメントを送信したRenderDocument
ディレクティブで指定したtoken
と一致する必要があります。
RenderDocument
ディレクティブとExecuteCommands
ディレクティブは、同じスキルの応答で送信することも、別の応答で送信することもできます。
- 1つの応答に両方のディレクティブが含まれている場合、両方のディレクティブで
token
が一致すれば、デバイスは指定されたドキュメントを表示した後に、コマンドを実行します。 -
ExecuteCommands
を別の応答で返すと、デバイスは現在viewportに表示されているドキュメントに対して、コマンドを実行します。token
は、これより前にRenderDocument
ディレクティブで使用したtoken
と一致する必要があります。このシナリオで
ExecuteCommands
を送信する前に、リクエストの視覚的なコンテキストを確認して、ドキュメントが現在表示されていることを確認します。リクエストのcontext.["Alexa.Presentation.APL"].token
プロパティから、現在表示されているドキュメントのtoken
を取得できます。
いずれの場合も、token
の値がディレクティブ間で一致しなければ、コマンドは実行されません。
以下のリクエストの例では、viewportがhelloworldWithButtonToken
トークンを持つドキュメントを表示していることを示しています(説明を簡潔にするために、このリクエストの一部は省略されています)。
{
"version": "1.0",
"session": {},
"context": {
"Alexa.Presentation.APL": {
"token": "helloworldWithButtonToken",
"version": "APL_WEB_RENDERER_GANDALF",
"componentsVisibleOnScreen": [
{
"uid": ":1000",
"position": "1024x600+0+0:0",
"type": "text",
"tags": {
"viewport": {}
},
"children": [
{
"id": "fadeHelloTextButton",
"uid": ":1002",
"position": "270x70+377+450:0",
"type": "text",
"tags": {
"focused": false,
"clickable": true
},
"entities": []
}
],
"entities": []
}
]
},
"System": {},
"Viewport": {},
"Viewports": []
},
"request": {}
}
このプロパティを確認して、ASK SDKでExecuteCommands
を返す方法の例は、ASK SDK v2でのAlexa Presentation Languageの使用ページのリクエストハンドラーの応答でExecuteCommandsを返すを参照してください。
ExecuteCommandsとその他のスキルディレクティブ
応答では、ExecuteCommands
と次のインターフェースのディレクティブを組み合わせることはできません。
AudioPlayer
Dialog
Display
VideoApp
SendIndexListDataディレクティブ
LoadIndexListData
リクエストに応答して、表示する一連の新しいリスト項目を送信します。dynamicIndexListデータソースを次に表示する項目に含めます。応答にoutputSpeech
またはshouldEndSession
を含めないでください。
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
|
ディレクティブ |
◯ |
|
|
文字列 |
◯( |
|
|
文字列 |
◯ |
この応答で更新するリストの識別子です。 |
整数 |
✕ |
更新後のリストの新しいバージョン番号で、スキルとデバイス間のリストの一貫性を維持するために使用されます。 | |
|
整数 |
◯ |
項目の配列の最初の要素のインデックスです。 |
|
文字列 |
✕ |
配列の最初の項目のインデックスです。値を入力すると、前の操作で指定された値がこの値に置き換えられます。このプロパティを指定しないと、最小インデックスが不明となり、ユーザーが逆方向にスクロールすると、Alexaはより多くの項目をリクエストし続けます(リストは逆方向スクロールリストです)。返された最初の項目のインデックスと等しくなると、それ以上逆方向にスクロールすることはできず、Alexaは項目のリクエストを停止します。 |
|
文字列 |
✕ |
配列の最後の有効なインデックスに1を加えたものです。値を入力すると、前の操作で指定された値がこの値に置き換えられます。このプロパティを指定しないと、最大インデックスが不明となり、ユーザーが正方向にスクロールすると、Alexaはより多くの項目をリクエストし続けます(リストは正方向スクロールリストです)。このプロパティが、返された最後の項目のインデックスよりも1多くなると、それ以上正方向にスクロールすることはできず、Alexaは項目のリクエストを停止します。 |
|
配列 |
✕ |
リストに追加するオブジェクトの配列です。 |
{
"directives": [
{
"type": "Alexa.Presentation.APL.SendIndexListData",
"correlationToken": "alexa-provided-correlation-token",
"listId": "my-list-id",
"listVersion": 3,
"startIndex": 11,
"minimumInclusiveIndex": 11,
"maximumExclusiveIndex": 21,
"items": [
{"primaryText":"item 11"},
{"primaryText":"item 12"},
{"primaryText":"item 13"},
{"primaryText":"item 14"},
{"primaryText":"item 15"},
{"primaryText":"item 16"},
{"primaryText":"item 17"},
{"primaryText":"item 18"},
{"primaryText":"item 19"},
{"primaryText":"item 20"}
]
}
]
}
プロアクティブな読み込み
スキルがLoadIndexListData
リクエストに応答する場合は、 correlationToken
を指定する必要があります。想定されるcorrelationToken
がSendIndexListData
ディレクティブで指定されていない場合、Alexaはスキルの応答を拒否します。
LoadIndexListData
リクエストへの応答以外で、一連のリスト項目を送信する場合は、correlationToken
を省略します。
SendTokenListDataディレクティブ
LoadTokenListData
リクエストに応答して、表示するリスト項目の新しいページを送信します。dynamicTokenListデータソースを次に表示する項目ページに含めます。応答にoutputSpeech
またはshouldEndSession
を含めないでください。
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
|
ディレクティブ |
〇 |
"Alexa.Presentation.APL.SendTokenListData"に設定します。 |
|
文字列 |
✕ |
|
|
文字列 |
◯ |
この応答に含まれる項目のリストを識別するIDです。 |
|
文字列 |
◯ |
この応答に含まれる項目の配列のopaqueトークンです。 |
|
文字列 |
✕ |
リクエストされた |
|
配列 |
✕ |
リストに追加するオブジェクトの配列です。 |
{
"directives": [
{
"type": "Alexa.Presentation.APL.SendTokenListData",
"token": "developer-provided-token",
"correlationToken": "alexa-provided-correlation-token",
"listId": "my-list-id",
"pageToken": "myListPage2",
"nextPageToken" "myListPage3"
"items": [
{"primaryText":"item 11"},
{"primaryText":"item 12"},
{"primaryText":"item 13"},
{"primaryText":"item 14"},
{"primaryText":"item 15"},
{"primaryText":"item 16"},
{"primaryText":"item 17"},
{"primaryText":"item 18"},
{"primaryText":"item 19"},
{"primaryText":"item 20"}
]
}
]
}
プロアクティブな読み込み
スキルがLoadTokenListData
リクエストに応答する場合は、correlationToken
を指定する必要があります。想定されるcorrelationToken
がSendTokenListData
ディレクティブで指定されていない場合、Alexaはスキルの応答を拒否します。
LoadTokenListData
リクエストへの応答以外で、一連のリスト項目を送信する場合は、correlationToken
を省略します。
UpdateIndexListDataディレクティブ
RenderDocument
ディレクティブで、デバイスに既に送信されたデータソースにリスト項目を挿入、設定、削除するには、一連のデータの操作をAlexaに送信します。1つのディレクティブに複数の変更を含めることができます。
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
|
ディレクティブ |
◯ |
|
|
文字列 |
◯ |
Alexaに送信される |
|
文字列 |
◯ |
この応答で更新するリストの識別子です。 |
整数 |
◯ |
更新後のリストの新しいバージョンです。スキルとAlexaの間でリストの一貫性を維持するために使用されます。 | |
配列 |
◯ |
リストに適用する各操作を配列順に並べたものです。Alexaは、配列の次の操作を処理する前に、各項目を完全に適用します。1つの操作を完全に適用すると、変更が行われ、前後の項目のインデックス位置が更新されます。操作の処理中に障害が発生した場合、Alexaは配列内の以降の操作を破棄し、またターゲットデータソースの項目を更新しようとする後続のディレクティブも破棄します。 |
{
"directives": [
{
"type": "Alexa.Presentation.APL.UpdateIndexListData",
"token": "developer-provided-token",
"listId": "my-list-id",
"listVersion": 3,
"operations": [
{
"type": "InsertItem",
"index": 10,
"item": {
"primaryText": "項目10の前に挿入された、新しい項目9.5"
}
},
{
"type": "InsertMultipleItems",
"index": 12,
"items": [
{"primaryText":"項目12の前に挿入された、3つの新しい項目の1番目"},
{"primaryText":"3つの項目の2番目"},
{"primaryText":"3つの項目の3番目"}
]
},
{
"type": "SetItem",
"index": 14,
"item": {"primaryText":"項目14の置換テキスト"}
},
{
"type": "DeleteItem",
"index": 16
},
{
"type": "DeleteMultipleItems",
"index": 17,
"count": 2
}
]
}
]
}
listVersion
更新後のリストの新しいバージョンです。スキルとAlexaの間でリストの一貫性を維持するために使用されます。Alexaは、すべてのリストがバージョン0から始まると仮定しているため、特定のリストに対して発行された最初のUpdateIndexListData
ディレクティブはlistIndex
を1に設定します。Alexaは、指定されていないディレクティブまたは中間ディレクティブが受信されて処理されるまで、順不同のlistVersion
を指定するUpdateIndexListData
ディレクティブをすべてバッファーします。
このフィールドはUpdateIndexListData
では必須ですが、SendIndexListData
では任意となる場合があります。
- リストの更新情報を挿入、設定、削除しない場合、この値を入力する必要はありません。
- リストに対して挿入、設定、削除操作を実行するときは、すべての
SendIndexListData
ディレクティブに対してこの値を入力する必要があります。
したがって、特定のリストについては、Alexaは以下を破棄します。
listVersion
を指定していないSendIndexListData
ディレクティブの後に受信された、すべてのUpdateIndexListData
ディレクティブUpdateIndexListData
ディレクティブの受信後にlistVersionを指定しない、すべてのSendIndexListData
ディレクティブ
operations
考えられる更新操作の列挙値です。
InsertItem
指定されたindex
のデータソースに1つのitem
を挿入します。
リストの範囲内に項目を挿入したり、リストの末尾に項目を追加したりできます。隣接していないインデックスに項目を挿入しようとすると、エラーが発生します。たとえば、現在のインデックスの範囲がM~Nの場合、M~N+1の範囲に項目を挿入できます。
フィールド | 型 | 必須 | 説明 |
---|---|---|---|
|
整数 |
◯ |
既存のリストに項目を挿入するインデックスです。挿入するインデックスと同じ、またはそれ以上のインデックスの既存のリスト項目はすべて、インデックスが1つずつ増加します。定義されている場合、データソースの |
|
オブジェクト |
◯ |
指定されたリストのインデックスに含める項目データです。 |
たとえば、元のデータソースには項目が10個あり、そのインデックスが0~9だったとします。index
が5に設定されたInsertItem
操作では、次の処理が実行されます。
- 位置5に新しい
item
を挿入します。 - 既存の項目5~9の
index
を6~10に更新します。元の項目5は6になり、元の項目6は7になり、以下同様です。 - データソースの
maximumExclusiveIndex
プロパティを10から11に更新します。
InsertMultipleItems
指定されたindex
にitems
の配列を挿入します。
リストの範囲内に項目を挿入したり、リストの末尾に項目を追加したりできます。隣接していないインデックスに項目を挿入しようとすると、エラーが発生します。たとえば、現在のインデックスの範囲がM~Nの場合、M~N+1の範囲に項目を挿入できます。
フィールド | 型 | 必須 | 説明 |
---|---|---|---|
|
整数 |
◯ |
既存のリストに、指定された項目の最初の項目を挿入するインデックスです。残りの項目は、順次増加するインデックスで挿入されます。挿入するインデックスと同じ、またはそれ以上のインデックスの既存のリスト項目はすべて、インデックスが |
|
配列 |
◯ |
指定されたリストのインデックスに含める項目データの配列です。 |
たとえば、元のデータソースには項目が10個あり、そのインデックスが0~9だったとします。index
が5に設定され、items
で2つの新しい項目が指定されているInsertMultipleItem
操作では、次の処理が実行されます。
- 位置5と6に2つの新しい項目を挿入します。
- 元の項目5~9の
index
に2を加算します。元の項目5は7になり、元の項目6は8になり、以下同様です。 - データソースの
maximumExclusiveIndex
プロパティを10から12に更新します。
SetItem
指定されたindex
の項目を指定されたitem
に置き換えます。
フィールド | 型 | 必須 | 説明 |
---|---|---|---|
|
整数 |
◯ |
既存のリストで置換する項目のインデックスです。リスト内の他のすべての項目の定義とインデックスは変更されません。値が入力されていないインデックスの項目を設定しようとすると、エラーが発生します。 |
|
オブジェクト |
◯ |
指定されたリストのインデックスの新しい項目データです。 |
たとえば、元のデータソースには項目が10個あり、そのインデックスが0~9だったとします。index
が5に設定されたSetItem
操作では、次の処理が実行されます。
- 位置5の既存の項目を新しい
item
に置き換えます。
DeleteItem
指定されたindex
の項目を削除します。
フィールド | 型 | 必須 | 説明 |
---|---|---|---|
|
整数 |
◯ |
既存のリストから削除する項目のインデックスです。削除する |
たとえば、元のデータソースには項目が10個あり、そのインデックスが0~9だったとします。index
が5に設定されたDeleteItem
操作では、次の処理が実行されます。
- 位置5の既存の項目を削除します。
- 既存の項目6~9の
index
を5~8に更新します。元の項目6は5になり、元の項目7は6になり、以下同様です。 - データソースの
maximumExclusiveIndex
プロパティを10から9に更新します。
DeleteMultipleItems
指定されたindex
を開始点として、データソースから指定されたcount
の項目を削除します。
フィールド | 型 | 必須 | 説明 |
---|---|---|---|
|
整数 |
◯ |
既存のリストで削除する最初の項目のインデックスです。残りの項目は、順次増加するインデックスで削除されます。削除されたインデックスよりも大きいインデックスの既存のリスト項目はすべて、インデックスが |
|
整数 |
◯ |
順次増加するインデックスで削除する項目の数です。 |
たとえば、元のデータソースには項目が10個あり、そのインデックスが0~9だったとします。index
が5に設定され、count
が2に設定されたDeleteMultipleItems
操作では、次の処理が実行されます。
- 位置5と6の元の項目を削除します。
- 元の項目7~9の
index
から2を引きます。元の項目7の新しいインデックスは5になり、元の項目8は項目6になり、元の項目9は7になります。 - データソースの
maximumExclusiveIndex
プロパティを10から8に更新します。
リクエスト
LoadIndexListDataリクエスト
AlexaはスキルにLoadIndexListData
リクエストを送信して、dynamicIndexListデータソースについて、より多くのリスト項目をリクエストします。たとえば、以前に読み込まれた項目の最後のほうまでユーザーがスクロールすると、スキルがこのリクエストを受け取ります。
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
|
文字列 |
◯ |
|
|
文字列 |
◯ |
Alexaに送信されるRenderDocumentディレクティブで指定されたプレゼンテーショントークンです。 |
|
文字列 |
◯ |
リクエストと対応する応答ディレクティブを関連付けるために使用される、Alexaが生成した識別子です。 |
|
文字列 |
◯ |
項目を取得するリストの識別子です。 |
|
文字列 |
◯ |
取得する項目の最も小さいインデックス(当該値を含む)です。 |
|
整数 |
◯ |
取得する項目の数です。 |
{
"request": {
"type": "Alexa.Presentation.APL.LoadIndexListData",
"requestId": "amzn1.echo-api.request.1",
"timestamp": "2020-03-12T19:47:02Z",
"locale": "ja-JP",
"token": "developer-provided-token",
"correlationToken": "101",
"listId": "my-list-id",
"startIndex": 20,
"count": 10
}
}
有効な応答
LoadIndexListData
リクエストには、SendIndexListData
ディレクティブを使用して応答できます。
LoadTokenListDataリクエスト
AlexaはスキルにLoadTokenListData
リクエストを送信して、dynamicTokenList
データソースについて、項目の次のページをリクエストします。たとえば、以前に読み込まれた項目の最後近くまでユーザーがスクロールすると、スキルがこのリクエストを受け取ります。
type
|
文字列 | ◯ | Alexa.Presentation.APL.LoadTokenListData に設定
|
---|---|---|---|
|
文字列 |
◯ |
Alexaに送信される |
|
文字列 |
◯ |
リクエストと対応する応答ディレクティブを関連付けるために使用される、Alexaが生成した識別子です。 |
|
文字列 |
◯ |
項目を取得するリストの識別子です。 |
|
文字列 |
◯ |
取得する項目に関連付けられたトークンです。 |
{
"request": {
"type": "Alexa.Presentation.APL.LoadTokenListData",
"requestId": "amzn1.echo-api.request.1",
"timestamp": "2021-03-12T19:47:02Z",
"locale": "ja-JP",
"token": "developer-provided-token",
"correlationToken": "101",
"listId": "my-list-id",
"pageToken": "myListPage2"
}
}
有効な応答
LoadTokenListData
リクエストには、SendTokenListData
ディレクティブを使用して応答できます。
RuntimeErrorリクエスト
APL処理中に発生したエラーをスキルに通知するために送信されます。このリクエストは通知専用です。スキルはRuntimeError
リクエストに応答を返すことができません。
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
|
文字列 |
◯ |
|
|
文字列 |
✕ |
Alexaに送信されるRenderDocumentディレクティブで指定されたプレゼンテーショントークンです。 |
配列 |
◯ |
報告されたエラーの配列です。 |
{
"type": "Alexa.Presentation.APL.RuntimeError",
"token": "developer-provided-token",
"errors": [
{
"type": "LIST_ERROR",
"reason": "LIST_INDEX_OUT_OF_RANGE",
"listId": "my-list-id",
"listVersion": 3,
"operationIndex": 3,
"message": ""
}
]
}
errors
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
文字列 |
◯ |
ポリモーフィズムなエラータイプのインジケータ―です。 | |
文字列 |
◯ |
発生したエラーの理由を説明します。 | |
|
文字列 |
◯ |
人が読める形式でのエラーの説明です。 |
type
ポリモーフィズムなエラータイプのインジケータ―です。各エラータイプにはタイプ固有のパラメーターを指定できます。
プロパティ | 説明 |
---|---|
|
dynamicIndexListデータソースの処理に関連するエラーです。 |
reason
エラータイプ別の失敗の理由です。任意のタイプで使用できる一般的な値は次のとおりです。
- INTERNAL_ERROR – Alexaサービスの予期しない問題です。
LIST_ERROR
考えられる理由については、 エラーの例を参照してください。
フィールド | 型 | 必須 | 説明 |
---|---|---|---|
|
文字列 |
◯ |
エラーが発生したリストの識別子が含まれます。 |
|
文字列 |
✕ |
エラーが発生した更新によって指定されたlistVersionが含まれます(既知の場合)。 |
|
整数 |
✕ |
エラーが発生した操作のインデックスが含まれます(既知の場合)。 |
UserEventリクエスト
デバイス上のイベントがSendEvent
コマンドをトリガーすると、AlexaはスキルにAlexa.Presentation.APL.UserEvent
リクエストを送信します。これにより、デバイスでのユーザーの操作への応答として、スキルサービスがメッセージを受信します。ドキュメント内のコンポーネントでイベントハンドラーを使用すると、SendEvent
をトリガーできます。たとえば、TouchWrapper
コンポーネントには、onPress
イベントハンドラーが含まれているとします。このハンドラーをSendEvent
コマンドに設定すると、ユーザーがviewport上のコンポーネントをタッチしたときにUserEvent
リクエストを取得できます。
UserEvent
リクエストには、SendEvent
コマンドをトリガーしたコンポーネントとイベントに関する情報が含まれています。コンポーネントのイベントハンドラーでSendEvent
を定義する場合、対応するUserEvent
リクエストで取得する情報を指定できます。コード内のイベントハンドラーで、これを使用します。
UserEventプロパティ
プロパティ | 型 | 説明 |
---|---|---|
|
文字列 |
常に |
|
文字列 |
この |
|
値の配列 |
このリクエストをトリガーした |
|
オブジェクト |
このイベントの発生元であるAPLコンポーネントとイベントハンドラー(ある場合)の情報です。 |
|
オブジェクト |
このリクエストをトリガーした |
次の例は、ユーザーがSequence
コンポーネントによってレンダリングされたTouchWrapper
コンポーネントのいずれかをタッチするか、リモコンのdパッドで押したときに、スキルにイベントを送信するAPLドキュメントの一部を示しています。
{
"type": "Sequence",
"id": "myCustomSequence",
"height": "100vh",
"data": "${payload.templateData.properties.animalList}",
"numbered": true,
"item": {
"type": "TouchWrapper",
"id": "animalListTouchWrapper",
"item": {
"type": "Text",
"text": "${data.textToShow}"
},
"onPress": [
{
"type": "SendEvent",
"arguments": [
"listItemPressed",
"${ordinal}",
"${data.dataToSend}"
]
}
]
}
}
Sequence
は、templateData
というデータソースを使用して、Sequence
内の一連の項目を表示し、UserEvent
に含めるデータを定義します。次の例は、このデータソースの説明を示しています。
{
"templateData": {
"properties": {
"animalList": [
{
"textToShow": "ツチブタ",
"dataToSend": "animalKey123"
},
{
"textToShow": "アードウルフ",
"dataToSend": "animalKey124"
},
{
"textToShow": "ヒヒ",
"dataToSend": "animalKey202"
}
]
}
}
}
上記の例では、SendEvent
コマンドのarguments
配列が3つの項目を指定しています。
- 静的テキストは「
listItemPressed
」です。 - データバインディングコンテキストの
ordinal
プロパティです。TouchWrapper
がSequence
の子コンポーネントであるため、このプロパティを使用できます。 - データソースの項目の
dataToSend
プロパティの値です。
したがって、ユーザーが2番目の項目(「アードウルフ」)を選択すると、スキルは次のようなUserEvent
リクエストを受け取ります。
{
"version": "1.0",
"session": {},
"context": {},
"request": {
"type": "Alexa.Presentation.APL.UserEvent",
"requestId": "amzn1.echo-api.request.1",
"token": "token-provided-with-RenderDocument",
"timestamp": "2020-01-17T16:48:11Z",
"locale": "ja-JP",
"arguments": [
"listItemPressed",
2,
"animalKey124"
],
"components": {},
"source": {
"type": "TouchWrapper",
"handler": "Press",
"id": "animalListTouchWrapper"
},
}
}
UserEventのコンポーネントデータを取得する
source
プロパティとarguments
プロパティで指定されたデータに加えて、viewportに表示される他のコンポーネントに関する情報を取得することもできます。情報を取得するには、各コンポーネントにid
プロパティを持つ識別子を割り当てます。次に、SendEvent
コマンドでcomponents
配列に含める各コンポーネントのid
を指定します。
たとえば、各コンポーネントには、true
またはfalse
のchecked
状態が含まれるとします。SetValue
コマンドを使用すると、ユーザーの対話への応答としてchecked
状態を変更できます。次のAlexaButton
の例では、ユーザーがボタンを選択したときにchecked
状態を切り替え、ボタンのテキストを変更します。
{
"type": "AlexaButton",
"id": "idForTheToggleButton",
"buttonText": "Toggle button: false",
"primaryAction": [
{
"type": "SetValue",
"componentId": "idForTheToggleButton",
"property": "checked",
"value": "${!event.source.value}"
},
{
"type": "SetValue",
"componentId": "idForTheToggleButton",
"property": "buttonText",
"value": "Toggle button: ${!event.source.value}"
}
],
"spacing": "@spacingSmall",
"alignSelf": "center"
}
次に、ドキュメント内の別のTouchWrapper
がSendEvent
をトリガーして、次の例に示すように、ボタンIDidForTheToggleButton
をcomponents
配列に含めます。
{
"type": "TouchWrapper",
"id": "idForTheTouchWrapper",
"spacing": "@spacingSmall",
"alignSelf": "center",
"onPress": [
{
"type": "SendEvent",
"arguments": [
"textWasPressed",
"このデータをスキルに送信する"
],
"components": [
"idForTheToggleButton",
"idForTheTextComponent"
]
}
],
"item": {
"type": "Text",
"id": "idForTheTextComponent",
"color": "@colorAccent",
"text": "クリックすると、スキルにUserEventが送信されます。"
}
}
ユーザーはトグルボタンを繰り返し選択して、その状態をtrue
とfalse
のいずれかに切り替えられます。ユーザーが「クリックすると...」テキストを選択すると、スキルは次のUserEvent
を受信します。components
には、現在のchecked
状態を持つidForTheToggleButton
が含まれています。
{
"type": "Alexa.Presentation.APL.UserEvent",
"requestId": "amzn1.echo-api.request.1",
"timestamp": "2020-01-20T22:46:04Z",
"locale": "ja-JP",
"arguments": [
"textWasPressed",
"このデータをスキルに送信する"
],
"components": {
"idForTheTextComponent": "クリックすると、スキルにUserEventが送信されます。",
"idForTheToggleButton": true
},
"source": {
"type": "TouchWrapper",
"handler": "Press",
"id": "idForTheTouchWrapper"
},
"token": "token-provided-with-RenderDocument"
}
ASK SDKでUserEvent
のハンドラーを作成する方法の例は、ASK SDK v2でのAlexa Presentation Languageの使用で、UserEventリクエストを処理するを参照してください。
有効な応答タイプ
UserEvent
リクエストに対して、スキルは標準的な応答で応答できます。Dialog.Delegate
を除き、すべてのカスタムスキルディレクティブを含めることができます。
エラーの例
エラーが発生すると、スキルはRuntimeError
リクエストを受信します。
以下の表に、起こりうるエラーの例をまとめます。
エラーの説明 | 例外の理由 | システム応答 |
---|---|---|
UpdateIndexListDataに必須フィールドがありません。 |
なし |
Alexaは受信したディレクティブを拒否します。 |
ディレクティブペイロードまたはリスト項目が長さの上限を超えています。 |
なし |
Alexaは受信したディレクティブを拒否します。 |
UpdateIndexListDataに認識されないトークンまたはlistIdがあります。 |
|
Alexaは受信したディレクティブを破棄します。 |
UpdateIndexListDataまたはSendIndexListDataが指定するlistVersionが、想定よりも大きい値です。 |
なし |
ディレクティブがAlexaに送信され、中間ディレクティブが受信および処理されるまでバッファーされます。 |
ディレクティブが、指定された期間よりも長くバッファーされています。 |
|
Alexaはディレクティブを引き続きバッファーします。 |
Alexaがメモリ不足などの理由で、これ以上順不同のディレクティブをバッファーできないか、バッファーしようとしていません。 |
|
Alexaは最大のlistVersionを持つ、バッファーされたディレクティブを破棄します。 |
UpdateIndexListDataまたはSendIndexListDataが指定するlistVersionが、想定よりも低い値です。 |
|
Alexaは受信したディレクティブを破棄します。 |
スキルが、認識されない操作タイプを持つUpdateIndexListDataを返しています。 |
|
Alexaは受信したディレクティブを破棄して、リストを「失敗」状態とし、それ以上の更新を承認しません。 |
スキルがDynamicTokenListに対してUpdateIndexListDataディレクティブを返しています。 |
|
Alexaは受信したディレクティブを破棄して、リストを「失敗」状態とし、それ以上の更新を承認しません。 |
スキルが、許可された値の範囲外のインデックスを持つ挿入、設定、削除の操作を返しています。 |
|
Alexaは受信したディレクティブを破棄して、リストを「失敗」状態とし、それ以上の更新を承認しません。 |
リストが、listVersionを指定していないSendIndexListDataディレクティブの後に、UpdateIndexListDataディレクティブを受信しています。 |
|
Alexaは受信したディレクティブを破棄して、リストを「失敗」状態とし、それ以上の更新を承認しません。 |
リストが、UpdateIndexListDataディレクティブの後にlistVersionを指定しないSendIndexListDataディレクティブを受信しています。 |
|
Alexaは受信したディレクティブを破棄して、リストを「失敗」状態とし、それ以上の更新を承認しません。 |
SendTokenListDataまたはSendIndexListDataが、予期しないcorrelationTokenを指定しています。 |
なし |
デバイスは応答ディレクティブを破棄します。 |
デバイスが、設定されたタイムアウト内にcorrelationTokenに対するSendTokenListData応答を受信していません。 |
|
何度か再試行しても応答がない場合、デバイスはリストの最後に到達したと見なします。再試行ごとに例外が報告されます。 |
デバイスが、設定されたタイムアウト内にcorrelationTokenに対するSendIndexListData応答を受信していません。 |
|
何度か再試行しても応答がない場合、デバイスはリスト内でリクエストされた位置を越えてこれ以上のスクロールはできないとみなします(デバイスが既にこの位置を越える項目を読み込んでいる場合は除きます。この場合、デバイスはリクエストされたインデックスで「空白」のリストエントリーを表示します)。 |
listIdまたはpageTokenの値がcorrelationTokenで想定される値と一致しません。 |
|
デバイスはlistIdとpageTokenの値を無視し、correlationTokenに想定される値を使用します。 |
SendTokenListDataディレクティブに項目が含まれず、nextPageTokenが含まれています。 |
|
デバイスはnextPageTokenを使ってスクロールします。 |
SendIndexListDataディレクティブに項目が含まれません。 |
|
Alexaは、数回または応答の最小/最大インデックスがリストの最後に達するまで遅延読み込みリクエストを再試行します。 |
SendTokenListDataディレクティブに項目が含まれず、nextPageTokenが含まれません。 |
なし |
デバイスは(リクエストのスクロール方向で)項目の最後に達したとみなします。 |
以前にリクエストされたページのディレクティブが、以前の応答とは異なるnextPageTokenを返します。 |
|
デバイスは新しいnextPageTokenを破棄します。 |
nextPageTokenが、リストの別の場所で既に使用されているトークンと重複しています。 |
|
デバイスは重複したトークンの値を破棄し、フィールドをnull(リストの最後に達した)とみなします。 |
以前にリクエストされたページのディレクティブが、以前の応答とは異なる項目数を返します。 |
|
デバイスは、新しく返された項目数を前の応答で返されたものとしてリストを拡大/縮小します。 |
任意のフィールドが整数値の範囲を超えています。 |
なし |
Alexaは応答ディレクティブを破棄します。 |
応答が、デバイスのキャッシュに既に含まれているインデックスの項目を指定しています。 |
|
デバイスのキャッシュに既に含まれているインデックスの項目データをすべて破棄します。 |
応答にはリクエストされたものとは異なるstartIndexの項目が含まれています。 |
なし |
報告されたstartIndexの項目を受け入れ(これらの場所には以前に読み込まれた項目がないものとみなして)、受け取ったインデックスから続行します。 |
maximumExclusiveIndex値が返された項目インデックスを超えています。 |
|
デバイスには、startIndexから(maximumExclusiveIndex - 1)のように、maximumExclusiveIndex範囲に含まれる項目を表示します。 |
応答に、以前に報告されたnull以外の値とは異なるminimumInclusiveIndexまたはmaximumExclusiveIndexが含まれています。 |
|
デバイスは以前に読み込まれたリスト項目をすべて破棄し、startIndexから開始し、応答に指定されたminimumInclusiveIndexとmaximumExclusiveIndexのパラメーターや項目の詳細を使用するリストを新たに再入力します。 |
SendIndexListData応答に、リクエストされた数よりも多くの項目が含まれています。 |
なし |
項目がリクエストされたものとして処理し、既に入力されていたインデックスの項目を破棄します。 |
SendIndexListData応答に、リクエストされた数よりも少ない項目しか含まれていません。 |
なし |
残りの項目に対してフォローアップリクエストを行います(最小/最大インデックスがリストの最後に到達していないものとみなして)。 |
スキルリクエストのViewportオブジェクト
スキルに送信されるリクエストには必ず、ユーザーのデバイスでサポートされているviewportに関する情報が含まれています。この情報をコードで使用して、適切な応答を作成できます。
画面付きデバイスの場合、viewport情報はcontext.Viewport
オブジェクトに格納されています。
また、viewport情報は、viewport
プロパティのデータバインディングコンテキストでも使用できます。データバインディングコンテキストで使用可能な具体的な情報は、スキルリクエストで使用可能な情報とは異なります。詳細については、データバインディングコンテキストのViewportオブジェクトを参照してください。
- スキルコードにviewport情報が必要な場合は、スキルリクエストで
context.Viewport
オブジェクトを使用します。 - APLドキュメントでviewport情報が必要な場合は、データバインディングコンテキストで
viewport
プロパティを使用します。たとえば、特定のviewportでのみ特定のコンポーネントを表示するためのwhen
条件を作成します。データバインディングコンテキストのViewportオブジェクトを参照してください。
次の例では、context.Viewport
オブジェクトを使用したスキルリクエストを示しています。説明を簡潔にするために、一部の詳細を省略しています。
{
"version": "1.0",
"session": {},
"context": {
"Viewports": [
{
"type": "APL",
"id": "main",
"shape": "RECTANGLE",
"dpi": 213,
"presentationType": "STANDARD",
"canRotate": false,
"configuration": {
"current": {
"mode": "HUB",
"video": {
"codecs": [
"H_264_42",
"H_264_41"
]
},
"size": {
"type": "DISCRETE",
"pixelWidth": 1280,
"pixelHeight": 800
}
}
}
}
],
"Viewport": {
"experiences": [
{
"arcMinuteWidth": 346,
"arcMinuteHeight": 216,
"canRotate": false,
"canResize": false
}
],
"mode": "HUB",
"shape": "RECTANGLE",
"pixelWidth": 1280,
"pixelHeight": 800,
"dpi": 213,
"currentPixelWidth": 1280,
"currentPixelHeight": 800,
"touch": [
"SINGLE"
],
"video": {
"codecs": [
"H_264_42",
"H_264_41"
]
}
},
"Extensions": {
"available": {
"aplext:backstack:10": {}
}
},
"System": {}
},
"request": {}
}
viewportプロパティ
viewport
オブジェクトでは、次のプロパティが定義されています。
プロパティ | 型/値 | 説明 |
---|---|---|
|
|
ユーザーがviewportととの対話で求めている別のモードです。 |
|
次のいずれかになります: |
デバイスのモードです。 |
|
|
viewportの形状です。 |
|
整数 |
ピクセル単位のviewportの高さです。 |
|
整数 |
ピクセル単位のviewportの幅です。 |
|
整数 |
現在使用しているピクセル単位のviewportの幅です。 |
|
整数 |
現在使用しているピクセル単位のviewportの高さです。 |
|
整数 |
viewportのピクセル密度です。 |
|
文字列の配列 |
viewportがサポートするタッチイベントです。 |
|
文字列の配列 |
viewportとの対話で使用する入力メカニズムです。 |
|
オブジェクト |
デバイスでのビデオ再生に使用できる技術の仕様です。 |
experiences
experiences
プロパティには、デバイスがサポートしているエクスペリエンスのタイプのリストが含まれています。エクスペリエンスのタイプは、viewportがサポートするモードによって異なります。この情報を使用して、特定のエクスペリエンスでのスキルの動作を最適化できます。たとえば、タブレットデバイスには2つの異なるエクスペリエンスがあります。1つは、タブレットがドックに装着されている場合、もう1つはユーザーがタブレットを手に持っている場合です。これらの場合、スキルの表示応答は両方のエクスペリエンスに最適化される必要があります。デバイスの所有者が、自由にエクスペリエンスを切り替えることができるようにするためです。
experienceプロパティ
プロパティ | 型/値 | 説明 |
---|---|---|
|
ブール値 |
viewportが90、180、270度回転できるかどうかを示します。 |
|
ブール値 |
viewportのサイズが変更できるかどうかを示します。 |
experiences
プロパティは、廃止されたarcMinuteWidth
プロパティとarcMinuteHeight
プロパティについても報告します。これらのプロパティは利用可能ですが、廃止されています。代わりに、mode
プロパティを使って、デバイスの画面を見る距離と利用可能なモダリティを判断します。
mode
デバイスのタイプを表します。
pixelHeightおよびpixelWidth
pixelHeight
およびpixelWidth
プロパティは、高さと幅が上限の場合にviewportで表示されるピクセル数を表します。これらの値は静的なデバイスの向きとみなされ、viewportの領域が現在ほかのアプリケーションで使用されているかいないかに関係なく、viewport全体のサイズを表します。
currentPixelWidthおよびcurrentPixelHeight
currentPixelWidth
およびcurrentPixelHeight
プロパティは、Alexaがエクスペリエンスをレンダリングできる縦横のピクセル数を表します。これらの値も静的なデバイスの向きとみなされます。
shape
画面のshape
は、ROUND
、RECTANGLE
のどちらかに設定されます。
dpi
画面非依存ピクセル(dp)は、携帯電話を見るときの距離で画面を持ち、画面のピクセル密度が1インチ(3cm)あたり約160ピクセルであると仮定した場合の画面のビジュアルサイズを表す測定単位です。物理的な大きさが同じ2つの画面を同じ距離から見た場合、画面の実際のピクセル密度にかかわらず、2つの画面のdpディメンションはほぼ同じになります。
viewportのdpi(インチあたりのドット数)とは、人が見たとおりのポイントまたはピクセルのサイズを表した値であり、画面の実際のインチあたりのピクセル数とは異なります。dpiを求める公式は次のとおりです。
dpi = 160 * (ピクセルサイズ/dpサイズ)
簡略化のため、dpiの値は120、160、240、320などのバケットにまとめられています。
touch
touch
プロパティは、デバイスがサポートするタッチ入力の種類を表します。touch
配列には、次の値を含めることができます。
SINGLE
- デバイスがシングルタッチ入力をサポートしていることを示します。
keyboard
keyboard
プロパティは、viewportとの対話に使用できる物理ボタン入力メカニズムを表します。keyboard
配列には、次の値を含めることができます。
DIRECTION
- ボタンと同様に、現在の位置で選択する上下左右方向の入力があります。
video
video
プロパティは、デバイスでのビデオ再生に使用できる技術を詳細に指定します。videoプロパティを使用して、APL応答に送信するビデオリソースの種類を決定します。たとえば、スキルのAPL応答が、デバイスがサポートするビデオコーデックのレベルに応じて、異なるエンコードのビデオリソースを返す場合があります。
画面付きのデバイスでも、ビデオ再生をサポートしていないものもあることに注意してください。この場合、video
プロパティはありません。スキルにビデオが含まれる場合、このプロパティを確認して、ビデオをサポートしていないデバイス向けに適切なエクスペリエンスを提供するようにしてください。ビデオをサポートしていないデバイスにVideo
を送信する場合は、そのコンポーネントは画面上に表示されますが、コンテンツは表示されないため、ユーザーには画面に空白の領域が見えることになります。
videoプロパティ
プロパティ | 型/値 | 説明 |
---|---|---|
|
文字列の配列 |
出力デバイスがサポートするビデオコーデックです。サポートされる値:
|
コードのviewport情報にアクセスする
Alexa Skills Kit SDKには、スキルリクエストコンテキストのデータを使用してデバイスのviewportプロファイルを計算する関数が含まれています。これらの関数は廃止になっており、推奨されません。代わりに、Viewportプロファイルパッケージの@viewportProfile
リソースを使用して、さまざまなデバイスに対応するAPLドキュメントを作成します。
@viewportProfile
リソースおよびレスポンシブ対応ドキュメントの詳細については、以下を参照してください。
以下の関数は廃止になっており、推奨されません。
- Node –
getViewportProfile
- Python –
get_viewport_profile
- Java –
ViewportUtils.getViewportProfile
Alexa Skills Kitで廃止になった機能の一覧については、廃止された機能を参照してください。
サービスインターフェースのリファレンス(JSON)
リクエストの形式と標準のリクエストタイプ:
インターフェース:
- Alexa.Presentation.APLインターフェース(このドキュメント)
- Alexa.Presentation.APLTインターフェース
- Alexa.Presentation.HTMLインターフェースのリファレンス
- AudioPlayerインターフェース
- Connectionsインターフェース
- Dialogインターフェース
- PlaybackControllerインターフェース
- VideoAppインターフェース
関連トピック
最終更新日: 2022 年 05 月 25 日