Telecom 框架概览

Android Telecom 框架管理 Android 设备上的音频和视频呼叫。其中包括基于 SIM 的呼叫(例如,使用Telephony 框架),以及由 ConnectionService API 实施者提供的 VOIP 呼叫。

Telecom 涉及的两种主要组件为 ConnectionServiceInCallServiceConnectionService 实现负责通过某种方式(例如 VOIP)将呼叫与另一方连接起来。手机上最常见的 ConnectionService 实现是负责连接运营商呼叫的Telephony ConnectionServiceInCallService 实现负责为 Telecom 管理的呼叫提供界面,并为用户提供控制这些呼叫和与之交互的方式。与设备绑定的电话应用是 InCallService 实现的最常见示例。

Telecom 充当总机,将 ConnectionService 实现提供的呼叫路由到 InCallService 实现提供的呼叫界面。

如果您有以下需求,则可能需要实现 Telecom API:

  1. 创建系统电话应用的替代应用。
  2. 创建集成到 Android 呼叫体验中的呼叫解决方案。

创建电话应用的替代应用

如果您想为 Android 设备上的默认“电话”应用创建替代应用,则需实现 InCallService API。需要注意的是,InCallService 不应具有任何呼叫功能,而应仅包含用于呼叫的界面。InCallService 必须处理 Telecom 框架注意到的所有呼叫。该组件不得对呼叫性质进行假设(例如,假设呼叫为基于 SIM 的电话呼叫),也不应根据任何一个 ConnectionService 实施呼叫限制(例如,不应对视频呼叫施加 Telephony 限制)。

如需了解详细信息,请参阅 InCallService

集成呼叫解决方案

如果要将呼叫解决方案集成到 Android 中,您有以下选择:

  1. 实现自我管理的 ConnectionService API - 对于以下两种独立呼叫应用的开发者而言,这实属理想之选:不希望在默认电话应用中显示其呼叫的应用;不希望在其界面中显示其他呼叫的应用。长久以来,独立呼叫应用一直依赖侦听手机状态,以此尝试确定其他呼叫的发生时间。这种方法存在问题,因为手机状态不会考虑用户可能安装了其他呼叫应用。使用自我管理的 ConnectionService 不仅有助于确保应用与设备上的本机电话呼叫实现交互操作,还可以帮助其他独立呼叫应用实现此 API。自我管理的 ConnectionService API 还可以为您管理音频路由和焦点。详情请参阅自我管理的 ConnectionService
  2. 实现自我管理的 ConnectionService API - 有助于开发依赖现有设备电话应用来提供呼叫界面的呼叫解决方案(参见 getDefaultDialerPackage())。示例可能是 SIP 呼叫的第三方实现或 VOIP 调用服务。单凭 ConnectionService 只能提供连接呼叫的方式,无法提供关联界面。详情请参阅 ConnectionService
  3. 同时实现 InCallServiceConnectionService API - 如果您想创建自己基于 ConnectionService 的呼叫解决方案(且具备自有界面),同时该解决方案可以在同一界面中显示所有其他 Android 呼叫,这确是理想方法。如要使用此方法,您仍须确保 InCallService 不对其显示的呼叫源作任何假设。您还必须确保,在未将默认电话应用设置为自定义 InCallService 的情况下,ConnectionService 实现仍可以正常工作。

过滤来电

运行 Android 10 (API 级别 29) 或更高版本 的设备为您的应用提供一种方法,可将不在用户通讯录中的来电识别为潜在的垃圾电话,并代表用户以静默方式拒接垃圾电话。系统会将这些被拦截电话的信息作为已拦截来电记录到通话记录中,以便为错过电话的用户提供更高的透明度。使用此新 API 可省去从用户处获取 READ_CALL_LOG 权限以提供来电过滤和来电显示功能的需求。

重定向呼叫

在运行 Android 10 (API 级别 29) 或更高版本 的设备上,呼叫 Intent 的处理方式与在运行 Android 9 及更低版本的设备上有所不同。系统会弃用 NEW_OUTGOING_CALL 广播,改用 CallRedirectionService APICallRedirectionService API 提供界面,供您修改由 Android 平台拨出的去电。例如,第三方应用可能会取消呼叫并通过 VoIP 重新路由呼叫。