HDMI-CEC 控制服务

高清多媒体接口消费类电子产品控制 (HDMI-CEC) 标准允许多媒体消费类产品相互通信和交换信息。HDMI-CEC 支持很多功能(如遥控直通和系统音频控制),但最受欢迎的功能之一是单键播放。单键播放功能可以让媒体来源设备打开电视并自动切换其输入端口,因此您无需寻找电视遥控器,即可从 Chromecast 切换到蓝光播放器。

使用 Android 12 时,已连接 HDMI 的屏幕的电源控制与内部屏幕的电源控制一致。当 HDMI 播放设备唤醒时,它会尝试唤醒已连接的电视,并通过 HDMI CEC 单键播放功能成为当前活跃来源。如果作为当前活跃来源的设备进入休眠状态,就会尝试关闭连接的电视。

是否支持 HDMI-CEC 通常可选。不过,大多数制造商都已采用 HDMI-CEC,因此它们的设备能够与其他公司的设备配合使用。各个制造商实现 HDMI-CEC 标准的方式不同,因此设备之间并不总是可以实现顺畅协作,而且支持的功能也因设备而异。由于存在这种差异,消费者并不能放心地假定两个声称支持 CEC 的产品是完全兼容的。

如果发送设备和接收设备都支持 HDMI-CEC 2.0,那么支持该标准的这一版本有助于提高 HDMI 设备之间的兼容性。

解决方法

随着 Android 电视输入框架 (TIF) 的推出,HDMI-CEC 可以将所有连接的设备汇集在一起,并最大限度地减少兼容性问题。Android 已经创建了一项名为 HdmiControlService 的系统服务来帮助缓解此类难题。

通过提供 HdmiControlService 作为 Android 生态系统的一部分,Android 希望提供:

  • 一个面向所有制造商的 HDMI-CEC 标准实现方案,以降低设备的不兼容性。以前,制造商必须开发自己的 HDMI-CEC 实现方案或使用第三方解决方案。
  • 一项针对市场上已有的众多 HDMI-CEC 设备进行测试后反响良好的服务。Android 对从产品中发现的兼容性问题进行了认真而细致的研究,并从深谙该技术的设备实现人员处收集了实用的建议。CEC 服务旨在保持标准与对该标准做出的修改之间的良好平衡,以便它可以用于用户已经在使用的产品。

整体设计

HdmiControlService 与系统的其余部分(电视输入框架 [TIF]、音频服务和电源服务等)连接,以实现该标准指定的各种功能。

以下示意图描绘了从自定义 CEC 控制器到更简单的 HDMI-CEC 硬件抽象层 (HAL) 实现的转换。

HDMI-CEC 在 Android 5.0 之前和之后版本中的实现方式示意图

图 1. HDMI 控制服务替换

实现

请参阅以下示意图,详细了解 HDMI 控制服务。

HDMI 控制服务详情图片

图 2. HDMI 控制服务详情

以下是正确的 Android HDMI-CEC 实现的关键因素:

  • 管理器类 HdmiControlManager 向特权应用提供 API。TV Input Manager 服务和音频服务等系统服务可以直接使用该服务。
  • 该服务旨在允许托管多种类型的逻辑设备。
  • HDMI-CEC 通过硬件抽象层 (HAL) 与硬件连接,以简化对设备之间协议和信号传输机制的差异的处理。设备制造商可以利用 HAL 定义来实现 HAL 层。

注意:设备制造商应将以下行添加到 device.mk 中的 PRODUCT_COPY_FILES 内。

PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.hdmi.cec.xml:system/etc/permissions/android.hardware.hdmi.cec.xml

设备制造商需要在 device.mk 中设置 ro.hdmi.device_type 以使 HdmiControlService 正常工作,具体取决于您的设备是 HDMI 接收设备还是 HDMI 源设备。

对于 OTT 服务 (OTT) 或机顶盒 (STB) 设备等 HDMI 源设备,请采用如下设置:

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=4

对于平板电视等 HDMI 接收设备,请采用如下设置:

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=0
  • 设备制造商提供的专有 CEC 控制器不能与 HdmiControlService 同时使用。必须将其停用或移除。在需要处理特定于制造商的命令时通常会用到此类控制器。应通过对该服务进行扩展/修改,将特定于制造商的命令处理程序合并到该服务中。上述工作由设备制造商负责,且并非由 Android 指定。请注意,针对特定于制造商的命令对该服务做出的任何更改均不得干扰标准命令的处理方式,否则将导致设备与 Android 不兼容。
  • 对 HDMI-CEC 服务的访问受 SignatureOrSystem 保护级别的保护。只有系统组件或 /system/priv-app 中的应用才能访问该服务。这是为了防止该服务被恶意应用滥用。

Android 支持类型 TV/Display(0)Playback device(4)(可发出单键播放命令以成为活跃来源)和 Audio System (5)(处理系统音频模式和 ARC)。目前不支持其他设备类型(调谐器和录制器)。

HDMI-CEC HAL

借助 HDMI-CEC HAL API,HdmiControlService 可以利用硬件资源来发送/接收 HDMI-CEC 命令、配置必要的设置,并(可选)与底层平台(将在 Android 系统处于待机模式时负责 CEC 控制)上的微处理器进行通信。

版本 功能 HAL 文件
1.0 配置 HAL 数据(地址、功能)。发送 HDMI-CEC 命令。注册回调以接收 HDMI-CEC 命令和热插拔事件。 IHdmiCec.hal
IHdmiCecCallback.hal
1.1 引入 HDMI-CEC 2.0 类型 @1.1::IHdmiCec.hal
@1.1::IHdmiCecCallback.hal

测试

按照 HDMI-CEC CTS 文档,通过 CTS 测试对设备的 HDMI-CEC 实现进行测试和验证。

HDMI-CEC 2.0

Android 源(播放)设备和接收(平板电视)设备支持 HDMI-CEC 2.0。HDMI-CEC 2.0 可以提升 HDMI 设备之间的互操作性,改善遥控直通功能,并提供范围更广的认证测试。一般而言,与其他设备进行 HDMI-CEC 2.0 交互可以提高效率,从而减少 HDMI-CEC 流量并加快交互速度。

为了让设备支持 HDMI-CEC 2.0,必须将设备配置和用户配置设为使用 HDMI-CEC 2.0。HAL 实现也必须在对 IHdmiCec#getCecVersion 的调用中报告对 HDMI-CEC 2.0 的支持。

CEC 配置

HDMI-CEC 行为既可以在构建时(由 OEM 使用 RRO)配置,也可以在运行时(通过 HdmiControlManager @SystemApi)配置。

HDMI-CEC 设置的示例:

设置 选项
HDMI CEC 是处于启用状态还是停用状态。 已启用
已停用
播放设备发送的 CEC 电源控制消息的范围。 仅发送到电视
发送到电视和音频系统
广播

有关当前可用的每项设置及允许的选项,可在运行时按应用进行查询。