Android TV是Android 5.0新的内容,当前国内的智能电视大部分都是基于Android系统的,Android TV作为事实上的标准,它的推出必将极大的影响下一代智能电视的开发。
近两年来一直在从事智能电视的系统开发,也一直在关注这方面的技术,做过Android系统开发的兄弟们都知道,Android的应用开发文档很多,但是Google介绍Android系统方面尤其是Framework方面设计的文档很少,也许是那些工程师都很忙吧,很多都是我们国内开发人员阅读完源码后写的总结文章。
Android 5.0出来之后欣喜的发现,Android网站上介绍系统设计的技术文档越来越多了,其中就包括这篇Android TV的文章。可是也发现从国内登陆Android网站是越来越慢了,为了给自己一个记录,同时也为了分享给大家,免得大家,我翻译了这篇文章,Android TV的文章一共两篇,这是第一篇。
匆匆而就,定有很多不足之处,忘大家多多拍砖指正。国内智能电视行业的兄弟们也可多多切磋,Email:[email protected]
Android TV Input Framework (TIF)简化了向Android TV提供实时内容的工作。Android TIF向电视制造商提供了一套标准的API,用于创建Input模块来控制Android电视。这套框架还能搜索实时TV内容和一些推荐的内容。但是这套框架不会实现TV的各种标准和一些基于地域性的需求。
但是Android TIF能够让电视厂商更容易的满足各地区的数字电视广播标准,而不用重新定义架构。同时这份文档也能够对Android TV的三方应用开发者提供很多信息。
TIF包含一个TV Input Manager,同时还需要TV App一起工作,TV App是一个System层次的应用,可以访问内置或者IPTV的频道,这个应用不能被三方的应用替换。TV App通过TV Input Manager和电视厂商提供的TV Input模块或者是其他模块通讯。
TV Input Framework由下列部分组成:
这些组成部分会在后面的章节中描述。下图详细描述了Android TV Input Framework的架构。
图1. Android TV Input Framework (TIF)架构
这里介绍上图的架构是如何运行的:
TV Provider数据库保存每个TV Inputs的频道和节目信息。TV Provider也管理和发布数据库相关记录的权限,这样的话TV Inputs只能看到他们自己的记录。例如,一个特定的TV Input只能看到自己提供的频道和节目,而不能看到其他TV Inputs的频道和节目。
TV Provider在内部把“broadcast genre(广播分类)”映射到“canonical genre(Android TV 的统一分类)”。TV Inputs负责填入基于广播电视标准的“broadcast genre”的值,然后“canonical genre“列就会填入从android.provider.TvContract.Genres中得到正确的值。例如,对于广播电视标准ATSC A/65来说,节目分类0x25就是“Sports”,TV Input将会填入“broadcast genre”的字符串“Sports”,然后TV Provider将会在“canonical genre“字段填入相应的值android.provider.TvContract.Genres.SPORTS。
因为广播电视标准是多种多样的,每个国家不同,Android TV通过这个映射将其统一起来,用户在Android TV上看到的就是一样的,而不会造成什么迷惑。
下图详细的描述了TV Provider.。
图 2. Android TV Provider
只有具有System权限的应用才能读取TV Provider数据库中所有的数据。
直通的TV Inputs(例如HDMI)不会保存频道和节目数据。
除了频道和节目这些标准的字段外,TV Provider也提供一个BLOB类型的字段,COLUMN_INTERNAL_PROVIDER_DATA,在任何一个表中TV Inputs可以保存任意的数据。BLOB数据可以包含自定义数据,例如相对应的电视接收器的频率,或者在某个广播电视协议的缓冲,或者其他形式。也可以针对一个可搜索的字段,让某些频道不出现在搜索中(例如为了满足在某些特定的国家版权保护的需要)。
TV Provider在频道(android.provider.TvContract.Channels)和节目 (android.provider.TvContract.Programs)表中支持结构化的数据。这些表可以被TV Inputs和System级别的应用(例如TV App)操作和访问。这些表包含四种类型的字段:
想查看全部的字段列表,请查阅以下文件
android/frameworks/base/media/java/android/media/tv/TvContract.java
对于有权限访问相应数据库行的用户,此行所有的字段都是可见的。注意所有的字段不能被用户直接访问,用户只能看到TV App,系统应用或者TV Inputs的界面。
TV Input Manager为整个Android TV Input Framework提供主要的系统API。它负责中转、控制应用和TV Inputs之间的交互,同时提供儿童锁的功能。TV Input Manager会话必须是和TV Inputs一一对应的。TV Input Manager允许访问安装的TV Inputs,这样的话应用可以:
对于会话来说,TV App可以通过一个TV Input写在TV Provider数据库里的URI来对其进行调台,而直通的TV Inputs是通过TvContract.buildChannelUriForPassthroughInput()来进行调台。一个TV Input还可以有自己的音量设置。那些由电视制造商提供的(签名)或者那些安装在系统分区的应用,可以访问整个TV Provider数据库。这些访问可以供应用来搜索和浏览所有可用的频道和节目。
一个应用可以通过android.media.tv.TvInputManager来创建和注册TvInputCallback,这个应用会在TV Input状态变化或者增加、卸载的时候被回调。例如,在一个TV Inputs断开连接的时候,TV App可以作出响应,显示断开状态并且阻止它被用户选中。
TV Input Manager是对TV App和TV Inputs之间通讯的一个抽象。TV Input Manager和 TV Input的标准接口允许制造商创建自己的TV App,并且能够让所有三方的TV Inputs在所有的TV App上工作。
TV Inputs是一些Android应用,某种意义上说具有AndroidManifest.xml,通过预装或者应用商店安装的应用。Android电视支持预装的系统级别的应用,具有电视厂商签名的应用,或者一些三方的TV Inputs。
有一些TV Inputs,例如HDMI输入源或者内置的电视接收器,由于这些TV Inputs直接访问硬件,可以由电视制造商提供。其他的像IPTV、位移播放、外置机顶盒这些输入源,可以在Google Play上由三方通过应用来提供,一旦下载并且安装后,这个新的TV Input可以被TV App来使用了。
图 3. Android TV System Input
在这个例子中,电视厂商提供的TV Input是被信任的,具有访问TV Provider的所有的权限。作为一个直通的TV Input,它没有在TV Provider注册频道和节目信息。为了获取这个TV Input的URI,用android.media.tv.TvContract的方法buildChannelUriForPassthroughInput(String inputId)。TV App和TV Input Manager通讯来访问HDMI TV Input。
图 4. Android TV Built-in Tuner Input
在这个例子里,电视制造商提供的内置接收器的TV Input是被信任的,具有访问TV Provider的所有权限。
图 5. Android TV third-party input
在这个例子中,是一个有三方提供的外置的机顶盒TV Input。这个TV Input不能直接访问HDMI视频源,必须通过TV Input Manager访问设备制造商提供的HDMI TV Input。
通过TV Input Manager,外置的机顶盒TV Input可以访问HDMI TV Input,并且显示HDMI1的视频。在HDMI TV Input显示视频的时候,机顶盒TV Input可以控制电视。
图 6. Android TV KeyEvents
这个图展示了遥控器上的按键输入是怎么传递到特定的显示PIP的TV Input中。那些按键按下后,被硬件驱动扫描到,从硬件扫描码转化到Android keycodes,然后传递到Android标准的输入管道,InputReader和InputDispatcher中。在TV App获取焦点后,这些输入事件也会按顺序触发。
只有系统级别的TV Inputs才有资格接收InputEvents,而且是只有在声明了RECEIVE_INPUT_EVENT系统权限的基础上。TV Input负责判断哪些InputEvents自己处理,哪些InputEvents由TV App处理。
TV App负责判断当前那个系统TV Input被用户选中,是当前活动的TV Input,然后将KeyEvents分发给正确的TV Input Manager会话,调用dispatchInputEvent()将这些输入事件传递给对应的TV Input。
下图展示了在Android TIF中KeyEvents是如何被分发的。
图 7. Android TV Red button example
这幅图描述了红键(Red button)应用的流程,这是在欧洲常见的让用户在电视上和应用交互的功能。这个应用可以在电视流媒体中传输。当这个键被按下后,可以让用户和这些广播应用交互。例如,你可以用这些广播应用来获取相关的网页和体育比赛结果。
Broadcast app部分介绍了这些广播应用是如何和TV App交互的。
在这个示例中:
注意:三方的TV inputs不能接收按键事件。
TV Input硬件抽象层协助TV Inputs访问电视相关的硬件。和其他的Android硬件抽象层一样,TV Input 硬件抽象层在AOSP代码库由样例代码,设备厂商会开发它自己的实现。
TV App通过(com.android.tv.search.TvProviderSearch)提供频道和节目的搜索结果,同时通过TV Input Manager向各个TV Inputs分发按键、调台和音量等调用。电视制造商必须提供TV App来保证用户搜索功能,同时,用户也需要在搜索结果中导航。由于TV App需要系统或者平台签名的权限,三方的开发者不能开发TV App。
对于TIF来说,TV App没有寻求实现每个国家或者电视制造商特有的电视标准。实际上,它通常包含以下工作:
o 编辑频道
儿童锁能够让用户阻止某些不想显示的频道和节目,但是输入正确的密码后就会解除这些锁定。
TV App, TV Input Manager service, TV Provider,和 TV Input都要负责儿童锁的功能。
每一个频道表中的数据行有一个COLUMN_LOCKED字段,用来在密码验证前锁住特定的频道不被观看。节目表中的COLUMN_CONTENT_RATING字段只是用来显示而不会强制用于儿童锁。
TV Input Manager保存所有应该被阻止的TvContentRating,在isRatingBlocked()调用中判断所给的分级是否应该被阻止。
当用户观看的内容内容更改(例如频道或者节目变化),或者儿童的设置发生变化(在ACTION_BLOCKED_RATINGS_CHANGED和 ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED)时,TV Input通过TV Input Manager 的isRatingBlocked()调用来检查目前的内容是否应该被阻止。如果目前的内容应该被阻止,TV Input会关闭音视频的输出,然后通过notifyContentBlocked(TvContentRating)来通知TV App当前内容被禁止。如果播放的内容不应该被禁止,TV Input会使能音视频输出,并且通过调用notifyContentAllowed()来通知TV App。
当TV Input通知当前用户准备播放的频道被儿童锁阻止时,TV App向用户显示儿童锁的设置和需要输入密码的界面。
TV App不会自己保存儿童锁的设置。当用户更改儿童锁的设置后,所有被阻止的TvContentRating在TV Input Manager中保存,被锁的频道保存在TV Provider中。
HDMI-CEC允许一个设备来控制其他的设备,这样的话就能够用一个遥控器来控制家庭中的多个设备。这个功能被Android TV用来通过集中的TV App来加速配置和远程控制各个TV Inputs。例如,可以切换输入源,开关设备等操作。
Android TIF将HDMI-CEC实现为HDMI Control Service,这样的话电视制造商只需要开发底层的驱动,并且和轻量级的Android TV硬件抽象层交互,不需要关注复杂的业务逻辑。为了提供一个标准的实现,Android通过减少碎片化和支持可选择的功能来减少兼容性问题。HDMI Control Service基于已有的Android Services,包括输入和开关机功能。
这意味着现有的HDMI-CEC实现需要重新设计来适配Android TIF。我们推荐在硬件上包含一个微处理器来接收CEC开机和其他命令。
图8. CEC integration on Android TV
因为每个国家有自己的广播电视标准(例如MHEG, Teletext, HbbTV等),电视厂商希望用自己的解决方案提供给广播应用。
MHEG:本地协议栈(MHEG-5:信息技术-多媒体和超媒体信息编码第5部分,是一个欧洲标准)
Teletext:本地协议栈
HbbTV:基于Opera browser的webkit内核改动而来
在Android L的发布中,Android TV期望电视厂商为区域性的电视标准协议栈集成或者使用Android的解决方案,将显示的Buffer传递给电视软件协议栈,或者将一些按键值传递给以前的协议栈。
下面是广播应用如何和TV App交互的:
对于声音搜索或者推荐,广播应用支持应用内搜索或者声音搜索。
如果设备支持的话,Android TV支持数字视频录制,这个功能工作如下:
对于声音搜索和推荐:
下图提供了在Android TV中DVR的一个可能实现:
图 9. Digital video recording in Android TV