下面几部分将介绍如何使用硬件抽象层 (HAL) 来实现广播电台。
广播电台 HAL 接口
广播电台 HAL 在硬件级别提供数据结构和接口,以实现 AM/FM 和 DAB 电台等广播电台功能。
HIDL 2.0 和 AIDL 接口
广播电台 HAL 使用下面几部分中介绍的接口。
IAnnouncementListener
IAnnouncementListener 是通知监听器的回调接口,可以在广播电台 HAL 上注册此监听器,以便接收通知。该接口使用以下方法:
| IAnnouncementListener | ||
|---|---|---|
| 说明:每当通知列表发生变化时会被调用。 | ||
| HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) | |
| AIDL | oneway void onListUpdated(in Announcement[] announcements) | |
ICloseHandle
ICloseHandle 是通用关闭句柄,可移除不需要活跃接口的回调。
| ICloseHandle | ||
|---|---|---|
| 说明:关闭手柄。 | ||
| HIDL 2.0 | close() | |
| AIDL | void close() | |
ITunerCallback
ITunerCallback 是广播电台 HAL 调用的回调接口,用于向 HAL 客户端服务发送更新。
| ITunerCallback | ||
|---|---|---|
| 说明:当调谐操作(调谐、搜寻 [使用 AIDL]/扫描 [使用 HIDL] 以及步进成功时)异步失败时,由 HAL 调用。 | ||
| HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) | |
| AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) | |
| 说明:会在调谐、搜寻(使用 AIDL)/扫描(使用 HIDL)或步进成功时调用。 | ||
| HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) | |
| AIDL | void onTuneFailed(in Result result, in ProgramSelector selector) | |
| 说明:会在调谐、搜寻(使用 AIDL)/扫描(使用 HIDL)或步进成功时调用。 | ||
| HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) | |
| AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) | |
| 说明:会在节目列表更新时调用;每个分块的大小不得超过 500kiB。 | ||
| HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) | |
| AIDL | oneway onProgramListUpdated(ProgramListChunk chunk) | |
| 说明:会在天线连接或断开连接时调用。 | ||
| HIDL 2.0 | oneway onAntennaStateChange(bool connected) | |
| AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) | |
| 说明:会在 HAL 内部更新供应商特定参数值时调用(不应在 HAL 客户端调用 setParameters之后再调用)。 | ||
| HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) | |
| AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) | |
| 说明:AIDL 中的新功能。会在 HAL 内部更新配置标志时调用(不应在 HAL 客户端调用 setConfigFlag之后再调用)。 | ||
| HIDL 2.0 | 不适用。 | |
| AIDL | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) | |
IBroadcastRadio
IBroadcastRadio 是广播电台 HAL 的主要接口。在 HIDL 2.0 HAL 中,使用调谐器的 ITunerSession 接口来调用操作。不过,一次最多只有一个调谐器处于活跃状态(前提是每个广播电台 HAL 实例只有一个调谐器芯片)。系统从 AIDL 接口中移除了 ITunerSession,并将其接口移到了 IBroadcastRadio。
| IBroadcastRadio | ||
|---|---|---|
| 说明:获取模块及其功能的说明。 | ||
| HIDL 2.0 | getProperties() generates (Properties properties) | |
| AIDL | Properties getProperties() | |
| 说明:提取当前或可能的 AM/FM 区域配置。 | ||
| HIDL 2.0 | getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig
          config) | |
| AIDL | AmFmRegionConfig getAmFmRegionConfig(bool full) | |
| 说明:提取当前的 DAB 区域配置。 | ||
| HIDL 2.0 | getDabRegionConfig() generates (Result result, vec<DabTableEntry>
          config) | |
