CellBroadcast

CellBroadcast 模块可以减少原始设备制造商 (OEM) 的重复性工作(从而减少整个 Android 生态系统中的碎片,并为最终用户提供一致的行为),还有助于简化运营商对 CellBroadcast 相关要求的测试和认证(因为 OEM 无法修改该代码)。此模块可更新,意即该模块可在 Android 常规发布周期外的时间接收功能更新。

软件包格式

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

  • CellBroadcastService 服务支持为 CellBroadcast 短信解码、为无线紧急警报 (WEA) 3.0 实现地理围栏、检查重复消息以及向应用广播消息。此服务是一种一对多地理位置定位和地理围栏消息传递服务,旨在向指定地区内的多位手机用户同时传送消息。此服务由 ETSI GSM 委员会 3GPP 定义,是电信标准的一部分。

  • CellBroadcastReceiver 应用是一款默认系统应用,可处理紧急和非紧急警报(例如安珀警报和国家级警报),并根据运营商和地区法规向最终用户显示信息。

CellBroadcast 消息流

下图显示了 CellBroadcast 消息流。

CellBroadcastReceiver 消息流

图 1. CellBroadcastReceiver 消息流

  1. 无线接口层 (RIL) 通知 InBoundSMSHandler 收到了 CDMA/GSM CellBroadcast 短信。

  2. 框架将 CellBroadcast 短信转发到 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 消息记录的即时通讯应用。

  • (可选)Android 主屏幕中由 OEM 添加的启动图标。 如需了解详情,请参阅添加启动图标

CellBroadcastReceiver 应用设置

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

CellBroadcastReceiver 应用的“设置”菜单

图 2. CellBroadcastReceiver 应用的“设置”菜单

紧急警报历史记录

图 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 处理该代码。

地区信息要求:Channel 50

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

Android CellBroadcastService 实现可为小区广播服务中的下列 API 提供支持,以便“设置”和 SysUI 应用获取广播 Channel 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。此外:

如果实现缺少界面字符串翻译资源,或者译文不符合您的预期,您可以使用 RRO 替换翻译资源,或与 Google 翻译团队合作,将字符串翻译向上游传送到 CellBroadcast 模块。如果您替换了翻译资源,Google 必须在 overlayable.xml 中提供这些字符串,才能进行替换。如果您需要更多配置来实现界面自定义,请与 CellBroadcast 支持团队联系。

迁移数据

Android 11 包含旧版 CellBroadcast 应用,该机制用于为升级到 CellBroadcast 模块的设备保留和迁移应用数据(包括用户设置和紧急警报历史记录)。 使用 CellBroadcast 模块的 Android 实现应在其 build 中包含旧版 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。

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

如需将 SharedPreferences 迁移到 CellBroadcast 模块,CellBroadcastContentProvider APK 必须支持带有以下参数的 ContentProvider.call 方法:

  • 授权@SystemAPI CellBroadcast.LEGACY_CONTENT_URI
  • 方法@SystemAPI CellBroadcast.CALL_METHOD_GET_PREFERENCE
  • 参数@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 模块 unit tests/testappsp

如果 OEM 为设备启用了 CMAS 密码,该设备便可以支持具有以下功能的调试模式。

  • 测试警报列在其他警报下,带有开启/关闭切换开关。

  • 历史记录包含已收到但未显示的所有消息,例如重复消息或其他语言消息。

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

如需启用调试模式,请在拨号器上按 *#*#CMAS#*#*。

联系信息

如需详细了解 CellBroadcast 模块或解决这方面的问题,请与 CellBroadcast 支持团队联系。