Android TV Input Framework(Android TV 一)

前言

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由下列部分组成:

  • TV Provider (com.android.providers.tv.TvProvider):一个包含频道、节目和相关权限的数据库。
  • TV App (com.android.tv.TvActivity):一个和用户交互的系统应用。
  • TV Input Manager (android.media.tv.TvInputManager):一个中间接口层,能够让TV InputsTV App进行通讯。
  • TV Input:可以看做是一个代表物理或者虚拟的电视接收器或者输入端口的应用。InputTIF中可以看做是一个输入源。
  • TV Input HAL (tv_input module):TV Input的硬件抽象层,可以让系统的TV inputs访问TV特有硬件。
  •   Parental Control:儿童锁,一种可以锁住某些频道和节目的技术。
  • HDMI-CEC:一种可以通过HDMI在多种设备上进行远程控制的技术。CEC(Consumer Electronics Control消费电子控制)

这些组成部分会在后面的章节中描述。下图详细描述了Android TV Input Framework的架构。

Android TV Input Framework(Android TV 一)_第1张图片

1. Android TV Input Framework (TIF)架构

流程


这里介绍上图的架构是如何运行的:

  1. 用户通过TV App进行观看和并且和TV交互,这是一个System级别的应用并且不能被三方应用替换。
  2. TV App显示从TV Input获取到的音频和视频内容。
  3. TV App必须通过TV Input ManagerTV Inputs进行通讯,而不能直接和其进行通讯,TV Input Manager会监控TV Inputs的状态并且提供给TV App

权限


  • 只有signatureOrSystemTV InputsTV App才具有访问TV Provider数据库的所有权限,才能够接收按键事件。
  • 只有sysgtem级别的TV Inputs才有权限通过TV Input Manager service访问TV Input HALTV Inputs可以通过TV Input Manager会话访问其他的TV Inputs
  •   三方的TV Inputs访问TV Provider数据库中是受限的,只能访问本应用对应的数据行。
  • 三方的TV Inputs可以显示自己的内容,也可以显示直通TV Inputs的内容,例如HDMI1等。他们不能显示非直通的TV Inputs的内容,例如内置的或者IPTV的电视接收器的内容。
  •   TV_INPUT_HARDWARE权限用在基于硬件的TV Input应用中。在系统启动的时候,这个权限标志TV Input Manager Service要通知TV Input ServiceTV Input Service来调用并在TV Input Manager Service注册自己的TV Inputs。这个权限同时允许一个硬件的TV Input应用在一个TV Input service中可以支持多个TV Inputs,可以动态的增加和删除自己支持的TV Inputs

TV Provider


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.

Android TV Input Framework(Android TV 一)_第2张图片

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 InputsSystem级别的应用(例如TV App)操作和访问。这些表包含四种类型的字段:

  1. 显示:显示的这些字段包含那些用于向用户显示的信息,例如频道名字(COLUMN_DISPLAY_NAME)和数字(COLUMN_DISPLAY_NUMBER),或者浏览的节目的标题等。
  2. 元数据:根据相关的标准,有三个字段用于标志某项内容,例如频道的传输流ID(COLUMN_TRANSPORT_STREAM_ID),原来的网络ID(COLUMN_ORIGINAL_NETWORK_ID)和服务ID(COLUMN_SERVICE_ID)
  3.   内部数据:一些保存TV Inputs自定义信息的字段。例如COLUMN_INTERNAL_PROVIDER_DATA字段,是一个自定义的BLOB的字段,TV Input可以保存关于频道或者节目的任意的数据。
  4. 标志:标志相关的字段用于描述一个频道是否在搜索、浏览、观看时是否受限。这个可以设置在频道的层次。所有的节目的设置可以服从所在频道的设置。
    • COLUMN_SEARCHABLE:限制某些频道是否可以在搜索结果中列出。COLUMN_SEARCHABLE = 0表示这个频道不能在搜索结果中显示。
    • COLUMN_BROWSABLE:这个接口只有system级别的应用可用。限制频道是否可以被导航浏览。COLUMN_BROWSABLE = 0表示这个频道不能出现在频道列表中。
    • COLUMN_LOCKED:这个接口只有system级别的应用可用。用于需要输入用户名和密码的频道。COLUMN_LOCKED = 1表示频道被儿童锁保护。

想查看全部的字段列表,请查阅以下文件

android/frameworks/base/media/java/android/media/tv/TvContract.java

权限和访问控制

对于有权限访问相应数据库行的用户,此行所有的字段都是可见的。注意所有的字段不能被用户直接访问,用户只能看到TV App,系统应用或者TV Inputs的界面。

  • 每一行有PACKAGE_NAME字段,这个应用拥有这一行数据,在TvProvider.java中进行Insert, Update操作时会进行检查。一个TV Input可能会访问其他TV Inputs写入和保护的信息。
  • 可以再AndroidManifest.xml中定义READ, WRITE权限来控制那些频道可用。
  • 只有具有signatureOrSystem的应用才能得到ACCESS_ALL_EPG_DATA权限来访问整个数据库。