| AIDL | DabTableEntry[] getDabRegionConfig() | |
| 说明:从电台模块缓存中获取图片。 在 AIDL 中,由于 binder 事务缓冲区存在硬性上限,因此图片大小必须小于 1MB。 | ||
| HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) | |
| AIDL | byte[] getImage(in int id) | |
| 说明:注册通知监听器。 | ||
| HIDL 2.0 | registerAnnouncementListener(vec<AnnouncementType>
          enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle
          closeHandle) | |
| AIDL | ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in
          AnnouncementType[] enabled) | |
| 说明: 
 | ||
| HIDL 2.0 | openSession(ITunerCallback callback)生成(Result result, ITunerSession session) | |
| AIDL | void setTunerCallback(in ITunerCallback callback) | |
| 说明: 
 | ||
| HIDL 2.0 | close() | |
| AIDL | unsetTunerCallback() | |
| 说明:调谐到指定的节目。 | ||
| HIDL 2.0 | tune(ProgramSelector program) generates (Result result) | |
| AIDL | void tune(in ProgramSelector program) | |
| 说明:寻找下一个在播送中的有效节目。为避免在 AIDL 中产生混淆, scan已重命名为seek。 | ||
| HIDL 2.0 | scan(bool directionUp, bool skipSubChannel) generates (Result result) | |
| AIDL | void seek(in boolean directionUp, in boolean skipSubChannel) | |
| 说明:步进到相邻的频道,此频道可能未被任何节目占用。 | ||
| HIDL 2.0 | step(bool directionUp) generates (Result result) | |
| AIDL | void step(in boolean directionUp) | |
| 说明:取消待处理的调谐、扫描(使用 HIDL)/搜寻(使用 AIDL)或步进操作。 | ||
| HIDL 2.0 | cancel() | |
| AIDL | void cancel() | |
| 说明:对节目列表应用过滤条件,并开始通过 onProgramListUpdated回调发送节目列表更新。 | ||
| HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) | |
| AIDL | void startProgramListUpdates(in ProgramFilter filter) | |
| 说明:停止发送节目列表更新。 | ||
| HIDL 2.0 | stopProgramListUpdates() | |
| AIDL | void stopProgramListUpdates() | |
| 说明:提取给定配置标志的当前设置。 | ||
| HIDL 2.0 | isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value) | |
| AIDL | boolean isConfigFlagSet(in ConfigFlag flag) | |
| 说明:设置给定配置标志。 | ||
| HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) | |
| AIDL | void setConfigFlag(in ConfigFlag flag, boolean value) | |
| 说明:设置供应商特定的参数值。 | ||
| HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters)生成, (vec<VendorKeyValue> results) | |
| AIDL | VendorKeyValue[] setParameters(in VendorKeyValue[] parameters) | |
| 说明:检索供应商特定的参数值。 | ||
| HIDL 2.0 | getParameters(vec<string> keys) generates (vec<VendorKeyValue>
          parameters) | |
