支持第三方通话应用

Android 9 提供了一些 API 来更好地支持第三方通话应用。第三方通话应用通常借助电话 API(例如 PHONE_STATE 广播)与运营商通话共存。因此,第三方通话应用必须“礼让”运营商通话,而且通常会以静默方式拒绝应用中的来电,或者终止正在进行的通话,以便为运营商通话“让路”。

Android 9 中的 API 支持在运行第三方应用的同时进行运营商通话。这使得在运营商通话过程中接听第三方来电成为可能。该框架要负责确保,在用户进行第三方应用通话时使运营商通话处于呼叫保持状态。

在 Android 9 中,建议第三方通话应用实现自行管理的 ConnectionService API。如需详细了解如何使用此 API 构建通话应用,请参阅构建通话应用

自行管理的 ConnectionService API 还让开发者有机会选择将其应用中的通话记录在系统通话记录中(请参阅 EXTRA_LOG_SELF_MANAGED_CALLS)。根据 Android 兼容性定义文档 (CDD)(第 7.4.1.2 节)中的要求,您应确保拨号器/“电话”应用能够显示此类通话记录条目,并显示接入通话的第三方通话应用的名称(如需查看有关 AOSP 拨号器应用如何满足此要求的示例,请参阅源自第三方通话应用的通话记录条目)。

应用需要对其连接设置 CAPABILITY_SUPPORT_HOLDCAPABILITY_HOLD。但在某些情况下,应用可能无法使通话处于呼叫保持状态。该框架包含了应对此类情形的规定。

场景

您应当修改自己的拨号器应用以应对以下场景。

处理导致正在进行的通话中断的来电

如果正在进行的第三方通话(例如 SuperCaller 通话)不支持呼叫保持,而此时用户接到移动网络来电(例如通过运营商 FooCom),您的拨号器/电话应用应提示用户:接听移动网络来电将终止正在进行的第三方通话。

这种用户体验非常重要,因为该框架可能不支持对第三方通话应用的通话进行呼叫保持。接听新的移动网络来电会导致正在进行的第三方通话中断。

下面的界面显示了一个示例:

导致正在进行的第三方通话中断的来电
图 1. 导致正在进行的第三方通话中断的来电

拨号器应用可通过检查通话 extra 判断某个来电是否会导致其他通话中断。请务必将 EXTRA_ANSWERING_DROPS_FG_CALL 设为 TRUE,并将 EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME 设为接听移动网络来电时其通话会被中断的应用的名称。

源自第三方通话应用的通话记录条目

第三方通话应用的开发者可以选择将其应用中的通话记录在系统通话记录中(请参阅 EXTRA_LOG_SELF_MANAGED_CALLS)。这意味着,通话记录中可以包含不是有关移动网络通话的条目。

当 AOSP 拨号器应用显示与第三方通话应用相关的通话记录条目时,发生通话的应用的名称将显示在通话记录中,如下图所示:

与第三方通话应用相关的通话记录条目
图 2. 拨号器应用上显示的通话记录条目(包含第三方通话应用的名称)

如需确定与通话记录条目相关联的应用的名称,请使用通话记录提供程序中的 PHONE_ACCOUNT_COMPONENT_NAMEPHONE_ACCOUNT_ID 列创建一个 PhoneAccountHandle 实例,该实例会识别通话记录条目的来源。查询 TelecomManager 以获取 PhoneAccount 的详细信息。
如需确定某个通话记录条目是否源自第三方通话应用,请检查 PhoneAccount 功能,查看是否已设置 CAPABILITY_SELF_MANAGED

返回的 PhoneAccountgetLabel 方法将返回与源自第三方通话应用的通话记录条目相关联的应用的名称。

验证

如需测试您的设备是否支持第三方通话应用,请使用 Telecomm 测试应用,该应用可实现自行管理的 ConnectionService API。该应用位于 /packages/services/Telecomm/testapps/ 中。

  1. 使用以下命令从 Android 源代码代码库的根目录构建测试应用:

    mmma packages/services/Telecomm/testapps/

  2. 使用 adb install -g -r <apk path> 安装 build APK。自行管理的示例图标随后会添加到您的启动器。

  3. 点按该图标以打开测试应用。

处理导致正在进行的通话中断的来电

请按照以下步骤操作,以验证某个来电是否会导致正在进行的第三方通话中断。

适用于第三方通话应用的测试应用
图 3. 测试应用,可以提供自行管理的 ConnectionService API 的示例实现
  1. 取消选中 Holdable 选项。
  2. 点按 OUTGOING 以开始新的示例去电。
  3. 点按 ACTIVE 按钮以激活通话。
  4. 用另一部手机拨打被测设备的电话号码。在这一场景中,您的拨号器会显示一个应用的名称,而该应用将中断其通话。
  5. 操作完成后,在测试应用中点按 DISCONNECT 按钮。

源自第三方通话应用的通话记录条目

完成上述步骤后,测试应用会在系统通话记录中添加一条通话记录。如需确认设备是否记录了源自第三方通话应用的通话记录,请打开您的拨号器应用并确认相应通话显示在系统通话记录中。