TV Input

Android TV : 电视输入框架(TIF)剖析

Android TIF(Android TV input Framework)是Google向电视制造商提供了一套标准的API,用于创建Input模块来控制Android电视。这套API的底层实现的原理是aidl和provider,从而进行了跨进程通信。系统或第三方的应用可以通过TIF获得所有输入(input)的信源(输入的模块包括:搜台模块,MDMI模块,网络模块等),然后通过aidl切台输出到屏幕上。

1.电视相关的知识:

HDMI:高清晰度多媒体接口(英文:High Definition Multimedia Interface,HDMI)是一种数字化视频/音频接口技术,是适合影像传输的专用型数字化接口。
    IPTV:网络电视,也叫VOD电视,三方比如说某某视频公司提供的视频资源在电视上播放。
    DTV:数字电视
    ATV:模拟电视

2.TIF的组成部分:

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

3.TIF官方流程图:

在这里插入图片描述
如上图所示,TVProvider和TV Input Manager就是TIF中的内容,liveTVApp通过turning调用TV Input Manager获得一个session,session里面放的是一路信源的状态,TV Input Manager 必须与 TV Input 创建一对一的会话。liveTVApp通过session以aidl的方式调用TVinputService获得相关的频道和具体的节目信息进行播放,并提供家长控制功能。TvInput将获得的Channel和Programs信息写入到/data/data/com.android.providers.tv/databases/tv.db数据库中。

4.TIF为开发者提供的接口

1)TvView:负责显示播放的内容。它是一个ViewGroup的子类,它是切台的入口,内置surface用于显示视频播放的内容和通过控制session可以控制音量的大小等。
2)TvInputService:TvInputService是一个重要的类,继承了它并实现一些规范就可以实现一路input信源供其它应用使用。在该service中要实现onCreatSession()方法该方法要返回一个TvInputService.Session对象。这里的service在Manifest中定义时要注意要添加permission和action。添加完之后系统的TvInputManager可以检测到该service是一个TvInputService,也就是一路信源。

5.获取TvInputManager

TvInputManager tvInputManager = (TvInputManager) getSystemService(Context.TV_INPUT_SERVICE);

TvInputManager只是我们当前进程的代理,它的真正实现其实是一个系统的Service,所以我们可以知道这个service其实在system_server进程中,在类TvInputManagerService中实现。由于这个地方是跨进程通信,其实它使用的是aidl的方式,所以我们可以找到TvInputManager在aidl中定义的接口:interface ITvInputManager

TvInputManagerService是在SystemServer中启动的,具体在SystemServer类的startOtherServices方法中:

       if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_LIVE_TV)
                    || mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)) {
                t.traceBegin("StartTvInputManager");
                mSystemServiceManager.startService(TvInputManagerService.class);
                t.traceEnd();
            }

注意上面会判断系统TV和LEANBACK的特征而决定是否启动TvInputManagerService,特征可在device/google/atv/permissions/tv_core_hardware.xml中进行配置

6获取信源

得到TvInputManager后我们可以遍历拿到系统当前有多少个service是Tv信源:
List<TvInputInfo> list = tvInputManager.getTvInputList();
  for(TvInputInfo info:list){    
  Log.i(TAG, "id:" + info.getId());
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值