| AIDL | VendorKeyValue[] getParameters(in String[] keys) | |
接口说明
异步行为
由于每个调谐操作(例如调谐、扫描 [使用 HIDL]/搜寻 [使用 AIDL] 或步进)都可能非常耗时,并且不应长时间阻塞线程,因此操作流程应将耗时的操作安排在稍后执行,并快速返回状态或结果。详细来说,每个操作应该:
- 取消所有待处理的调谐操作。
- 检查是否可以根据方法输入和调谐器状态处理操作。
- 安排调谐任务,然后立即返回 Result(使用 HIDL)或status(使用 AIDL)。 如果Result或status为OK,则在调谐任务失败(例如由于超时)或完成时必须调用调谐器回调tuneFailed或currentProgramInfoChanged。
同样,startProgramListUpdates 还会安排更新节目列表这项比较耗时的任务在稍后完成,并快速返回状态或结果。该方法会先取消待处理的更新请求,然后安排更新任务并快速返回结果。
竞态条件
由于调谐操作(例如调谐、扫描 [使用 HIDL]/搜寻 [使用 AIDL] 和步进)的异步行为,取消操作和调谐操作之间存在竞态条件。如果在 HAL 完成调谐操作之后、回调完成之前调用 cancel,则可以忽略取消操作,且相应回调应完成并由 HAL 客户端接收。
同样,如果在 HAL 完成节目列表更新后、onCurrentProgramInfoChanged 回调完成之前调用 stopProgramListUpdates,则可以忽略 stopProgramListUpdates,且相应回调应完成。
数据大小限制
由于 binder 事务缓冲区存在硬性限制,因此 AIDL HAL 中会说明传递可能较大的数据时某些接口方法的数据限制。
- getImage要求返回的图片小于 1MB。
- onProgramListUpdate要求每个- chunk小于 500kiB。 较大的节目列表必须由 HAL 实现拆分为多个分块,并通过多个回调发送。
AIDL HAL 数据结构的变更
除了接口的变更之外,这些变更已被应用于广播电台 AIDL HAL 中定义的数据结构,该数据结构利用了 AIDL。
- Constant枚举已从 AIDL 中移除,并已在- IBroadcastRadio中定义为常量整数。同时,- ANTENNA_DISCONNECTED_TIMEOUT_MS已重命名为- ANTENNA_STATE_CHANGE_TIMEOUT_MS。系统新增了一个常量整数- TUNER_TIMEOUT_MS。所有调谐、搜寻和步进操作都必须在这段时间内完成。
- 枚举 RDS和Deemphasis已从 AIDL 中移除,并已在AmFmRegionConfig中定义为常量整数。相应地,ProgramInfo中的fmDeemphasis和fmRds会声明为整数,这是相应标志的位计算结果。同时,D50和D75已分别重命名为DEEMPHASIS_D50和DEEMPHASIS_D75。
- 枚举 ProgramInfoFlags已从 AIDL 中移除,并已在ProgramInfo中定义为常量整数,同时添加了前缀FLAG_。相应地,ProgramInfo中的infoFlags会声明为整数,这是标志的位计算结果。TUNED也已重命名为FLAG_TUNABLE,以更好地描述其定义,即电台可调谐的范围。
- 因为在 AIDL 中,scan已重命名为seek,所以在AmFmBandRange中,scanSpacing已重命名为seekSpacing。
- 由于 AIDL 中引入了并集的概念,因此系统不再使用 HIDL HAL 中定义的 MetadataKey和Metadata。AIDL HAL 中定义了 AIDL 并集Metadata。之前在MetadataKey中的每个枚举值现在都是Metadata中的字段,其类型为字符串或整数,具体取决于其定义。
DAB 电台支持
本部分介绍了 DAB 电台支持。
标识符
AIDL 广播电台 HAL 中 DAB 和 DMB 电台的主要标识符类型为 DAB_SID_EXT。DAB_SID_EXT 使用 32 位服务标识符 (SID),因此它可以同时表示 DAB 和 DMB 电台的 SID。
除了主要标识符之外,还支持 DAB_ENSEMBLE 和 DAB_FREQUENCY_KHZ 等辅助标识符。这一点很重要,因为多个 DAB 电台可以共用一个 DAB_SID_EXT,但有不同的 DAB_ENSEMBLE 或 DAB_FREQUENCY_KHZ 值。为了确保节目列表更新准确无误,使用 ITunerCallback#onProgramListUpdated 更新包含相同 DAB_SID_EXT 的电台。此更新随后会中继到广播电台服务和电台管理器,并最终通过 android.hardware.radio.ProgramList 中继到电台应用。
元数据
下表显示的是 AIDL 广播电台 HAL 中受支持的 DAB 专用元数据:
| 元数据字段 | 说明 | 
|---|---|
| dabEnsembleName(缩写形式:dabEnsembleNameShort) | DAB 电台的集合名称 | 
| dabServiceName(缩写自dabServiceNameShort) | DAB 电台的服务名称 | 
| dabComponentName(缩写自dabComponentNameShort) | DAB 电台的组件名称 | 
高清电台支持
本部分介绍了高清电台支持。
标识符
HD_STATION_ID_EXT 是高清电台的主要标识符。为进一步增强电台识别功能,系统还提供了 HD_STATION_NAME 和 HD_STATION_LOCATION 等辅助标识符。Android 15 中引入了用于提供位置信息的 HD_STATION_LOCATION。
  
