Alexa.Presentation.APLインターフェースのリファレンス
Alexa.Presentation.APLインターフェースは、Echo Showなどの画面付きデバイスでコンテンツを表示するディレクティブとリクエストを提供します。このインターフェースのリクエストでディレクティブを使用して、画面付きデバイスに標準のAPL応答を表示したり、デバイスにインストールされているウィジェットと通信したりすることができます。
supportedInterfacesのAlexa.Presentation.APL
ユーザーのデバイスにAPL対応の画面がある場合は、context.System.device.supportedInterfacesオブジェクトに[Alexa.Presentation.APL]が含まれています。
Alexa.Presentation.APLディレクティブを返す前に、必ずsupportedInterfacesを確認してください。ASK SDKでこの確認を行う例については、スキルコードにAPLサポートを追加するのユーザーのデバイスがAPLに対応していることを確認するを参照してください。
利用可能なExtensions
Extensionsは、追加のAPL機能を提供するオプションの拡張機能です。一部のExtensionsは、スキルマニフェストでextensionを宣言する必要があります。ユーザーのデバイスがこれらのExtensionsをサポートしている場合、contextオブジェクトにはExtensions.availableプロパティが含まれます。このプロパティにはマップが含まれ、各項目のキーは使用可能なextensionのURIを示します。
次の例は、Smart MotionとEntity Sensingをサポートするデバイスからのリクエストを示しています。
{
"version": "1.0",
"session": {},
"context": {
"AudioPlayer": {
"playerActivity": "IDLE"
},
"Viewports": [
{
"type": "APL",
"id": "<文字列>"
}
],
"Extensions": {
"available": {
"alexaext:smartmotion:10": {},
"alexaext:entitysensing:10": {}
}
}
}
}
context.Extensionsプロパティには、次の条件の両方を満たすextensionが含まれます。
-
スキルマニフェストの
requestedExtensionsプロパティでリクエストされていること。マニフェストでextensionをリクエストする方法の詳細については、スキルマニフェストでextensionをリクエストするを参照してください。
-
extensionがこのデバイスでサポートされていること。
マニフェストに含めることができるのは一部のextensionです。要件を確認するには、使用する各extensionのトピックを参照してください。
ディレクティブ
次の表は、Alexa.Presentation.APLインターフェースで使用できるディレクティブの一覧です。「ウィジェットのサポート」列は、ディレクティブを使用してデバイスにインストールされているウィジェットと通信できるかどうかを示しています。
| ディレクティブ | 説明 | ウィジェットのサポート |
|---|---|---|
|
指定された |
× | |
|
指定された
|
◯ | |
|
|
× | |
|
|
× | |
|
|
× |
RenderDocumentディレクティブ
指定されたdocumentに含まれているAPLコンテンツを表示するようデバイスに命令します。オプションで、1つまたは複数のdatasourcesを指定してコンテンツをドキュメントにバインドすることもできます。
次のRenderDocumentの例では、2つのTextコンポーネントとhelloworldDataというデータソースを含むドキュメントを送信します。
{
"type": "Alexa.Presentation.APL.RenderDocument",
"token": "helloworldToken",
"document": {
"type": "APL",
"version": "2024.3",
"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ディレクティブにリンクすることもできます。次の例は、「ハローワールド」ドキュメントが「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を送信する方法の例については、スキルコードにAPLサポートを追加するのリクエストハンドラーの応答でRenderDocumentを返すを参照してください。
開発者コンソールに保存されたAPLドキュメントへのリンク
開発者コンソールでAPLドキュメントを保存すると、RenderDocumentディレクティブでそのドキュメントをリンクすることができます。つまり、APLドキュメントのJSONをエクスポートしてコードにコピーする必要はありません。
開発者コンソールのドキュメントにリンクするには、次の構文を記述します。
doc://alexa/apl/documents/<ドキュメント名>
<ドキュメント名>は、開発者コンソールでドキュメントを保存するときに使用した名前です。
RenderDocumentディレクティブで使用できるようにするには、開発者コンソールで対話モデルをビルドします。開発者コンソールでAPLドキュメントを変更した場合は、対話モデルを再ビルドすると、更新されたドキュメントをRenderDocumentで使用できるようになります。開発者コンソールでドキュメントを作成して保存する方法の詳細については、開発者コンソールでドキュメントを作成するを参照してください。
開発者コンソールでスキルと統合オプションを使用すると、ドキュメントへのリンクを含むコードスニペットを必要な形式でコピーできます。
- 開発者コンソールでスキルを開きます。
- 左側のナビゲーションでマルチモーダルをクリックします。
- 統合するドキュメントを探し、スキルと統合をクリックします。
- サンプルコードを確認し、必要に応じてスキルコードにコピーします。
RenderDocumentのコードをコピーできます。ドキュメントを同期する方法については、APL NinjaのSMAPI Integrationのページを参照してください。RenderDocumentとその他のスキルディレクティブ
- 応答では、
RenderDocumentと、Dialog.Delegateを除く任意のDialogディレクティブを組み合わせることができます。たとえば、Dialog.ElicitSlotを使用して、ユーザーにスロット値の入力を求め、同時にRenderDocumentでそのスロットに関連する情報を画面に表示できます。 - 応答では、
RenderDocumentと次のインターフェースのディレクティブを組み合わせることはできません。AudioPlayerDisplayVideoApp
ExecuteCommandsディレクティブ
指定されたcommandsを以下のいずれかで実行するようデバイスに命令します。
- 標準のドキュメント - 現在レンダリングされているドキュメントです。
tokenで識別されます。 - ウィジェット - インストール済みのウィジェットです。
presentationUriで識別されます。
次の例では、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ディレクティブを含む応答のdirectives配列の例です。
{
"directives": [
{
"type": "Alexa.Presentation.APL.ExecuteCommands",
"presentationUri": "widget://amzn1.ask.skill.1/MyWidgetSandbox/f1cf2427-1-1-1-1",
"commands": [
{
"type": "AnimateItem",
"duration": 1000,
"componentId": "itemDescription",
"value": {
"property": "opacity",
"to": 0
}
},
{
"type": "SetValue",
"componentId": "successMessage",
"property": "text",
"value": "項目が保存されました。"
}
]
}
]
}
ウィジェットは、ほとんどの標準APLコマンドをサポートしています。ExecuteCommandsを使用して送信できるコマンドのリストについては、標準コマンドを参照してください。
ExecuteCommandsプロパティ
| プロパティ | 型 | 必須 | 説明 |
|---|---|---|---|
|
|
文字列 |
◯ |
|
|
|
文字列 |
× |
このコマンドの対象となるドキュメントを表示するための |
|
|
文字列 |
× |
コマンドのターゲットとなるウィジェットを識別する文字列です。ウィジェットに対するユーザー操作(タップイベントなど)の場合は、 |
|
|
コマンドの配列 |
◯ |
トークンによって識別され、レンダリングされたドキュメントで実行されるコマンドです。このコマンド配列は、暗黙的なSequentialコマンドのように動作します。つまり、コマンドは並列ではなく、順番に実行されます。 |
ExecuteCommandsディレクティブは、tokenまたはpresentationUriで識別された特定のドキュメントに対して、コマンドを実行します。
- 標準のドキュメントをターゲットにするには、指定する
tokenが、対象となるドキュメントを送信したRenderDocumentディレクティブで指定したtokenと一致する必要があります。 - ウィジェットをターゲットにするには、
presentationUriが、デバイスにインストールされているウィジェットの識別子と一致する必要があります。
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を返す方法の例については、スキルコードにAPLサポートを追加するのリクエストハンドラーの応答でExecuteCommandsを返すを参照してください。
ExecuteCommandsとその他のスキルディレクティブ
応答では、ExecuteCommandsと次のインターフェースのディレクティブを組み合わせることはできません。
AudioPlayerDialogDisplayVideoApp
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":"項目11"},
{"primaryText":"項目12"},
{"primaryText":"項目13"},
{"primaryText":"項目14"},
{"primaryText":"項目15"},
{"primaryText":"項目16"},
{"primaryText":"項目17"},
{"primaryText":"項目18"},
{"primaryText":"項目19"},
{"primaryText":"項目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":"項目11"},
{"primaryText":"項目12"},
{"primaryText":"項目13"},
{"primaryText":"項目14"},
{"primaryText":"項目15"},
{"primaryText":"項目16"},
{"primaryText":"項目17"},
{"primaryText":"項目18"},
{"primaryText":"項目19"},
{"primaryText":"項目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に更新します。
リクエスト
次の表は、Alexa.Presentation.APLインターフェースで使用できるリクエストの一覧です。「ウィジェットのサポート」列は、デバイスにインストールされているウィジェットからスキルにAlexaがリクエストを送信できるかどうかを示しています。
| リクエスト | 説明 | ウィジェットのサポート |
|---|---|---|
|
Alexaはスキルに |
× | |
|
Alexaはスキルに |
× | |
|
APL処理中に発生したエラーをスキルに通知するために送信されます。このリクエストは通知専用です。スキルは |
× | |
|
デバイス上のイベントが ウィジェットの場合、リクエストには |
◯ |
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データソースの次のページ項目をリクエストします。たとえば、以前に読み込まれた項目の最後近くまでユーザーがスクロールすると、スキルがこのリクエストを受け取ります。
| プロパティ | 型 | 必須 | 説明 |
|---|---|---|---|
|
|
文字列 |
◯ |
|
|
|
文字列 |
◯ |
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コンポーネントとイベントハンドラー(ある場合)の情報です。 |
|
|
オブジェクト |
このリクエストをトリガーした |
|
|
文字列 |
ウィジェットに適用されます。ウィジェットを識別する生成されたトークンです。 |
標準APLドキュメントのUserEventリクエストの例
次の例は、ユーザーが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リクエストの例
次の例は、ウィジェットから送信されるUserEventリクエストを示しています。リクエストには、生成されたtokenとpresentationUriが含まれます。
{
"request": {
"type": "Alexa.Presentation.APL.UserEvent",
"requestId": "amzn1.echo-api.request.1",
"timestamp": "2022-04-07T21:51:19Z",
"locale": "ja-JP",
"arguments": [
{
"itemId": "ItemIDForSmokedWildSalmon"
}
],
"components": {},
"source": {
"type": "TouchWrapper",
"handler": "Press",
"id": "saveItemButton",
"value": false
},
"token": "f1cf2427-1-1-1-1",
"presentationUri": "widget://amzn1.ask.skill.1_development/MyWidgetSandbox/f1cf2427-1-1-1-1"
}
}
UserEventのコンポーネントデータを取得する
sourceプロパティとargumentsプロパティで指定されたデータに加えて、Viewportに表示されるほかのコンポーネントに関する情報を取得することもできます。情報を取得するには、各コンポーネントにidプロパティを持つ識別子を割り当てます。次に、SendEventコマンドでcomponents配列に含める各コンポーネントのidを指定します。
たとえば、各コンポーネントにtrueまたはfalseのchecked状態が含まれている場合、SetValueコマンドを使用すると、ユーザー操作への応答としてchecked状態を変更できます。次のAlexaButtonの例では、ユーザーがボタンを選択したときにchecked状態を切り替え、ボタンのテキストを変更します。
{
"type": "AlexaButton",
"id": "idForTheToggleButton",
"buttonText": "切り替えボタン:false",
"primaryAction": [
{
"type": "SetValue",
"componentId": "idForTheToggleButton",
"property": "checked",
"value": "${!event.source.value}"
},
{
"type": "SetValue",
"componentId": "idForTheToggleButton",
"property": "buttonText",
"value": "切り替えボタン:${!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のハンドラーを作成する方法の例については、スキルコードにAPLサポートを追加するのUserEventリクエストを処理するを参照してください。
ウィジェットの対話モード
ユーザーイベントの対話モードは、そのイベントへの応答に使用できる機能を定義します。このモードは、SendEventコマンドのflagsプロパティで、interactionModeフラグを使用して設定します。
interactionModeフラグには、次の2つのうちいずれかの値を指定できます。
STANDARD- ウィジェットはスキルエクスペリエンス全体を開始できます。たとえば、スキルを起動してスキルセッションを続行するボタンを含めることができます。標準の対話モードでは、LaunchRequestやIntentRequestの場合と同様に、スキルはリクエストに対して標準的な任意の応答を返すことができます。INLINE- ウィジェットはイベントに基づいてアクションを実行できますが、スキルエクスペリエンス全体を開始したり、出力音声を返したりすることはできません。たとえば、後で使用できるようにデータを保存したり、ウィジェットに表示されているデータをサイレントに更新したりするボタンでは、インラインモードを使用します。インラインの対話モードが設定されたイベントでは、送信できる応答のタイプが制限されます。
有効な応答タイプ
標準のAPLドキュメントの場合、スキルはUserEventリクエストに対して、標準的な応答で応答できます。Dialog.Delegateを除き、すべてのカスタムスキルディレクティブを含めることができます。
ウィジェットから送信されるUserEventへの有効な応答は、イベントの対話モードによって異なります。
STANDARD- 応答は、音声とディレクティブを含む標準的な応答にすることができます。
Dialog.Delegateを除き、すべてのカスタムスキルディレクティブを含めることができます。
INLINE(デフォルト)shouldEndSessionフラグはtrueにする必要があります。スキルセッションは応答で終了します。- 応答に出力音声を含めることはできません。
- 応答には、
Alexa.Presentation.APL.ExecuteCommandsディレクティブ以外のスキルディレクティブを含めることはできません
どちらのモードでも、UserEventのハンドラーでデータストアREST APIを使用すると、ウィジェットのデータストアを更新できます。詳細については、データストアREST APIリファレンスを参照してください。
UserEventには、SendEventコマンドのflagsプロパティで指定されたデータは含まれません。コードでUserEventリクエストのソースを識別して適切に応答できるように、SendEventコマンドには必ず情報を指定してください。エラーの例
エラーが発生すると、スキルは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値を超えています。 |
|
デバイスは、maximumExclusiveIndexの範囲(startIndexからmaximumExclusiveIndex-1まで)に含まれる項目を表示します。 |
|
応答に、以前に報告された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 * (pixelSize / dpSize)
簡略化のため、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プロファイルを計算する関数が含まれています。これらの関数は廃止になっており、推奨されません。さまざまなデバイスに対応するAPLドキュメントを作成するには、代わりにViewportプロファイルパッケージの@viewportProfileリソースを使用してください。
@viewportProfileリソースおよびレスポンシブ対応ドキュメントの詳細については、以下を参照してください。
以下の関数は廃止になっており、推奨されません。
- Node -
getViewportProfile - Python -
get_viewport_profile - Java -
ViewportUtils.getViewportProfile
Alexa Skills Kitで廃止になった機能の一覧については、廃止された機能を参照してください。
スキルリクエストのAPL視覚コンテキスト
Alexa Presentation Language(APL)の視覚コンテキストは、ユーザーがインテントを呼び出したりユーザーイベントをトリガーしたりした場合に、画面に表示されるコンテンツに関する情報をスキルに提供します。スキルはコンテキストを使用して、リストのどの部分を画面に表示するかなど、画面上の要素の状態を確認できます。
ユーザーのデバイスが画面付きで、スキルが画面にRenderDocumentディレクティブで送信したAPLドキュメントを表示している場合、スキルに送信されるリクエストには視覚コンテキストが含まれます。
視覚コンテキストは、リクエストの最上位にあるcontextプロパティ内のAlexa.Presentation.APLプロパティにあります。
{
"version": "1.0",
"session": {},
"context": {
"Viewports": [],
"Alexa.DataStore.PackageManager": {
"installedPackages": []
},
"Viewport": {},
"Extensions": {},
"System": {},
"Alexa.Presentation.APL": {
"token": "helloworldWithButtonToken",
"version": "AriaRuntimeLibrary-2023.2.449.0",
"componentsVisibleOnScreen": [
{
"uid": ":1000",
"position": "960x480+0+0:0",
"type": "text",
"tags": {
"viewport": {}
},
"children": [
{
"id": "fadeHelloTextButton",
"uid": ":1002",
"position": "273x76+344+360:0",
"type": "text",
"tags": {
"focused": false,
"clickable": true
},
"entities": []
}
],
"entities": []
}
]
}
},
"request": {}
}
視覚コンテキストで提供されるオブジェクトの詳細については、スキルリクエストのAPL視覚コンテキストを参照してください。
サービスインターフェースのリファレンス(JSON)
リクエストの形式と標準のリクエストタイプ:
- Alexa.Presentation.APLインターフェース(このドキュメント)
- Alexa.Presentation.APLTインターフェース
- Alexa.Presentation.HTMLインターフェース
- AudioPlayerインターフェース
- Connectionsインターフェース
- Dialogインターフェース
- Messagingインターフェース
- PlaybackControllerインターフェース
- VideoAppインターフェース
関連トピック
最終更新日: 2025 年 11 月 11 日