Telecom 通话管理框架架构设计

Android Telecom实战:从零搭建一个VOIP通话应用(附完整代码) 本文详细介绍了如何利用Android Telecom框架从零构建一个VOIP通话应用,涵盖Telecom核心架构、VOIP通话实现、Android 10+适配方案及性能优化等内容。通过完整代码示例和实战技巧,帮助开发者快速掌握安卓Telecom系统进程的交互与IncallUI的集成,实现高效稳定的VOIP通话功能。 阅读详情

description: “Telecom 通话管理框架架构设计——Android 通话的调度中心,涵盖 CallsManager 通话调度、ConnectionService 底层连接、InCallService 上层 UI、PhoneAccount 路由选择、CallAudioRoute 音频路由、CallRedirectionService 呼叫重定向。”

Telecom 是 Android 通话能力的中央调度中心。它位于 Telephony 框架(底层)和 Dialer 应用(上层)之间,负责管理所有来电/去电的完整生命周期。无论通话是 CS (2G/3G)、VoLTE、VoWiFi 还是 VoIP (如微信/WhatsApp),Telecom 都以统一的方式处理。

Telecom 解决了 Android 生态中一个根本问题:如何让不同的"电话服务提供方"(Telephony 的 CS、IMS 的 VoLTE、第三方的 VoIP)和不同的"电话 UI 体验方"(Dialer 应用、车载系统、手表)无缝协作。 这就是 Google 的 “Telecom 通话分离” 设计。

设计理念: Telecom 的设计核心是"关注点分离" (Separation of Concerns)。Connector Service 负责"如何建立媒体通道",InCall Service 负责"如何展示 UI"。两者通过 Telecom 的 Connection 和 Call 抽象进行桥接,彼此完全解耦。

1. 核心职责

  1. 通话调度 (CallsManager):管理所有活跃通话,处理来电排队/去电冲突
  2. 路由选择 (PhoneAccount):根据 PhoneAccount 选择合适的 ConnectionService 发起通话
  3. ConnectionService 管理:绑定并管理 CS/IMS/VoIP 等不同的 ConnectionService 实现
  4. InCallService 管理:绑定并管理 Dialer/车载/手表等不同的 InCall UI 实现
  5. 音频路由 (CallAudioRoute):管理音频从哪个设备输出(听筒/扬声器/蓝牙/有线耳机)
  6. 通话筛选 (CallScreening):在来电被 UI 展示前进行筛选(静音/拒绝/重定向)