启用或停用数字电台
从 Android 15 开始,您可以通过调整 ConfigFlag 启用或停用数字电台(例如高清电台)。如果是 FM 电台,请使用 FORCE_ANALOG_FM 标志控制此设置;如果是 AM 电台,则使用 FORCE_ANALOG_AM 标志。
    将该标志设置为 false 可启用高清电台,将其设置为 true 则可强制启用模拟 AM/FM 电台。
可选择的高清频道
从 Android 15 开始,目前可供高清电台选择的高清频道将通过 8 位的位掩码(ProgramInfo.metadata 中的 Metadata#hdSubChannelsAvailable)表示。例如,左侧位 1 的值表示此高清电台是否能选择 HD2 子频道。
信号获取状态
在 Android 15 及更高版本中,电台应用可以向用户显示高清电台的信号获取状态。这很有用,因为有时需要几分钟才能获得强大的高清信号。
为了提供此信息,系统会使用 ProgramInfo.infoFlags 跟踪状态,并通过 ITunerCallback#onCurrentProgramInfoChanged. 更新电台应用
以下是状态在 ProgramInfo.infoFlags 中的表示方式:
- 位 6:指示是否已获取高清电台信号。
- 位 7:显示是否有可用的电台信息服务 (SIS) 数据。 SIS 可提供有关电台和当前播放节目的额外信息。
- 位 8:指明是否有可用的高清数字音频。
元数据
下表显示的是 Android 15 及更高版本支持的高清电台元数据。
| 元数据字段 | 说明 | 
|---|---|
| commentShortDescription | 注释的简短背景说明 | 
| commentActualText | 注释的内容 | 
| commercial | 电台商业广告 | 
| ufids | 与内容相关联的唯一文件标识符 (UFID) | 
| hdStationNameShort | 高清电台的简称或通用简称 | 
| hdStationNameLong | 高清电台的全名、宣传口号或来自电台的消息。 | 
紧急警报
在 Android 15 及更高版本中,高清电台支持紧急警报,以便向电台应用用户通知电台发送的紧急警报。紧急警报 (Alert) 遵循通用警报协议 (CAP) 1.2 标准,并支持下表中所示的警报:
| 警报信息 | 说明 | 可用的枚举值 | 
|---|---|---|
| AlertStatus | 警报消息的状态 | ACTUAL、EXERCISE、TEST | 
| AlertMessageType | 紧急警报消息类型 | ALERT、UPDATE、CANCEL | 
| AlertCategory | 紧急警报消息的主题事件所属的类别 | GEO、MET、SAFETY、SECURITY、RESCUE、FIRE、HEALTH、ENV、TRANSPORT、INFRA、CBRNE、OTHER | 
| AlertUrgency | 紧急警报消息的主题事件的紧急程度 | IMMEDIATE、EXPECTED、FUTURE、PAST、UNKNOWN | 
| AlertSeverity | 紧急警报消息的主题事件的严重程度 | EXTREME、SEVERE、MODERATE、MINOR、UNKNOWN | 
| AlertCertainty | 紧急警报消息的主题事件的确定性 | OBSERVED、LIKELY、POSSIBLE、UNLIKELY、UNKNOWN | 
Alert(包含表格中的信息)、警报文本消息和 AlertArea 来显示当前警报的相关信息。Alert 是 ProgramInfo 中的可选字段,可通过调谐器回调从广播电台 HAL 发送到电台应用,以获取当前节目信息和节目列表更新。
  
  
  
