CellBroadcast

CellBroadcast 模块减少了 OEM 的重复工作(这反过来减少了整个 Android 生态系统中的碎片化,并为最终用户提供了一致的行为),并有助于简化运营商对 CellBroadcast 相关要求的测试和认证(因为 OEM 无法修改代码)。此模块是可更新的,这意味着它可以接收 Android 正常发布周期之外的功能更新。

软件包格式

CellBroadcast 模块包含以下服务和应用。

  • CellBroadcastService 服务支持 CellBroadcast SMS 解码、无线紧急警报 (WEA) 3.0 的地理围栏、消息重复检查以及向应用广播消息。它是一种一对多的地理定向和地理围栏消息服务,旨在同时向定义区域中的多个移动电话用户传递消息。此服务由 ETSI GSM 委员会、3GPP 定义,并且是电信标准的一部分。

  • CellBroadcastReceiver 应用是一个默认系统应用,用于处理紧急和非紧急警报(例如 Amber 警报和总统警报),并根据运营商和地区法规向最终用户呈现信息。

CellBroadcast 消息流

下图显示了 CellBroadcast 消息流。

CellBroadcastReceiver message flow

图 1. CellBroadcastReceiver 消息流

  1. 无线接口层 (RIL) 会通知 InBoundSMSHandler 关于 CDMA/GSM CellBroadcast SMS。

  2. 框架会将 CellBroadcast SMS 转发到 CBS 模块,以解析和处理传入消息。

  3. 消息处理完毕后,CellBroadcastService 会将 Intent 转发到系统默认 CellBroadcastReceiver 应用。

  4. CellBroadcastReceiver 应用会向用户显示消息。

模块格式

CellBroadcastService 和 CellBroadcastReceiver 应用包含在单个 APEX 文件 (com.android.cellbroadcast) 中,该文件适用于运行 Android 11 或更高版本的设备。该模块包含 package/app/CellBroadcastReceiver 中的代码,并将现有框架类迁移到 packages/modules/CellBroadcastService

模块依赖项

CellBroadcast 模块仅使用稳定的 @SystemApi(无 @hide API)与框架交互,并依赖于以下静态库。

  • Androidx.legacy_legacy-support-v13
  • Androidx.recyclerview_recyclerview
  • Androidx.preference_preference
  • androidx.legacy_legacy-preference-v14
  • androidx.appcompat_appcompat

您可以使用运行时资源叠加层 (RRO)自定义配置。

权限配置

CellBroadcast 模块使用 Google 签名而非平台签名进行签名,这意味着该模块会失去对签名权限的访问权限。为此,Android 11 在 CellBroadcast 模块内定义了新的签名权限 com.android.cellbroadcastservice.FULL_ACCESS_CELL_BROADCAST_HISTORY;只有模块中的软件包才能获得此权限,因为它们使用相同的密钥进行签名。此权限允许 CellBroadcastReceiver 应用完全访问 CellBroadcastService 内的数据库。

平台向默认系统短信应用授予 android.permission.READ_CELL_BROADCASTS 运行时权限,以访问紧急警报的历史记录。

集成 CellBroadcast 模块

本节介绍如何集成 CellBroadcast 模块。

与“设置”集成

您可以决定在“设置”应用中的何处集成 CellBroadcast 设置(最终用户可以通过设置 > 应用和通知 > 高级 > 紧急警报访问 CellBroadcast 设置页面)。要从“设置”应用启动 CellBroadcastReceiver 应用,请使用软件包名称 com.android.cellbroadcastreceiver 更改以下设置配置。

<!-- Cell broacast receiver package name [DO NOT TRANSLATE] -->
<string name="cell_broadcast_receiver_package">
com.android.cellbroadcastreceiver</string>

与消息应用集成

您可以将应用链接集成到消息应用中,以打开 CellBroadcast 消息历史记录。在 Android 消息应用中,这已集成到设置 > 高级 > 紧急警报中。要在您自己的消息应用中集成链接,请在消息应用中定义路径,并将 CellBroadcast 模块的组件名称配置为 com.android.cellbroadcastreceiver/com.android.cellbroadcastreceiver.CellBroadcastListActivity

与短信收件箱集成

您可以通过使用运行时资源叠加层替换以下配置,从而在默认消息应用中启用 CellBroadcast 消息显示。

<item type="bool" name="enable_write_alerts_to_sms_inbox" />

由于授予权限不在 CellBroadcast 模块的范围之内,您必须向 CellBroadcast 模块授予 AppOpsManager.OP_WRITE_SMS 权限,以提供端到端支持。有关 AOSP 参考实现,请参阅 SmsApplication.java 补丁

启动 CellBroadcastReceiver 应用

CellBroadcastReceiver 应用具有以下启动点。

  • “设置”应用菜单。

  • 应用(包括第三方应用),例如链接到 CellBroadcast 消息历史记录的消息应用。

  • (可选)OEM 添加的 Android 主屏幕上的启动图标。有关详情,请参阅添加启动图标

CellBroadcastReceiver 应用设置

以下屏幕截图显示了 CellBroadcastReceiver 应用设置菜单。

CellBroadcastReceiver app settings menu

图 2. CellBroadcastReceiver 应用设置菜单

Emergency alert history

图 3. 紧急警报历史记录屏幕

添加启动图标