TV Input Manager


TV Input Manager为整个Android TV Input Framework提供主要的系统API。它负责中转、控制应用和TV Inputs之间的交互,同时提供儿童锁的功能。TV Input Manager会话必须是和TV Inputs一一对应的。TV Input Manager允许访问安装的TV Inputs,这样的话应用可以:

  • 列出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 AppTV Inputs之间通讯的一个抽象。TV Input Manager TV Input的标准接口允许制造商创建自己的TV App,并且能够让所有三方的TV Inputs在所有的TV App上工作。

TV Inputs


TV Inputs是一些Android应用,某种意义上说具有AndroidManifest.xml,通过预装或者应用商店安装的应用。Android电视支持预装的系统级别的应用,具有电视厂商签名的应用,或者一些三方的TV Inputs

有一些TV Inputs,例如HDMI输入源或者内置的电视接收器,由于这些TV Inputs直接访问硬件,可以由电视制造商提供。其他的像IPTV、位移播放、外置机顶盒这些输入源,可以在Google Play上由三方通过应用来提供,一旦下载并且安装后,这个新的TV Input可以被TV App来使用了。

直通的TV Inputs示例

Android TV Input Framework(Android TV 一)_第3张图片

3. Android TV System Input

在这个例子中,电视厂商提供的TV Input是被信任的,具有访问TV Provider的所有的权限。作为一个直通的TV Input,它没有在TV Provider注册频道和节目信息。为了获取这个TV InputURI,用android.media.tv.TvContract的方法buildChannelUriForPassthroughInput(String inputId)TV AppTV Input Manager通讯来访问HDMI TV Input

内置的接收器示例

Android TV Input Framework(Android TV 一)_第4张图片

4. Android TV Built-in Tuner Input

在这个例子里,电视制造商提供的内置接收器的TV Input是被信任的,具有访问TV Provider的所有权限。

三方的TV Input示例

Android TV Input Framework(Android TV 一)_第5张图片

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可以控制电视。

画中画 (PIP)示例

Android TV Input Framework(Android TV 一)_第6张图片

6. Android TV KeyEvents

这个图展示了遥控器上的按键输入是怎么传递到特定的显示PIPTV Input中。那些按键按下后,被硬件驱动扫描到,从硬件扫描码转化到Android keycodes,然后传递到Android标准的输入管道,InputReaderInputDispatcher中。在TV App获取焦点后,这些输入事件也会按顺序触发。

只有系统级别的TV Inputs才有资格接收InputEvents,而且是只有在声明了RECEIVE_INPUT_EVENT系统权限的基础上。TV Input负责判断哪些InputEvents自己处理,哪些InputEventsTV App处理。

TV App负责判断当前那个系统TV Input被用户选中,是当前活动的TV Input,然后将KeyEvents分发给正确的TV Input Manager会话,调用dispatchInputEvent()将这些输入事件传递给对应的TV Input

MHEG-5源示例

下图展示了在Android TIFKeyEvents是如何被分发的。

Android TV Input Framework(Android TV 一)_第7张图片

7. Android TV Red button example

这幅图描述了红键(Red button)应用的流程,这是在欧洲常见的让用户在电视上和应用交互的功能。这个应用可以在电视流媒体中传输。当这个键被按下后,可以让用户和这些广播应用交互。例如,你可以用这些广播应用来获取相关的网页和体育比赛结果。

Broadcast app部分介绍了这些广播应用是如何和TV App交互的。

在这个示例中:

  1. TV App获取了焦点,可以接收所有的输入事件。
  2. KeyEvents(例如红色按钮)被作为InputEvents分发到当前活动的TV Input
  3. 集成了MHEG-5协议栈的系统级别的TV Input并且具有RECEIVE_INPUT_EVENT权限。
  4. 当收到激活的按键事件(例如红键),TV Input激活广播应用。
  5. TV input把KeyEvents当成InputEvents,广播应用获得焦点然后处理InputEvents。

注意:三方的TV inputs不能接收按键事件。

TV Input HAL


TV Input硬件抽象层协助TV Inputs访问电视相关的硬件。和其他的Android硬件抽象层一样,TV Input 硬件抽象层在AOSP代码库由样例代码,设备厂商会开发它自己的实现。

TV App


TV App通过(com.android.tv.search.TvProviderSearch)提供频道和节目的搜索结果,同时通过TV Input Manager向各个TV Inputs分发按键、调台和音量等调用。电视制造商必须提供TV App来保证用户搜索功能,同时,用户也需要在搜索结果中导航。由于TV App需要系统或者平台签名的权限,三方的开发者不能开发TV App

对于TIF来说,TV App没有寻求实现每个国家或者电视制造商特有的电视标准。实际上,它通常包含以下工作:

