as

Settings
Sign out
Notifications
Alexa
Amazonアプリストア
Ring
AWS
ドキュメント
Support
Contact Us
My Cases
開発
設計と開発
公開
リファレンス
サポート

コンテンツランチャー統合ガイド

コンテンツランチャー統合ガイド

このドキュメントでは、コンテンツランチャーをアプリに統合する方法について説明します。メディアアプリは通常、次の3つの主要なAPIと統合する必要があります。

  1. コンテンツランチャーAPI
  2. VegaメディアコントロールAPI
  3. アカウントログインAPI

システムは、コンテンツランチャーAPIとVegaメディアコントロールAPIを1つの対話型コンポーネントとして実装します。それがVegaメディアクエリを処理するメインコンポーネントです。アカウントログインAPIは、サービスコンポーネントとして機能します。

手順1: アプリのマニフェストファイルを更新する

アプリのmanifest.tomlファイルに、コンテンツランチャーのサポートを含めます。この例では、パッケージIDをcom.amazondeveloper.keplervideoappと想定しています。このパッケージIDをアプリのパッケージIDに置き換えてください。

アプリは、VegaメディアコンテンツランチャーAPIとやり取りするように構成する必要があります。

クリップボードにコピーしました。

schema-version = 1

[package]
title = "<アプリタイトル>"
id = "com.amazondeveloper.media.sample"

[components]
[[components.interactive]]
id = "com.amazondeveloper.media.sample.main"
runtime-module = "/com.amazon.kepler.keplerscript.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
# カテゴリ "com.amazon.category.kepler.media" は主要コンポーネントのみに必要で、マニフェストの [[extras]]
# セクションの "component-id" 値を使用して識別されます。
categories = ["com.amazon.category.main", "com.amazon.category.kepler.media"]

[processes]
[[processes.group]]
component-ids = ["com.amazondeveloper.media.sample.main"]

[offers]
[[offers.interaction]]
id = "com.amazondeveloper.media.sample.main"

[[message]]
uri = "pkg://com.amazondeveloper.media.sample.main"
# [[offers.interaction]] で使用した権限と一致させます。権限が追加されていない場合は "*" を使用します。
sender-privileges = ["*"]
receiver-privileges = ["self"]

[[offers.module]]
id = "/com.amazondeveloper.media.sample.module@ISomeUri1" 
includes-messages = ["pkg://com.amazondeveloper.media.sample.main"]

[[extras]]
key = "interface.provider"

component-id = "com.amazondeveloper.media.sample.main"

[extras.value.application]
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IContentLauncherServer"

# "override_command_component" フィールドは、[[extras]] セクションで指定されている "component-id" が
# ここで指定するcomponent-idと異なる場合のみ必要です。これにより、コマンドの実行時に
# extrasで最初に定義されていたコンポーネントとは別のコンポーネントを使用できるため、
# 柔軟な設定が可能になります。

# たとえば、コンテンツランチャーインターフェイスに加えてアカウントログインインターフェイスを
# 使用している場合は、アカウントログインのStatus属性をオーバーライドして、サービスにリダイレクトする
# 必要があります。これには次の行を使用します。
# override_command_component = { Status = "com.amazondeveloper.media.sample.interface.provider" }
attribute_options = ["partner-id"]
static-values = { partner-id = "<パートナーID>" }

[needs]

[[needs.module]]
id = "/com.amazon.kepler.media@IContentLauncher1"

手順2: アプリで必要なパッケージの依存関係を追加する

package.jsonファイルに、依存関係として@amazon-devices/kepler-media-content-launcherパッケージを追加します。

クリップボードにコピーしました。

"dependencies": {
    "@amazon-devices/kepler-media-content-launcher": "^2.0.0",
},