您可以启用从应用启动器和通过您自己的启动图标访问 CellBroadcast 消息历史记录。

  • 要启用从应用启动器访问消息历史记录,请使用 RRO 替换以下配置。

    <item type="bool" name="show_message_history_in_launcher" />
    
  • 要替换 AOSP 默认图标,请使用 RRO 替换以下配置。

    <!-- Customize launcher icon for cellbroadcast history -->
    <item type="mipmap" name="ic_launcher_cell_broadcast" />
    

启用 CMAS 秘密代码

要启用 CMAS 秘密代码 *#*#CMAS#*#*(拨号盘上为 *#*#2627#*#*),拨号器应用必须监听 *#*#code#*#* 形式的特殊拨号器代码,并使用公共方法 sendDialerSpecialCode 处理该代码。

区域信息要求:频道 50

频道 50 是运营商广播区域相关信息的特殊频道(南非的 MTN 除外)。对于此频道,广播消息不会导致对话框或通知。相反,广播消息会显示在“设置”菜单的 SIM 卡状态中,或状态栏中(例如,显示邮政编码)。

Android CellBroadcastService 实现为“设置”和 SysUI 应用提供对小区广播服务中以下 API 的支持,以获取广播频道 50 信息。要实现此目的,请执行以下操作:

  • 注册广播 android.telephony.action.AREA_INFO_UPDATED 并通过 RRO 替换接收器软件包名称 config_area_info_receiver_packages

  • 绑定到 CellBroadcastService.CELL_BROADCAST_SERVICE_INTERFACE

由于“设置”和 SysUI 应用不在 CellBroadcast 模块的范围之内,因此您必须在 SystemUI 或“设置”应用中实现更改,以提供端到端支持。有关参考实现,请参阅 CellBroadcastService “设置”应用

自定义

您无法直接修改 CellBroadcast 模块的源代码,但可以使用 运行时资源叠加层 (RRO) 来启用(或停用)参数(例如,您可以自定义通知的颜色和对话框的尺寸)。要替换 CellBroadcast 模块中使用的参数的默认值,请将目标软件包名称更改为 com.android.cellbroadcastreceiver。此外:

如果实现缺少 UI 字符串翻译资源,或者翻译不符合您的预期,您可以使用 RRO 替换翻译资源,或与 Google 翻译团队合作,将字符串翻译上传到 CellBroadcast 模块。如果您替换翻译资源,Google 必须在 overlayable.xml 中公开这些字符串,以允许替换。如果您需要更多 UI 自定义配置,请联系 CellBroadcast 支持小组

迁移数据

Android 11 包含一个旧版 CellBroadcast 应用,这是一种为升级到 CellBroadcast 模块的设备保留和迁移应用数据(包括用户设置和紧急警报历史记录)的机制。使用 CellBroadcast 模块的 Android 实现应在其构建中包含旧版 CellBroadcast 应用,以进行数据迁移。如果您的实现使用自定义 CellBroadcast 解决方案,则应定义 CellBroadcastContentProvider APK 以保留数据(您可以在后续版本中安全地移除旧版小区广播 APK)。

在使用 CellBroadcast 模块升级的设备上,该模块通过明确定义的 cellbroadcast-legacy 授权从 AOSP LegacyCellBroadcastApp 或 OEM 定义的 CellBroadcastContentProvider APK 获取数据。

使用 OEM 定义的 CellBroadcastContentProvider APK

定义 CellBroadcastContentProvider APK 时,APK 必须遵循以下规范。

  • APK 是一个无头 APK,它仅通过具有 cellbroadcast-legacy 授权的 ContentProvider 对象公开其数据库和 SharedPreferences 的内容,并且第三方应用无法访问。

  • APK 由 OEM 开发和拥有,OEM 可以继续托管其隐藏的 API 架构。

要将 SharedPreferences 迁移到 CellBroadcast 模块,CellBroadcastContentProvider APK 必须支持 ContentProvider.call) 方法,并具有以下参数:

  • 授权: @SystemAPI CellBroadcast.LEGACY_CONTENT_URI
  • 方法: @SystemAPI CellBroadcast.CALL_METHOD_GET_PREFERENCE
  • Arg: @SystemAPI CellBroadcast.Preference

    这是 CellBroadcast 模块支持的共享偏好设置键列表。数据来自 ContentProvider.call 方法的 SharedPreferences

要将消息历史记录迁移到 CellBroadcast 模块,CellBroadcastContentProvider APK 必须支持 ContentProvider.query 方法,并具有以下参数:

  • 授权: @SystemAPI CellBroadcast.LEGACY_CONTENT_URI。查询列出 CellBroadcast 模块支持的消息属性。接收来自 ContentProvider.query 方法的数据(来自您的数据库)。

有关 CellBroadcastContentProvider 的参考实现,请参阅 LegacyCellBroadcastContentProvider

测试

Android 兼容性测试套件 (CTS) 验证应用相关的系统 API 的功能。您还可以运行 CellBroadcast 模块 单元测试/testappsp

如果 OEM 为设备启用 CMAS 秘密代码,则该设备可以使用以下功能支持调试模式。

  • 测试警报在其他警报下分组,并带有开启/关闭开关。

  • 历史记录包括所有已接收但未显示的消息,例如重复消息或另一种语言的消息。

  • 消息显示所有可用参数,包括序列号、消息 ID 和到期日期。

要启用调试模式,请在拨号器上拨打 *#*#CMAS#*#*

联系方式

有关 CellBroadcast 模块的更多详细信息或问题,请联系 CellBroadcast 支持小组