原标题:Video Playback with the Google Assistant on Android TV
链接:https://android-developers.googleblog.com/2017/10/video-playback-with-google-assistant-on.html
作者:Benjamin Baxter (开发程序工程师)
翻译:arjinmc
今年早些时候,我们宣布了Google助手将会来到Android TV,并已到来。Android电视上的Google Assistant可让用户发现,启动和控制媒体内容,控制诸如灯泡等智能设备。你的助理还了解你正在电视上进行互动,因此你可以在观看你喜爱的电影和电视节目时获得最佳体验。
Google Assistant具有内置的功能,可以了解“观看超人特工队”和媒体控件(如暂停,快进等)等命令。本文将介绍如何将Google Assistant集成到应用程序中。
没有新的API与Google Assistant集成。你只需要遵循Google Assistant从应用程序中预期的模式。如果你想试用和使用API和助手,可以从github下载此示例。
Google Assistant已经进行了一些更改,以改善Android TV上的查找信息。
有几种方法可以通过Google Assisant向用户公开你的内容。
服务器端集成。(需要注册和登机)
你需要将内容目录提供给Google。你的应用之外,此Google数据被吸收并可供Google Assistant使用。
这不是Google Assistant的特定内容。它还可以启用其他Google服务,例如在Google搜索,Google Play,Google Home App和Android TV上搜索和发现。
如果你的应用程序已经可以搜索,那么你只需要处理EXTRA_START_PLAYBACK标志,稍后再详细介绍。如果在搜索结果中明确指定了应用名称,或者用户是否已经在你的应用中,内容将自动播放。
一旦你的应用程序可以搜索,你可以通过询问助手进行测试,或者如果你处于较大的区域,请通过运行以下adb命令安静地进行测试:
adb shell am start -a "android.search.action.GLOBAL_SEARCH" --es query \"The Incredibles\"
响应搜索查询的每个应用程序将显示一行显示其搜索结果。请注意,YouTube和示例应用程序“Assistant播放”每个都会收到自己的行与搜索查询匹配的内容。
对于诸如“玩Big Buck Bunny”的特定搜索,助手将向每张应用程序提供一张与搜索查询完全匹配的按钮的卡片。在下面的屏幕截图中,你可以看到示例应用程序“助手播放”,显示为可以观看Big Buck Bunny的选项。
Google助手有时会直接启动应用开始播放内容。发生这种情况的一个例子是当内容是应用程序的排他性时; “玩 the Netflix original House of Cards”。
当用户从搜索结果中选择视频时,会将intent发送到你的应用。intent action的优先顺序如下:
- 在从游标返回的游标中指定的Intent(SUGGEST_COLUMN_INTENT_ACTION)。
- Intent在searchable.xml文件中具有searchSuggestIntentAction值。
- 默认为ACTION_VIEW。
此外,如果播放应立即开始,助手还会通过一个额外的信号。你的应用程序应该能够处理intent,并期待一个额外的boolan值的EXTRA_START_PLAYBACK。
import static android.support.v4.content.IntentCompat.EXTRA_START_PLAYBACK;
public class SearchableActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getIntent() != null) {
// Retrieve video from getIntent().getData().
boolean startPlayback = getIntent().getBooleanExtra(EXTRA_START_PLAYBACK, false);
Log.d(TAG, "Should start playback? " + (startPlayback ? "yes" : "no"));
if (startPlayback) {
// Start playback.
startActivity(...);
} else {
// Show details for movie.
startActivity(...);
}
}
finish();
}
}
你可以通过修改和运行以下adb命令来测试。如果你的应用有自定义操作,请使用自定义操作替换android.intent.action.VIEW。使用你从助手查询返回的URI 替换-d参数的值。
adb shell 'am start -a android.intent.action.VIEW --ez
android.intent.extra.START_PLAYBACK true -d <URI> -f 0x14000000'
该-f参数是逻辑或从值FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP。这将迫使你的activity新鲜推出。
例如,在示例应用程序中,你可以运行以下命令来启动“Big Buck Bunny”的播放,就像助手已启动的那样。
adb shell 'am start -a android.intent.action.VIEW --ez
android.intent.extra.START_PLAYBACK true -d
content://com.example.android.assistantplayback/video/2 -n
com.example.android.assistantplayback/.SearchableActivity -f 0x14000000'
上面的URI除了从查询返回的SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID(2)的值之外,还可以在searchable.xml(content://com.example.android.assistantplayback/video/)中的android:searchSuggestIntentData值定义该值。
请注意,Google Assistant可能会在7天内缓存Intent。你的应用可能会收到不再可用的内容的播放请求。Intent处理程序应设计为无状态的,而不是依赖任何以前的知识来处理深层链接。你的应用程序应优雅地处理这种情况。一个解决方案是显示一条错误消息,让用户登陆你的主Activity或其他相关Activity。
如果你的应用程序正确地实现了MediaSession,那么你的应用程序应该立即工作,而无需更改。
Blender基金会所有。根据知识共享署名3.0授权许可。
Google Assistant假定你的应用程序处理传输控件。助手使用TransportControls将媒体命令发送到你的应用程序的MediaSession。视频应用程序必须尽可能支持以下控件:
- 播放/暂停/停止
- 上一页下一页
- 倒带/快进(实现seekTo())
你可以通过实现MediaSession.Callback轻松获取这些控件的钩子。如果你使用PlaybackTransportControlGlue播放视频,则所有回调都需要同步glue和MediaSession。否则使用此回调来同步播放器。
public class MyMediaSessionCallback extends MediaSessionCompat.Callback {
private final PlaybackTransportControlGlue<?> mGlue;
public MediaSessionCallback(PlaybackTransportControlGlue<?> glue) {
mGlue = glue;
}
@Override
public void onPlay() {
Log.d(TAG, "MediaSessionCallback: onPlay()");
mGlue.play();
updateMediaSessionState(...);
}
@Override
public void onPause() {
Log.d(TAG, "MediaSessionCallback: onPause()");
mGlue.pause();
updateMediaSessionState(...);
}
@Override
public void onSeekTo(long position) {
Log.d(TAG, "MediaSessionCallback: onSeekTo()");
mGlue.seekTo(position);
updateMediaSessionState(...);
}
@Override
public void onStop() {
Log.d(TAG, "MediaSessionCallback: onStop()");
// Handle differently based on your use case.
}
@Override
public void onSkipToNext() {
Log.d(TAG, "MediaSessionCallback: onSkipToNext()");
playAndUpdateMediaSession(...);
}
@Override
public void onSkipToPrevious() {
Log.d(TAG, "MediaSessionCallback: onSkipToPrevious()");
playAndUpdateMediaSession(...);
}
}
查看以下文章和培训文档,以继续了解MediaSession和Video应用程序。
要在Android TV上使用Google Assistant,请下载示例应用程序,并在运行Android M或更高版本的Nvidia Shield上运行。
如果你想继续讨论,请在Twitter上回复或与我交谈。