支持第三方通话应用

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)的情况下,您的拨号器或电话应用应向用户指示,接听移动网络电话将结束正在进行的第三方通话。

此用户体验非常重要,因为第三方通话应用可能具有框架无法保持的正在进行的通话。接听新的移动电话会导致正在进行的第三方通话断开连接。

有关示例,请参见图中的用户界面

Incoming call disconnecting an ongoing third-party call

图 1. 来电断开正在进行的第三方通话。

您的拨号器应用可以检查来电是否导致另一个通话断开,方法是检查通话 extra 信息。确保 EXTRA_ANSWERING_DROPS_FG_CALL 设置为 TRUE,并且 EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME 设置为在接听来电时其通话被断开的应用名称。

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

第三方通话应用开发者可以选择将其应用中的通话记录在系统通话记录中(参见 EXTRA_LOG_SELF_MANAGED_CALLS)。这意味着通话记录中可能存在非移动网络通话的条目。

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

Call log entry with third-party calling app

图 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> 安装构建的 apk。然后,自管理示例图标将添加到您的启动器。

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

处理断开正在进行的通话的来电

按照以下步骤验证来电是否会断开正在进行的第三方通话。

Test app for third-party calling apps

图 3. 带有 ConnectionService API 示例实现的测试应用。

  1. 清除可保持选项。
  2. 点按呼出以启动新的示例呼出通话。
  3. 点按 ACTIVE 按钮使通话变为活动状态。
  4. 使用另一部手机拨打被测设备的电话号码。这将调用您的拨号器获得应用名称的场景,该应用的通话将被断开连接。
  5. 完成后,点按测试应用中的 DISCONNECT 按钮。

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

完成上述步骤后,测试应用应已将通话记录到系统通话记录中。要确认设备记录来自第三方通话应用的通话,请打开您的拨号器应用并确认通话显示在系统通话记录中。