Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Android SDK
Code

Google Play服务:Google Cast v3和Media

by
Difficulty:BeginnerLength:LongLanguages:

Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)

Google Cast是一种可让用户将在线内容发送到连接电视的设备(如Chromecast或Android TV)的技术。内容在电视上可用后,用户就可以通过移动设备或计算机对其进行控制。 

在本教程中,您将学习如何使用Cast SDK v3创建基本的Cast应用程序,Cast SDK v3是在2016年Google I / O大会上宣布的。

Cast控制台设置

Google Cast由两个组件构建:第一个是receiver,本质上是用来显示投影设备内容的网页,第二个是sender,它是请求媒体和控制播放的客户端程序。 

在创建sender应用程序之前,您需要在Google Cast开发者控制台上注册一个帐户,然后创建并配置新的receiver应用程序。 注册一个帐户需要一次性支付5美元费用。创建帐户后,您点击红色的ADD NEW APPLICATION按钮创建一个新的receiver应用程序。 

接下来,将有三个选项:自定义receiver,样式媒体receiver和远程显示receiver。为了简单起见,在本教程中,将使用样式媒体receiver。

New receiver application types

在下一个屏幕上,您可以为receiver选择一些基本设置,例如应用程序名称,用来自定义接收器外观的CSS样式表的可选URL,以及启用访客模式和音频模式。 

Setup options for a new styled media receiver

一旦点击蓝色的保存按钮,将看到一个屏幕,显示你的新reciever应用程序的基本细节。 您会注意到,此屏幕还包含您的新应用程序ID。这个值会在Android应用程序中用到。

Screen showing information for a newly created receiver

值得注意的是,即使已经创建了reciever应用程序,sender应用程序可能需要几个小时才有。 

为了测试,至少要列出一个cast设备。所以你要点击Google Cast开发者控制台的红色ADD NEW DEVICE按钮。 在出现的屏幕上,输入设备的序列号和描述,将其列入白名单,用于reciever应用程序测试。

Dialog for white-listing physical casting devices

现在已经有了一个recieve和测试设备白名单,这样就可以开始构建Android reciever应用了。当您在Play商店创建并发布您的应用程序时,需要返回到Cast Developer Console发布reciever,这样就允许任何投射设备与您的sender应用一起使用了。

Android设置

在Android应用中需要做的第一件事就是在build.gradle文件的dependencies节点下面加上Cast Framework和Media Router 。

接下来,将创建reciever时给出的应用程序ID存储在strings.xml  文件中。

最后一步是申请应用程序的Internet许可。打开AndroidManifest.xml并在application节点添加以下行。

现在设置已经完成,继续在应用程序中添加媒体路由按钮。

显示路由按钮并连接到Cast设备

路由按钮是应用程序工具栏中的图标,通常意味着应用程序支持cast。 

Media router button

为了让这个按钮出现在应用程序的Toolbar中,最简单的方法是为Activity添加到菜单XML文件中(也建议添加到应用中的每个Activity)。

接下来,您将需要在ActivityonCreateOptionsMenu方法中初始化这个新的MenuItem。 

初始化媒体路由按钮后,将需要添加状态侦听器到应用程序用于cast。

可用监听器

虽然有多个监听器可用,但在开始使用Google Cast框架时,有三点值得讨论。 

  • CastStateListener:此侦听器监视应用程序的当前投射状态。当应用程序已切换到CONNECTINGCONNECTEDNOT_CONNECTED,或NO_DEVICES_AVAILABLE时触发此方法。 
  • AppVisibilityListener:此侦听器有两个方法:onAppEnteredForegroundonAppEnteredBackground。当应用程序已被用户放到后台或用户重新打开应用程序时,会调用这些方法。
  • SessionManagerListener最后一个监听器也是最冗长的。Session是用户与投射设备交互的生命周期,从用户连接到设备开始,通过投射维护,在用户断开连接时结束。 谷歌Android投射框架通过SessionManager对象与Session交互。

这三个监听器与Google Cast框架像这样关联,  在这个示例中this就是Activity,它已经实现了上述所有接口。