手順3: コンテンツランチャーAPIを実装する

  1. コンテンツランチャーハンドラーを定義します。

    新しいContentLauncherServerComponentをインスタンス化します。コールバック関数をカプセル化するハンドラーオブジェクトを作成します。

    クリップボードにコピーしました。

    import {
    ILauncherResponse,
    IContentLauncherHandler,
    ContentLauncherStatusType,
    ContentLauncherServerComponent,
    ILaunchContentOptionalFields,
    } from '@amazon-devices/kepler-media-content-launcher';
    
    ...
    // ContentLauncherServerComponentのインスタンスを作成します。
    let factory = new ContentLauncherServerComponent();
    
    // コンテンツの起動がリクエストされたときに呼び出されるハンドラーを作成します。
    const contentLauncherHandler: IContentLauncherHandler = {
       async handleLaunchContent(
          _optionalFields: ILaunchContentOptionalFields,
       ): Promise<ILauncherResponse> {
          console.log('Content_Launcher_Sample: handleLaunchContent invoked');
    
          // ここでデータを取得するために繰り返し処理を行い、
          // 起動リクエストを処理するビジネスロジック
    
          let launcherResponse = factory
                .makeLauncherResponseBuilder()
                .contentLauncherStatus(ContentLauncherStatusType.SUCCESS)
                .build();
          return Promise.resolve(launcherResponse);
       },
    };
    

    ハンドラーはリクエストを処理し、ILauncherResponseに解決されるPromiseを返す必要があります。これは、ContentLauncherServerComponentのインスタンスを使用して作成します。アプリが正常にリクエストを処理した場合は、LauncherResponsecontentLauncherStatusのステータスをContentLauncherStatusType.SUCCESSに設定します。認可の問題が原因でアプリがリクエストを処理できなかった場合は、ステータスをContentLauncherStatusType.AUTH_FAILEDに設定します。それ以外の場合は、ステータスをContentLauncherStatusType.URL_NOT_AVAILABLEに設定します。

  2. 対話型アプリにVegaメディアコンテンツランチャーを実装します。

    対話型アプリにVegaメディアコンテンツランチャーを実装するには、まずIContentLauncherServerAsyncのシングルトンインスタンスを取得します。ContentLauncherServerComponentインスタンスのgetOrMakeServerメソッドを使用して、IContentLauncherServerAsyncを実装します。次に、IContentLauncherHandlerインターフェイスを実装するハンドラーオブジェクトを作成して、コンテンツ起動リクエストを処理します。IContentLauncherServerAsyncインスタンスのsetHandlerForComponentを呼び出します。これにより、ハンドラーが正しいコンポーネントに関連付けられます。このとき、ハンドラーと適切なIComponentInstanceを渡します。対話型アプリでは、useComponentInstanceメソッドを使用してIComponentInstanceを取得できます。React Nativeアプリの場合は、useEffectフック内でハンドラーを設定します。コンポーネントがマウントされ、IComponentInstanceが利用可能になったらすぐに、コンテンツランチャーを初期化する必要があります。これにより、コンテンツランチャーの機能がコンポーネントのライフサイクルと緊密に統合されます。また、アプリが初期化された時点から、Vegaコンテンツランチャーのコマンドを効率的に処理することが可能になります。このセットアップでは、各コンポーネントでIComponentInstanceが使用され、コールバックルーティングの混乱を防ぐことができます。これは複数のコンポーネントを使用するアプリにとって重要です。

    クリップボードにコピーしました。

    import { useComponentInstance, IComponentInstance } from '@amazon-devices/react-native-kepler';
    
    export const App = () => {
    
    const componentInstance: IComponentInstance = useComponentInstance();
    
    useEffect(() => {
       const factory = new ContentLauncherServerComponent();
    
       const contentLauncherHandler: IContentLauncherHandler = {
    
          async handleLaunchContent(
          _optionalFields: ILaunchContentOptionalFields,
          ): Promise<ILauncherResponse> {
          console.log('Content_Launcher_Sample: handleLaunchContent invoked.');
    
          // 繰り返し処理して..
          //..ここでデータを取得します
    
          const launcherResponse = factory
             .makeLauncherResponseBuilder()
             .contentLauncherStatus(ContentLauncherStatusType.SUCCESS)
             .build();
    
          return Promise.resolve(launcherResponse);
          },
       };
    
       const contentLauncherServer = factory.getOrMakeServer();
       contentLauncherServer.setHandlerForComponent(contentLauncherHandler,componentInstance);
    
       return () => {};
    }, []);
    
    // ここでプロバイダーアプリのユーザーインターフェイスを作成します。
    };
    

実装の詳細

IContentLauncherHandlerハンドラーは、再生または検索結果に表示するコンテンツを定義するパラメーターを1つ受け取ります。

  • ILaunchContentOptionalFieldsインターフェイスを実装しているオブジェクトへのポインターを介して渡されるオプションフィールド。

コンテンツランチャーリクエストの例

以下の例では、コンテンツランチャーの主なユースケースにおけるcontentSearchパラメーターの値について説明します。これらの例は、サポートされているすべてのユースケースの一覧です。どのユースケースでも、コンテンツランチャーが呼び出され、アプリが起動します。

以下はstreamz_usのサンプルカタログで、エントリの例として「Seabound」という映画と「The SeaShow: The Real Story」というTV番組が含まれています。

クリップボードにコピーしました。

...
<Movie>
  <ID>1700000725</ID>
  <Title locale="en-US">Seabound</Title>
  <Offers>
    <SubscriptionOffer>
      <LaunchDetails>
        <Quality>UHD</Quality>
        <Subtitle>en-US</Subtitle>
        <LaunchId>tv.streamz/movie/46720001</LaunchId>
      </LaunchDetails>
    </SubscriptionOffer>
    <FreeOffer>
      <Regions>
        <Territories>US</Territories>
      </Regions>
      <LaunchDetails>
        <Quality>SD</Quality>
        <Subtitle>en-US</Subtitle>
        <LaunchId>tv.streamz/movie/467200002</LaunchId>
      </LaunchDetails>
    </FreeOffer>
  </Offers>
