内容启动器集成指南
本文档介绍如何将内容启动器集成到您的应用中。媒体应用通常需要与以下三个关键API集成:
系统以交互式组件的形式实现内容启动器API和Vega媒体控制API,该组件是处理Vega媒体查询的主要组件。账户登录API用作服务组件。
有关如何添加正确的依赖项和更新清单的详细信息,请参阅API自述文件的 @amazon-devices/kepler-media-content-launcher。
Vega媒体内容启动器常见用例
要开始使用Vega媒体内容启动器API,请按照以下步骤操作。
- 实例化一个新的
ContentLauncherServerComponent。开发一个用于封装回调函数的处理程序对象。此函数应返回Promise到使用ContentLauncherServerComponent实例创建的ILauncherResponse。搜索参数的检索方式详见本指南的后续内容。回调函数应:- 处理内容启动请求。
- 在
LauncherResponse中设置相应状态:- 如果请求处理成功,请见
ContentLauncherStatusType.SUCCESS。 - 如果因授权问题导致无法处理,请见
ContentLauncherStatusType.AUTH_FAILED。 ContentLauncherStatusType.URL_NOT_AVAILABLE适用于其他所有场景。
- 如果请求处理成功,请见
实现内容启动器API
-
定义内容启动器处理程序。
实例化一个新的
ContentLauncherServerComponent。开发一个用于封装回调函数的处理程序对象。import { ILauncherResponse, IContentLauncherHandler, ContentLauncherStatusType, ContentLauncherServerComponent, IContentSearch, ILaunchContentOptionalFields, } from '@amazon-devices/kepler-media-content-launcher'; ... // 创建一个ContentLauncherServerComponent的实例。 const factory = new ContentLauncherServerComponent(); // 创建一个在请求启动内容时调用的处理程序。 const contentLauncherHandler: IContentLauncherHandler = { async handleLaunchContent( contentSearch: IContentSearch, autoPlay: boolean, optionalFields: ILaunchContentOptionalFields, ): Promise<ILauncherResponse> { console.log('Content_Launcher_Sample: handleLaunchContent invoked'); // 在此处迭代以获取数据。 // 添加业务逻辑以处理启动请求。 const launcherResponse = factory .makeLauncherResponseBuilder() .contentLauncherStatus(ContentLauncherStatusType.SUCCESS) .build(); return Promise.resolve(launcherResponse); }, };处理程序应处理请求,向
ILauncherResponse返回Promise,然后使用ContentLauncherServerComponent的实例进行创建。对于
LauncherResponse,如果您的应用成功处理了请求,请将contentLauncherStatus状态设置为ContentLauncherStatusType.SUCCESS。如果您的应用由于授权问题而无法处理请求,请将状态设置为ContentLauncherStatusType.AUTH_FAILED。对于其他所有情况,请将状态设置为ContentLauncherStatusType.URL_NOT_AVAILABLE。 -
在交互式应用中实现Vega媒体内容启动器。
- 获取
IContentLauncherServerAsync的单例实例。针对ContentLauncherServerComponent实例使用getOrMakeServer方法,以实现IContentLauncherServerAsync。 - 创建一个用于实现
IContentLauncherHandler接口的处理程序对象,以处理内容启动请求。 - 为'IContentLauncherServerAsync'实例调用'setHandlerForComponent'方法。这样就能将处理程序与正确的组件相关联。
- 传递处理程序和相应的
IComponentInstance。
- 获取
在交互式应用中,您可以使用useComponentInstance方法获取IComponentInstance。对于React Native应用,请使用useEffect挂钩设置处理程序。在组件完成挂载和IComponentInstance变得可用之后,处理程序便应该立即对内容启动器进行初始化。这将把Content Launcher功能集成到组件的生命周期中,从而使您的应用能够处理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(
contentSearch: IContentSearch,
autoPlay: boolean,
_optionalFields: ILaunchContentOptionalFields,
): Promise<ILauncherResponse> {
console.log('Content_Launcher_Sample:已引用handleLaunchContent。');
// 迭代以获取数据。
// ...在此处
const launcherResponse = factory
.makeLauncherResponseBuilder()
.contentLauncherStatus(ContentLauncherStatusType.SUCCESS)
.build();
return Promise.resolve(launcherResponse);
},
};
const contentLauncherServer = factory.getOrMakeServer();
contentLauncherServer.setHandlerForComponent(contentLauncherHandler, componentInstance);
return () => {};
}, []);
// 在此处为您的提供方应用创建用户界面。
};
实现详情
handleLaunchContent回调函数采用三个参数:
- 实现
IContentSearch接口的对象。 - 名为
autoPlay的布尔值。 - 其他字段,作为实现
ILaunchContentOptionalFields接口的对象进行传递。
IContentLauncherHandler处理程序采用一个参数来定义要播放的内容或显示搜索结果。
根据autoPlay确定操作
autoPlay参数为处理程序的行为提供指引:
- 当
autoPlay设置为true时: 这表示有快速播放请求。应立即开始播放指定内容,无需用户进一步交互。 - 当
autoPlay设置为false时: 在此情况下,处理程序应向用户展示搜索结果,而非启动播放。这样一来,用户便可查看可用选项并从中进行选择。
利用这些参数,尤其是autoPlay,IContentLauncherHandler可有效管理内容探索与播放。
检索搜索值
IContentSearch参数包含待搜索的内容信息。以下架构适用于存储在IContentSearch中的值。
1 "parameterList": [{
1.1 "type": "<实体类型>",
1.2 "value": "<实体值>",
1.3 "externalIdList": [{
1.3.1 "name": "<externalId名称>",
1.3.2 "value": "<externalId值>"
}]
}]
parameterList有一个或多个条目。contentSearch.getParameterList().length返回参数的数量。使用getParameterList()检索完整列表。(架构中的第1行)-
表示参数中列出的实体的类型。例如,如果是电影或电视节目,则"type"是`ContentSearchParamType::VIDEO`。有关支持值的完整列表,请参阅`ContentSearchParamType`枚举。调用`getParamType()`来获取类型。(架构中的第1.1行) -
表示类型中提及的实体的值。调用`getValue()`来检索此字段。(架构中的第1.2行)每个参数都有零个或多个`externalIds`。使用`getExternalIdList()`.length获取列表大小。`getExternalIdList()`返回完整列表。(架构中的第1.3行) <externalId name>通过getName()来检索。可识别的两个名称为: (架构中的第1.3.1行)amzn_id—所请求内容的目录ID。launch_url—由外部体验(如Matter投屏)提供的深层链接字符串,可直接用于启动播放。<externalId值>表示externalId的值。要检索该值,可使用getValue()。对于amzn_id,此值与您在目录集成中使用的<ID>或<launchId>一致。对于launch_url,此值是请求方体验提供的完整深层链接。注意:externalId值可能包含catalogContentId或<catalog id>,两者的值都与amzn_id的值相同。但catalogContentId和<catalog id>元素将弃用,因此请仅使用amzn_id。
<launchId>字段是可选字段。如果存在launchId,您将从Fire TV主屏幕搜索结果中launchId并将其作为externalId值。如果您的目录中缺少launchId,则会用<ID>替代。如果请求由Alexa语音发起,您只能收到<ID>值。当您使用实体ID值搜索目录时,请同时搜索目录的ID和launchId字段。内容启动器请求示例
以下示例解释了一些重要内容启动器用例的contentSearch参数值。此示例列出了所有支持的用例。对于每个用例,都会调用内容启动器并启动应用。
以下streamz_us的示例目录包括电影Seabound和电视节目The SeaShow: The Real Story的示例条目。
...
<Movie>
<ID>1700000725</ID>
<Title locale="en-US">Seabound</Title>
<Offers>
<SubscriptionOffer>
<LaunchDetails>
<Quality>超高清</Quality>
<Subtitle>en-US</Subtitle>
<LaunchId>tv.streamz/movie/46720001</LaunchId>
</LaunchDetails>
</SubscriptionOffer>
<FreeOffer>
<Regions>
<Territories>US</Territories>
</Regions>
<LaunchDetails>
<Quality>标清</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>高清</Quality>
<Subtitle>en-US</Subtitle>
<LaunchId>459800033</LaunchId>
</LaunchDetails>
</FreeOffer>
</Offers>
</TvShow>
<TvSeason>
<ID>1700000234</ID>
<Title locale="en-US">第1季</Title>
<Offers>
<FreeOffer>
<Regions>
<Territories>US</Territories>
</Regions>
<LaunchDetails>
<Quality>高清</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>高清</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
}
]
}
]
应用应对LaunchId使用tv.streamz/movie/46720000来识别电影,然后直接播放电影。
LaunchId,则传递<ID>作为值。用语音快速播放
通过语音播放电影Seabound。使用表述“Alexa, Play Seabound”(Alexa,播放Seabound)。
此处的autoPlay为true。以下示例包含了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
}
]
}
]
streamz_us是目录ID的占位符。即使LaunchID存在于目录中,Alexa也不会使用它。用语音播放特定剧集
以下目录示例代表电视节目SeaShow: The Real story、该电视节目的季以及剧集。通过使用Alexa表述“Alexa, Play Season 2 Episode 5 from The SeaShow: The Real story”(Alexa,播放The SeaShow: The Real story的第2季第5集),可以调用应用以播放特定剧集。
此处的autoPlay为true。contentSearch包含节目ID,而不是剧集ID。应用必须使用ID 1700000123、ContentSearchParamType::SEASON以及ContentSearchParamType::EPISODE值来识别确切的剧集。
"parameterList": [
{
"type": 13,
"value": "",
"externalIdList": [
{
"name": "catalogContentId",
"value": "tv.catalog/movie/46720000"
},
{
"name": "amzn_id",
"value": "tv.catalog/movie/46720000"
}
]
}
]
示例: 使用Alexa启动剧集
以下示例通过以下Alexa语音表述启动一个剧集: "Watch The SeaShow: The Real Story season two episode five in Streamz."(在Streamz中观看The SeaShow: The Real story第2季第5集)。
// 迭代以获取数据。
const searchParameters = contentSearch.getParameterList();
if (searchParameters.length > 0) {
for (const searchParameter of searchParameters) {
const paramType = searchParameter.getParamType();
const searchString = searchParameter.getValue();
const additionalInfoList = searchParameter.getExternalIdList();
for (const additionalInfo of additionalInfoList) {
const searchName = additionalInfo.getName();
const entityID = additionalInfo.getValue();
switch (searchName) {
case 'amzn_id':
// 使用此实体ID在您的目录中查找精确内容。
break;
case 'launch_url':
// 使用此深层链接URL直接开始播放。
break;
// 在此处为您应用支持的其他externalId名称添加分支。
default:
// 对于无法识别的externalId名称,执行分支操作。
break;
}
}
}
if (autoPlay === true) {
console.log(`Content_Launcher_Sample: Quickplay`);
// 使用检索到的数据在此处处理播放逻辑。
} else {
console.log(`Content_Launcher_Sample: 应用内搜索`);
// 使用检索到的数据在此处处理搜索逻辑。
}
} else {
console.log('Content_Launcher_Sample: 获取搜索字符串时出错');
}
Last updated: 2026年6月18日