您可能还注意到使用CastContext.getSharedInstance(Context)访问SessionManager和Cast框架。这是因为CastContext被延迟初始化以提高应用程序性能,CastContext是应用程序和Cast框架之间的主要交互点。 

Activity不再活跃时,要删除这些监听器。

创建 OptionsProvider

为了Cast框架做任何事情,你要创建一个继承OptionsProvider的类。您可以在此类中为sender应用配置各种选项。 

为了简单起见,只需从getCastOptions方法返回一个CastOptions对象,这将允许恢复保存的sessions并重新连接到已经进行的sessions(尽管这两个默认情况下都已启用,这里仅作为示例提供) 。 

 CastOptions 对象也是reciever应用程序ID与sender相关联的地方。虽然getAdditionalSessionProviders方法必须在此类中声明,但我们可以安全地有意地将其忽略。

您还需要在AndroidManifest.xml文件中的application节点下的meta-data标记中包含此类。

此时,您的应用程序应该能够找到任何白名单的投射设备,并通过应用程序连接到它们。

Routing dialog when connected to a casting device but not casting

路由对话框样式

根据应用程序中使用的主题(例如 Theme.AppCompat.Light.NoActionBar),您可能已经注意到在“投射设备”对话框中有一些奇怪的行为,例如白色字体和白色背景上的图标。 

Routing dialog styles issue

您可以自定义对话框的显示方式以适配应用程序。重写投射对话框中的两种风格:Theme.MediaRouter.Light.DarkControlPanelTheme.MediaRouter.LightControlPanel。 例如,如果要在白色背景上运行白色字体,则可以在styles.xml文件中包含以下代码,以将图标和字体颜色更改为白色背景上的黑色。

投射内容

连接到投射设备后,让用户向其投射内容。幸运的是,Cast SDK使这一切变得非常简单。 在应用程序中,将需要确定用户是否已连接到设备,这可以通过确认SessionManager具有当前Session 并且当前SessionRemoteMediaClient对象与之关联的来完成。

一旦知道应用程序与RemoteMediaClient相关联,将需要创建一个MediaInfo对象,其中包含指向要显示远程内容的链接,以及流媒体和内容类型。 当MediaInfo被创建并填充,可以调用的RemoteMediaClient的load方法开始投射内容。例如,以下代码会将视频文件投射到电视机上。

Routing dialog when connected to a device

元数据

Cast SDK中的receiver和UI组件使用一个MediaMetadata对象来存储和引用当前正在显示的媒体信息。您以使用该类提供的键为该对象添加值,可以使用addImage方法添加图像URL 。

一旦MediaMetadata对象被创建,你可以将其与内容的MediaInfo关联。

UI组件

Cast SDK不但处理连接内容和投射到电视的逻辑,它还提供了多个UI组件,可帮助开发人员满足Casting UI设计指南。 

引导覆盖Introductory Overlay

当用户首次打开应用程序时,建议让他们知道您支持Google Cast。您可以通过引入一个IntroductoryOverlay,让投射按钮第一次高亮。 

要引入IntroductoryOverlay,要做的第一件事是将其作为main activity顶部的成员变量添加。

有一个共同的覆盖面对象后,可以创建一个方法检查是否显示媒体路由器按钮,如果显示,将显示覆盖层。 

使用简单的构建器模式接受String文本,颜色资源ID和其他一些自定义属性,从而增强此组件。通常情况下,还需要确保调用setSingleTime(),以便覆盖层仅显示一次。

现在已经创建了显示覆盖层的方法,只需要调用它。你应该在下面这两个地方添加上面那个方法:添加onCreateOptionsMenu方法中,  当状态不是NO_DEVICES_AVAILABLE时,添加到CastStateListener里面的onCastStateChanged方法里。 用来处理当路由按钮可能出现时的偶然事件。

此时,启动应用程序并查看覆盖图,如下图所示。如果您需要再次查看以进行测试,您可以清除应用程序的数据并重新打开。

IntroductoryOverlay example