安装和配置

  • 自动检测TV Inputs
  • TV Inputs初始化频道信息
  • 控制儿童锁设置
  • 更改电视相关的设置

o    编辑频道

观看

  • 访问和浏览所有的电视频道
  • 访问电视节目信息栏
  • 多音道和字幕支持
  • 儿童锁控制和密码校验
  • ·         允许某些TV标准(例如HbbTV)TV Input UI层叠

儿童锁


儿童锁能够让用户阻止某些不想显示的频道和节目,但是输入正确的密码后就会解除这些锁定。

TV App, TV Input Manager service, TV Provider, TV Input都要负责儿童锁的功能。

TV Provider

每一个频道表中的数据行有一个COLUMN_LOCKED字段,用来在密码验证前锁住特定的频道不被观看。节目表中的COLUMN_CONTENT_RATING字段只是用来显示而不会强制用于儿童锁。

TV Input Manager

TV Input Manager保存所有应该被阻止的TvContentRating,在isRatingBlocked()调用中判断所给的分级是否应该被阻止。

TV Input

当用户观看的内容内容更改(例如频道或者节目变化),或者儿童的设置发生变化(在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 App

TV Input通知当前用户准备播放的频道被儿童锁阻止时,TV App向用户显示儿童锁的设置和需要输入密码的界面。

TV App不会自己保存儿童锁的设置。当用户更改儿童锁的设置后,所有被阻止的TvContentRatingTV Input Manager中保存,被锁的频道保存在TV Provider中。

HDMI-CEC


HDMI-CEC允许一个设备来控制其他的设备,这样的话就能够用一个遥控器来控制家庭中的多个设备。这个功能被Android TV用来通过集中的TV App来加速配置和远程控制各个TV Inputs。例如,可以切换输入源,开关设备等操作。

Android TIFHDMI-CEC实现为HDMI Control Service,这样的话电视制造商只需要开发底层的驱动,并且和轻量级的Android TV硬件抽象层交互,不需要关注复杂的业务逻辑。为了提供一个标准的实现,Android通过减少碎片化和支持可选择的功能来减少兼容性问题。HDMI Control Service基于已有的Android Services,包括输入和开关机功能。

这意味着现有的HDMI-CEC实现需要重新设计来适配Android TIF。我们推荐在硬件上包含一个微处理器来接收CEC开机和其他命令。

Android TV Input Framework(Android TV 一)_第8张图片

8. CEC integration on Android TV

  1. CEC总线从当前活动源接收命令切换到一个不同的源。
  2. 驱动将这个命令传给HDMI-CEC硬件抽象层。
  3. 硬件抽象层通知所有的ActiveSourceChangeListeners。
  4. HDMI Control Service通过注册ActiveSourceChangeListener被通知源切换
  5. TV Input Manager service生成广播来通知TV App切换输入源
  6. TV App为新的TV Input创建TV Input Manager会话并且在这个会话上调用setMain。
  7. TV Input Manager会话向这个HDMI TV Input发送信息。
  8. HDMI TV input请求设置显示界面。
  9. 当界面设置好后。TV Input Manager Service生成相应的切换控制命令回传给HDMI Control Service

TV集成指南


广播应用

因为每个国家有自己的广播电视标准(例如MHEG, Teletext, HbbTV),电视厂商希望用自己的解决方案提供给广播应用。

MHEG:本地协议栈MHEG-5:信息技术-多媒体和超媒体信息编码第5部分,是一个欧洲标准)

Teletext:本地协议栈

HbbTV:基于Opera browserwebkit内核改动而来

Android L的发布中,Android TV期望电视厂商为区域性的电视标准协议栈集成或者使用Android的解决方案,将显示的Buffer传递给电视软件协议栈,或者将一些按键值传递给以前的协议栈。

下面是广播应用如何和TV App交互的:

  1. TV App获取焦点,接收所有的按键事件。
  2. TV App传递按键(例如红键)到TV Input
  3. TV Input集成了老的电视协议栈。
  4. 当收到激活按键(例如红键)后,TV Input启动广播应用。
  5. 广播应用在TV App中接收焦点,然后处理用户的输入。

对于声音搜索或者推荐,广播应用支持应用内搜索或者声音搜索。

DVR(数字视频录制)

如果设备支持的话,Android TV支持数字视频录制,这个功能工作如下:

  1. 所有的TV Input都可以实现数字视频录制/实时缓存。
  2. TV App把按键事件分发给TV Input(包括录制/暂停/快放/倒放按键)
  3. 当播放录制的内容时,TV Input把它假装成正在播放的层。
  4. DVR应用可以让用户浏览和管理录制的节目。

对于声音搜索和推荐:

  • DVR应用支持应用内搜索和声音搜索。
  • DVR通过通知来提供推荐内容。

下图提供了在Android TVDVR的一个可能实现:

Android TV Input Framework(Android TV 一)_第9张图片

9. Digital video recording in Android TV

 

你可能感兴趣的:(Android开发)