2. 核心类与源码锚点

  • [CallsManager.java](file:///d:/Resource%20Android%2016/android-16/packages/services/Telecomm/src/com/android/server/telecom/CallsManager.java):通话调度核心。管理所有 Call 对象,处理 addCall/removeCall 回调。
  • [Call.java](file:///d:/Resource%20Android%2016/android-16/packages/services/Telecomm/src/com/android/server/telecom/Call.java):单次通话的框架表示。包含通话状态、呼叫者信息、通话分析数据。
  • [ConnectionServiceWrapper.java](file:///d:/Resource%20Android%2016/android-16/packages/services/Telecomm/src/com/android/server/telecom/ConnectionServiceWrapper.java):ConnectionService 的包装器。管理与 Telephony/VoIP 等底层连接服务的 Binder 通信。
  • [InCallController.java](file:///d:/Resource%20Android%2016/android-16/packages/services/Telecomm/src/com/android/server/telecom/InCallController.java):InCallService 的控制器。管理 Dialer UI 的绑定和通信。
  • [CallAudioRouteStateMachine.java](file:///d:/Resource%20Android%2016/android-16/packages/services/Telecomm/src/com/android/server/telecom/CallAudioRouteStateMachine.java):音频路由状态机。自动选择听筒/扬声器/蓝牙/有线耳机。
  • [TelecomSystem.java](file:///d:/Resource%20Android%2016/android-16/packages/services/Telecomm/src/com/android/server/telecom/TelecomSystem.java):Telecom 服务的系统入口。负责初始化所有组件。
  • [ConnectionServiceRepository.java](file:///d:/Resource%20Android%2016/android-16/packages/services/Telecomm/src/com/android/server/telecom/ConnectionServiceRepository.java):ConnectionService 的仓库。管理所有已注册的 ConnectionService 实现。
  • [ConnectionServiceFocusManager.java](file:///d:/Resource%20Android%2016/android-16/packages/services/Telecomm/src/com/android/server/telecom/ConnectionServiceFocusManager.java):管理不同 ConnectionService 之间的焦点切换。

3. Google 设计技巧深入分析

3.1 Connection/Call 双层抽象 — 通话分离的核心

这是 Telecom 最重要的设计决策:

Telephony Side (ConnectionService)        Telecom (Call)        UI Side (InCallService)
┌────────────────────────────┐       ┌──────────────┐       ┌──────────────────────┐
│ TelephonyConnectionService │       │              │       │ DialerInCallService   │
│  └→ Connection (CS/VoLTE)  │ ←───→ │     Call     │ ←───→ │  └→ InCallService UI  │
│                            │       │              │       │                       │
│ VoIPConnectionService      │       │ (状态管理)    │       │ CarInCallService      │
│  └→ Connection (SIP)       │ ←───→ │              │ ←───→ │  └→ 车载 UI            │
└────────────────────────────┘       └──────────────┘       └──────────────────────┘
  • Connection(左侧):由 ConnectionService 创建,代表"媒体通道已经建立"
  • Call(中间):Telecom 的抽象,独立于任何具体的 ConnectionService
  • InCallService(右侧):将 Call 的状态渲染为 UI

Google设计技巧 #1 — ConnectionService ↔ InCallService 的"桥接模式"解耦:
Call 类中通过 CachedCallback 统一管理状态回调和队列回调:

static final int TYPE_QUEUE = 1;   // 批量处理的回调(如视频状态切换)
static final int TYPE_STATE = 2;   // 状态变更回调(如 ACTIVE→HOLDING)

这种分类允许 Telecom 在 TYPE_QUEUE 场景下做批量优化,减少不必要的 IPC 调用。而 TYPE_STATE 的回调需要立刻处理。

3.2 CallsManager — 通话调度状态机

public class CallsManager extends Call.ListenerBase
        implements CreateConnectionResponse, EventManager.Loggable {
   
   
    
    // CallsManager 监听每个 Call 的状态变化
    @Override
    public void onCallAdded(Call call) {
   
    ... }
    @Override
    public void onCallRemoved(Call call) {
   
    ... }
}

Google设计技巧 #2 — CallsManager 的 Listener 模式 + 分层处理:
CallsManagerListenerBase 提供了所有回调的默认空实现,InCallController 继承它并只重写自己关心的回调。这是一个"模板方法 + 观察者"的组合模式——基类定义所有可能的回调,子类选择性重写。

public abstract class CallsManagerListenerBase implements CallsManager.CallsManagerListener {
    
    
    public void onCallAdded(Call call) {
    
     }
    public void onCallRemoved(Call call) {
    
     }
    public void onCallStateChanged(Call call, int oldState, int newState) {
    
     }
    // ... 更多回调
}

3.3 PhoneAccount — 通话路由选择

PhoneAccount 是 Telecom 的路由机制核心——它将每个"电话能力"抽象为一个账户:

  • SIM 卡通话:PhoneAccount 对应一个 SubId
  • VoIP 通话:PhoneAccount 对应一个 VoIP 应用(如 WhatsApp)
  • 紧急呼叫:PhoneAccount 带有 CAPABILITY_PLACE_EMERGENCY_CALLS 标记
public class PhoneAccount {
   
   
    public static final int CAPABILITY_PLACE_EMERGENCY_CALLS = 0x10;
    public static final int CAPABILITY_SIM_SUBSCRIPTION = 0x01;
    // ...
}

Google设计技巧 #3 — PhoneAccount 架构解决的问题:
在没有 PhoneAccount 之前,Android 通话只有一个"默认电话应用"。引入 PhoneAccount 后:

  • 用户可以在 Dual-SIM 设备上选择"用 SIM1 打"还是"用 SIM2 打"
  • VoIP 应用可以与系统电话应用平级——用户可以在通讯录中选择"用 WhatsApp 呼叫"还是"用电话呼叫"
  • 每个 PhoneAccount 关联一个 ConnectionService,Telecom 通过它找到正确的底层服务

3.4 CallAudioRoute — 音频路由状态机

CallAudioRouteStateMachine 管理音频输出设备的自动选择:

public class CallAudioRouteStateMachine extends StateMachine implements CallAudioRouteAdapter {
   
   
    // 音频路由由 Peripheral Adapter 监听物理设备变化
    // 通过 StateMachine 自动切换
}

CallAudioRoutePeripheralAdapter 监听外部设备:

public class CallAudioRoutePeripheralAdapter implements WiredHeadsetManager.Listener {
   
   
    // 监听有线耳机插拔
    // 监听蓝牙 SCO 连接
}

Google设计技巧 #4 — StateMachine + Adapter 的音频路由架构:
音频路由是一个典型的"环境感知"场景——设备插入/拔出耳机、蓝牙连接/断开、用户手动切换听筒/扬声器。CallAudioRouteStateMachine 使用 StateMachine(Android 的经典状态机框架)管理这些转换,CallAudioRoutePeripheralAdapter 负责感知物理设备变化。两者通过 CallAudioRouteAdapter 接口解耦。

3.5 InCallController — 多 UI 端支持

public class InCallController extends CallsManagerListenerBase {
   
   
    public class InCallServiceConnection {
   
    ... }
    public static class InCallServiceInfo {
   
    ... }
    
    // 一个 InCallServiceBindingConnection 绑定一个 InCallService
    private class InCallServiceBindingConnection extends InCallServiceConnection {
   
    ... }
}

Google设计技巧 #5 — 一个 Telecom 实例支持多个 InCallService 同时连接:
Telecom 不是只绑定一个 Dialer 应用。它通过 InCallController 管理多个 InCallServiceConnection,每个 InCallServiceConnection 绑定一个不同的 UI 提供方(如 Dialer + 车载系统 + 穿戴设备)。这一设计使多屏生态成为可能——用户在车载屏幕上接电话的同时,手机上的 Dialer UI 也同步显示通话状态。

3.6 ConnectionServiceFocusManager — 多服务焦点管理

public class ConnectionServiceFocusManager {
   
   
    // 当多个 ConnectionService 需要同时使用音频时
    // 焦点管理器决定哪个服务持有音频焦点
}

Google设计技巧 #6 — 服务间音频焦点的仲裁机制:
在 Multi-SIM 或 CS+VoIP 混合场景,可能有多个 ConnectionService 同时活跃。ConnectionServiceFocusManager 决定哪个服务获得音频焦点——例如,当 CS 通话被 hold,VoIP 通话变为 active 时,焦点管理器将音频路由从 CS 转移到 VoIP。

这与 Android 的 AudioManager 音频焦点系统协同工作,但专门针对通话场景进行了优化。

4. 核心架构

4.1 分层关系

【android telecom 框架分析 01】【基本介绍 1】【telecom服务是干什么的?】 Telecom 是 Android 的系统服务之一,全名。它负责协调电话呼叫的整个生命周期,是电话应用与底层电话实现(比如 Bluetooth、IMS、SIM 卡)之间的桥梁。管理通话(呼入、呼出、挂断)统一通话来源(SIM 卡、VoIP、蓝牙)管理来电界面多方通话管理(例如三方通话)音频路由控制(比如车机使用蓝牙或扬声器)功能点描述通话管理通过管理所有电话状态音频路由控制是走车载扬声器、蓝牙耳机或手机扬声器多方通话管理多个同时存在的Call对象,提供合并/切换通话能力。 阅读详情

相关推荐

深入解析Android Telecom:System进程中的通话管理核心

本文深入解析了Android Telecom系统服务,作为运行在System进程中的通话管理核心,它在Telephony底层模块与InCallUI用户界面之间扮演着“中央调度员”的关键角色。文章详细剖析了其启动流程、与Telephony和InCallUI的IPC协作机制、以CallsManager为核心的消息驱动架构,并介绍了开发者如何通过TelecomManager API集成VoIP应用,实现统一通话管理。

s1t2u3的博客 785

安卓电话交互桥梁 Telecom【System进程】

1. Telecom所处位置 由下图,Telecom的作用是起到交互桥梁,与IncallUI 和 Telephony【Phone进程】交互 2. 什么是Telecom 服务 telecom所处的代码路径: 代码路径: /packages/services/Telecomm /frameworks/base/telecomm/java/android/telecom/ Telecom是Android的一个系统服务,其主要作用是管理Android系统当前的通话,如来电显示,接听电话,挂断电

mike_jun的博客 8229

Android车机系统蓝牙通话全解析:从Telecom框架到HFP协议实战

本文深入解析Android车机系统中蓝牙通话的实现机制,从Telecom框架的核心设计到HFP协议的实际应用。详细介绍了Telecom框架的分层设计、车机特有优化点,以及HFP协议的关键AT指令和状态同步机制,为车载系统开发者提供全面的技术参考。

weixin_30632089的博客 620

Android Telecom框架实战:车机蓝牙通话全流程解析(附常见问题排查)

本文深入解析Android Telecom框架在车机蓝牙通话中的实战应用,涵盖拨号、接听、音频路由及三方通话等全流程。通过剖析Telecom服务、蓝牙连接服务与协议栈的交互,为开发者提供清晰的架构认知与高效的性能调优指南,并附有拨号失败、无声音等常见问题的系统性排查思路。

weixin_29179311的博客 262

Telecom - 002 - CallsManager

与通话相关的绝大多数操作都与CallsManager类相关,因此在对Telecom中的各种功能和机制分析之前,有必要先对CallsManager进行一定的了解。

1218

【android telecom 框架分析 02】【CallAudioModeStateMachine介绍 1】【CallAudioModeStateMachine 整体介绍】

CallAudioModeStateMachine 介绍

奔跑吧 android 的博客 1449

Google推出Telecom Jetpack库,让Android通话应用创建更简单

Telecom Jetpack库的最新Alpha版本已经推出。该库提供了多个API,以简化Android开发者创建语音和/或视频通话应用程序的过程,支持常见功能,例如接听/拒绝、音频路由等等。

虎哥LoveDroid 974

从生成到检测:全面解析Deepfake技术的演进与对抗策略

本文全面解析了Deepfake技术的演进与对抗策略,从GAN生成技术到先进的检测手段,探讨了其在娱乐与安全领域的双重影响。文章详细介绍了Deepfake的核心原理、技术迭代关键节点以及最新的检测方法,揭示了AI生成与识别的激烈博弈。同时,展望了量子计算和生物特征认证在未来攻防战中的潜在应用。

jenkins8butler的博客 255

THUCNews新闻文本分类-tfidf+sklearn

本文使用的是和鲸社区现有数据集,代码也在和鲸社区公开,fork之后可以直接运行。 本文中所用的数据集清华NLP组提供的THUCNews新闻文本分类数据集的一个子集(原始的数据集大约74万篇文档,训练起来需要花较长的时间)。 本次训练使用了其中的体育, 财经, 房产, 家居, 教育, 科技, 时尚, 时政, 游戏, 娱乐10个分类,每个分类6500条,总共65000条新闻数据。项目在和鲸社区的平台上跑的,数据集直接引用了和鲸的数据集,每个分类6500条,总共65000条新闻数据。 数据集划分如下: cnews

wmq104的博客 4591

Gartner 2025 中国网络安全成熟度曲线深度解读:AI 安全如何重构防御逻辑

2025 年 Gartner 中国网络安全技术成熟度曲线的发布,标志着国内网络安全领域正式进入 “AI 原生防御” 时代。这份聚焦中国市场特性的报告清晰揭示:网络安全的核心命题已从 “防御 AI 驱动的攻击” 演进为 “保障 AI 系统自身安全与业务协同”,AI 安全技术正成为重构企业防御体系的核心引擎。

KKKlucifer的博客 1387

告别手动标注!PDMS NakiToolkit插件安装与初体验:以Pipeline工具为例

本文详细介绍了PDMS NakiToolkit插件的安装与使用,特别是其Pipeline工具如何通过自动化标注和材料统计功能大幅提升三维工厂设计效率。从环境准备到实战演示,帮助工程师告别繁琐的手动标注工作,实现项目交付周期的大幅缩短。

weixin_30047059的博客 350

usb设备的定位信息获取

一个usb hub有20个口,每个口有一个标号,那么如果一个为X的标号插入了一个android设备,如何通过函数,得到这个X,代码实现如下,获取了location, 得到类似 Port_#0002.Hub_#0003 的字符串,然后,要对应一个表。

babytiger的专栏 2106

Spring Cloud 整合(一) CRUD

Springcloud 整合之 CRUDSpringcloud介绍功能概述为什么要选用Springcloud Springcloud介绍 功能概述 实现微服务 Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。 为什么要选用Springcloud

Kerwin-Lin的博客 1501

调试GMS应用,报错“此设备未获得play保护机制认证”问题解决

不少同学在调试GMS相关应用时,需登录Google账号,有时会弹出如下通知。Google登录界面也会出现如下提示这个报错的原因是设备未通过Google认证,google服务器未配置荣耀设备的型号白名单导致国内网页有一些指导方法在鸿蒙\荣耀的设备上消除这个提示,但本质的问题没有解决,无法登录Google账号。

胡同老道的博客 2万+

华为OD机试双机位C卷:流量波峰 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷 流量波峰,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 流量波峰。

qq_45776114的博客 2445

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 【Telephony】IPC 跨层通信机制深度解析 (Binder & HAL)
下一篇: Android Tethering/netd 集成架构深度分析
爆打葡萄汁
博客等级 码龄7年 30粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值