扩展控制

在投射的同时,您可以提供一个简单的UI控件来控制用户电视上的内容。Google通过Cast SDK中的ExpandedControllerActivity类,让这变得轻而易举。 

要使用它,创建一个新的Java类并继承ExpandedControllerActivity。本教程将创建一个叫做ExpandedControlsActivity的类。 创建activity后,更新onCreateOptionsMenu以引入工具栏中的投射路由按钮。

接下来,打开你的OptionsProvider类。进入getCastOptions方法并创建一个连接到ExpandedControllerActivityCastMediaOptions对象。 一旦CastMediaOptions对象被创建,你可以用它关联CastOptions

最后,要让ExpandedControllerActivity工作,您需要将其添加到AndroidManifest.xml中,就像这样。

您应该注意到activity节点有theme属性集。此样式用于可选地自定义ExpandedControllerActivity和显示的按钮。 

控制器由四个可自定义的按钮组成,中间有一个播放/暂停按钮。使用新的样式和数组资源,您可以自定义显示哪些按钮。 在arrays.xml中,我添加了一个新的array,将按钮1设置为空,按钮2设置为30秒的快退按钮,按钮3为(播放/暂停按钮右边的第一个)快进30秒,最后一个按钮是静音。

然后,您可以将这个array与你Activity关联,通过创建新的style资源并重写castExpandedControllerStyle一个新的价值为继承CastExpandedControllerstyle

现在,您应该可以点击路由对话框中的图像,以便投射媒体到你打开的新控制器Activity,或者通过简单的调用startActivity从应用程序中自行启动。

ExpandedControllerActivity example

通知/锁定屏幕控制

当用户将内容投射到电视机时,很有可能他们不会将您的应用程序保留在前台或保持手机处于解锁状态。当他们离开您的应用程序时,您将需要一个简单的方法来控制应用程序的内容。 对于Lollipop版本及以上的设备,当它不在前台时,您可以通过向您的应用添加通知,对于KitKat版本和早期设备,Cast SDK将处理为创建锁定屏幕RemoteControlClient

添加通知/锁定屏幕控件是相当简单的,因为它都是在OptionsProvider(本教程的CastOptionsProvider.java)的getCastOptions的方法中处理的。 

首先,您将需要创建一个  ArrayList 字符串,其中包含您想要控制的按钮。接下来,您可以创建一个int数组,该数组将包含当通知处于紧凑模式时要显示的按钮的索引。 

创建两个数组后,您将创建一个NotificationOptions对象,该对象将actions绑定到新通知,并且点击通知时指定要打开的Activity。对于这个例子,我们将简单地使用我们在最后一节中创建的ExpandedControlsActivity。 

最后,您可以将通知添加到CastMediaOptions。 

现在,当用户将内容投射到电视机并锁定屏幕或远离应用程序时,会出现一个通知,允许他们在继续与手机交互的时候控制大屏幕上的内容。点击控件之外的通知将使您的应用程序回到最前端的ExpandedControlsActivity,为您的用户提供更细微的控制。

Notification on a lock screen example in Lollipop

迷你控制器

您将在本教程中了解的最后一个UI控件是MiniControllerFragment。 该控件可以放置在您的activity布局文件中,并且当您的应用程序投射内容时,它会自动显示,并为用户浏览应用程序时提供一个易于访问的控制器。 虽然这是我们将要讨论的最后一个组成部分,但它很最简单。您只需要将其添加到布局文件中,就像这样。

当您在播放/暂停按钮之外的任何地方单击此控件时,ExtendedControllerActivity将被启动,使您的用户轻松访问他们的电视上的内容。

MiniControllerFragment example

结论

在本教程中,您已经学到了很多关于Android新版的Google Cast SDK,其中提供的UI组件以及如何创建用于投射的基本风格reciever应用程序。您所学到的内容将帮助您构建最常见的投射应用程序,尽管Google还提供了一些快速创建支持Cast的游戏  和定制接收器应用程序的功能。

Envato qr branded
关注我们的公众号
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.