</Movie>

<TvShow>
  <ID>1700000123</ID>
  <Title locale="en-US">The SeaShow: The Real Story</Title>
  <Offers>
    <FreeOffer>
      <Regions>
        <Territories>US</Territories>
      </Regions>
      <LaunchDetails>
        <Quality>HD</Quality>
        <Subtitle>en-US</Subtitle>
        <LaunchId>459800033</LaunchId>
      </LaunchDetails>
    </FreeOffer>
  </Offers>
</TvShow>

<TvSeason>
  <ID>1700000234</ID>
  <Title locale="en-US">Season 1</Title>
    <Offers>
     <FreeOffer>
       <Regions>
         <Territories>US</Territories>
       </Regions>
       <LaunchDetails>
         <Quality>HD</Quality>
         <Subtitle>en-US</Subtitle>
         <LaunchId>453200012</LaunchId>
        </LaunchDetails>
     </FreeOffer>
   </Offers>
   <ShowID>1700000123</ShowID>
   <SeasonInShow>2</SeasonInShow>
</TvSeason>

<TvEpisode>
  <ID>1700000825</ID>
  <Title locale="en-US">The Seashow.Story Starts</Title>
  <Offers>
    <FreeOffer>
      <Regions>
        <Territories>US</Territories>
      </Regions>
      <LaunchDetails>
        <Quality>HD</Quality>
        <Subtitle>en-US</Subtitle>
        <LaunchId>453100008</LaunchId>
      </LaunchDetails>
    </FreeOffer>
  </Offers>
  <ShowID>1700000123</ShowID>
  <SeasonID>1700000234</SeasonID>
  <EpisodeInSeason>5</EpisodeInSeason>
</TvEpisode>
...

リモコンによるコンテンツの起動

Vega TVのホーム画面から、リモコンを使用して映画「Seabound」を起動します。

クリップボードにコピーしました。

"parameterList": [
  {                                           // パラメーター0。
      "type": 13,                             // ContentSearchParamType::VIDEO,
      "value": ,                              // コンテンツタイトル含まれません。
      "externalIdList": [{
          "name": "catalogContentId",          // 廃止される予定です。 これは無視してください。
          "value": "tv.catalog/movie/46720000" // カタログからのIDまたはLaunchId。
      }, 
      {
          "name": "amzn_id",          
          "value": "tv.catalog/movie/46720000" // カタログからのIDまたはLaunchId。
      }
     ]
  }
]

アプリでは、tv.streamz/movie/46720000LaunchIdとして使用して映画を特定し、直接再生する必要があります。

音声によるクイック再生

音声を使用して映画「Seabound」を再生します。「アレクサ、『Seabound』を再生して」という発話を使用します。

ここではautoPlaytrueになります。以下の例は、contentSearch: IContentSearchの値を示しています。アプリが起動し、ID 1700000725を使用してコンテンツが直接再生されます。

クリップボードにコピーしました。

[
    {                             // パラメーター0。
        "type": 13,               // ContentSearchParamType::VIDEO
        "value": "Seabound",      // 検索文字列。
        "externalIdList": [{
            "name": "streamz_us"  // カタログID。 廃止される予定です。 これは無視してください。
            "value": "1700000725" // カタログからのID。
        },
        { 
            "name": "amzn_id"  
            "value": "1700000725" // カタログからのID。
        }
      ]
    }
]

音声による特定のエピソードの再生

以下のサンプルカタログは、TV番組「SeaShow: The Real Story」と、そのシーズンおよびエピソードを表しています。Alexaに「アレクサ、『The SeaShow: The Real Story』のシーズン2、エピソード5を再生して」という発話を使用すると、アプリが呼び出され、指定されたエピソードが再生されます。

ここではautoPlaytrueになります。contentSearchには、エピソードIDではなく番組IDが含まれます。アプリでは、ID 1700000123ContentSearchParamType::SEASONContentSearchParamType::EPISODEの各値を使用してエピソードを正確に特定する必要があります。

クリップボードにコピーしました。

[
  {                // パラメーター0。
    "type": 13,    // ContentSearchParamType::VIDEO
    "value": "The SeaShow: The Real Story シーズン2 エピソード5", 

    "externalIdList": [{
       "name": "streamz_us", // 廃止される予定ですこれは無視してください。
       "value": "1700000123" // カタログから番組ID。
     },
     {
      "name": "amzn_id",
      "value": "1700000123" // カタログから番組ID。
    }]
  },
  {                // パラメーター1。
    "type": 14,    // ContentSearchParamType::SEASON
    "value": "2",  // カタログ内のシーズン番号。
    "externalIdList": []
  },
  {               // パラメーター2。
    "type": 15,   // ContentSearchParamType::EPISODE
    "value": "5", // カタログ内のエピソード番号。
    "externalIdList": []
  }
]

Last updated: 2026年3月23日