语音通话业务 (Voice Call) 架构设计

Android 9 IMS通话全解析:从拨号到通话的完整流程与底层实现 本文深入解析了Android 9系统中IMS通话的完整流程与底层实现。从用户拨号开始,详细阐述了Telecom框架、ImsManager如何协同工作,并重点剖析了ImsService API如何作为桥梁,将通话请求路由至供应商的IMS协议栈,最终通过SIP信令建立高清语音通话。文章旨在帮助开发者理解现代VoLTE通话背后的核心技术架构与决策逻辑。 阅读详情

description: “语音通话业务的核心架构设计,剖析 Android 手机从拨号到挂断的完整 CS/IMS 通话流程、呼叫路由决策、通话状态机及 SRVCC 切换机制。”

语音通话是 Telephony 最核心的业务之一。Android 16 的语音通话架构同时支持传统的 CS 域通话(2G/3G 电路交换)和基于 IMS 的 VoLTE/VoWiFi 通话(4G/5G 分组交换),并通过智能路由机制在两者之间自动选择。

架构演进提示:
Android 16 中,GsmCdmaCallTracker 统一了 GSM 和 CDMA 两种无线接入技术的 CS 通话处理,而 ImsPhoneCallTracker 则负责所有 IMS 承载的语音/视频通话。两者通过 GsmCdmaPhone.dial() 中的路由逻辑实现无缝切换。

1. 核心概念与术语

  • CS Call (Circuit Switched Call):电路交换通话,传统的 2G/3G 语音通话方式。通话期间独占一条无线信道。
  • IMS Call (IP Multimedia Subsystem Call):基于 IP 的多媒体通话,包括 VoLTE (Voice over LTE)、ViLTE (Video over LTE)、VoWiFi (Voice over WiFi)。
  • MO Call (Mobile Originated Call):手机主动发起的呼出通话。
  • MT Call (Mobile Terminated Call):手机接收的呼入通话。
  • SRVCC (Single Radio Voice Call Continuity):当用户在 VoLTE 通话过程中移出 LTE 覆盖范围时,将通话从 IMS 域无缝切换到 CS 域的技术。
  • Conference Call:多方通话(电话会议),将多个通话合并为一个会议。
  • Call Waiting:呼叫等待,当用户正在通话中时收到新的呼入。

2. 核心类与源码锚点 (Source Code Anchors)

2.1 CS 域通话核心类

  • [GsmCdmaCallTracker.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java):CS 域通话的"总指挥",位于 frameworks/opt/telephony。负责管理 GSM/CDMA 通话的完整生命周期,包括拨号、接听、挂断、三方通话、呼叫等待等。
  • [GsmCdmaCall.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaCall.java):代表一个 CS 通话组(如前台通话、后台通话、振铃通话),内部维护一组 GsmCdmaConnection。
  • [GsmCdmaConnection.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaConnection.java):代表一个具体的 CS 通话连接(即一路通话),包含通话地址、通话状态、断开原因等信息。
  • [Call.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/Call.java):所有通话类的抽象基类,定义了 Call.State 枚举和通话的基本操作。
  • [Connection.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/Connection.java):所有通话连接的抽象基类,定义了连接的生命周期和状态。

2.2 IMS 域通话核心类

  • [ImsPhoneCallTracker.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java):IMS 域通话的"总指挥",负责管理所有 IMS 承载的语音/视频通话。通过 MmTelFeature 与 Vendor IMS 服务交互。
  • [ImsPhoneCall.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/imsphone/ImsPhoneCall.java):代表一个 IMS 通话组。
  • [ImsPhoneConnection.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java):代表一个具体的 IMS 通话连接。

2.3 通话路由核心类

  • [GsmCdmaPhone.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaPhone.java):代表一个物理 SIM 卡槽对应的 Phone 实例。其 dial() 方法是通话路由的决策中心,决定呼叫走 CS 域还是 IMS 域。
  • [ImsPhone.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/imsphone/ImsPhone.java):IMS Phone 实例,作为 GsmCdmaPhone 的伴生对象存在,专门处理 IMS 承载的通话。

2.4 通话状态定义

  • [PhoneConstants.java](file:///d:/Resource/Android%2016/android-16/frameworks/base/telephony/java/com/android/internal/telephony/PhoneConstants.java):定义了 Phone 级别的三个宏观状态:IDLE(空闲)、RINGING(振铃)、OFFHOOK(摘机/通话中)。

3. 通话对象模型 (Call Object Hierarchy)

Android 框架通过严格的层级关系在内存中模拟了通话的物理和逻辑结构。

"持有 3 个 Call 对象"

"1 对 多"

"持有 4 个 Call 对象"

"1 对 多"

«abstract»

CallTracker

+CommandsInterface mCi

+dial()

+hangup()

+acceptCall()

+rejectCall()

GsmCdmaCallTracker

-GsmCdmaConnection[] mConnections

-GsmCdmaConnection mPendingMO

+GsmCdmaCall mRingingCall

+GsmCdmaCall mForegroundCall

+GsmCdmaCall mBackgroundCall

+PhoneConstants.State mState

+dialGsm()

+dialCdma()

+updatePhoneState()

ImsPhoneCallTracker

-ImsPhoneConnection mPendingMO

+ImsPhoneCall mRingingCall

+ImsPhoneCall mForegroundCall

+ImsPhoneCall mBackgroundCall

+ImsPhoneCall mHandoverCall

+ImsManager mImsManager

+dial()

+dialInternal()

«abstract»

Call

+State mState

+ArrayList<Connection> mConnections

GsmCdmaCall

+GsmCdmaCallTracker mOwner

ImsPhoneCall

+ImsPhoneCallTracker mOwner

«abstract»

Connection

+State mState

+DisconnectCause mCause

GsmCdmaConnection

+int mIndex

+GsmCdmaCall mParent

ImsPhoneConnection

+ImsCall mImsCall

+ImsPhoneCall mParent

3.1 三个核心 Call 对象的设计意图

GsmCdmaCallTracker 和 ImsPhoneCallTracker 都维护了多个 Call 对象,这是为了模拟 GSM/CDMA 协议中通话的多路复用模型:

Call 对象 含义 典型场景
mRingingCall 振铃通话 有新来电正在振铃,或呼叫等待中
mForegroundCall 前台通话 当前正在进行的活跃通话
mBackgroundCall 后台通话 被保持(Hold)的通话
mHandoverCall 切换通话 (仅 IMS) SRVCC 切换过程中临时持有的通话

GSM 通话容量:最多 19 个连接(MAX_CONNECTIONS_GSM = 19),每个 Call 最多 5 个连接(MAX_CONNECTIONS_PER_CALL_GSM = 5)。其中 7 个用于 GSM 自身,12 个预留给 IMS SRVCC 切换。

CDMA 通话容量:最多 8 个连接(MAX_CONNECTIONS_CDMA = 8),每个 Call 最多 1 个连接(MAX_CONNECTIONS_PER_CALL_CDMA = 1)。

4. 通话状态机 (Call State Machine)

4.1 Call.State — 单个通话组的状态

定义在 [Call.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/Call.java) 中,映射自底层 DriverCall.State:

初始状态

发起拨号 (MO Call)

收到呼入 (MT Call)

被叫方开始振铃

被叫方接听

已有通话时收到新来电

用户接听

用户切换接听

用户保持通话 / 接听新来电

用户恢复通话

用户挂断 / 对方挂断

挂断保持中的通话

拨号取消

拨号取消

拒接来电

拒接等待中的来电

断开完成

Telephony MO CALL/IMS CALL 本篇文章介绍Telephony的MO(Mobile Original) call 的流程。 1.拨号App中输入号码并拨号,Android的源生的拨号App为Dialer(packages/apps/Dialer) 下面看一下在输入完号码,点击拨号按钮后,Dialer中都做了什么事情。 首先触发的是UI点击事件 DialpadFragment handleDialButtonPresse 阅读详情

相关推荐

OpenClaw语音通话插件部署指南:从架构解析到企业级实战

实时语音交互是AI智能体应用的重要演进方向,其核心在于将语音信号与自然语言处理无缝衔接。技术原理上,通过WebRTC建立实时音视频通信通道,结合语音转文本(STT)和文本转语音(TTS)服务,构建“听-转-思-转-说”的完整闭环。这一架构为AI客服、个人助理等场景提供了更自然、高效的交互方式,其技术价值在于打破文本交互的局限,实现类人实时对话体验。在应用层面,开发者需根据隐私、成本和延迟需求,在云端服务(如Azure Speech、OpenAI Whisper)与本地方案(如Faster-Whisper、E

weixin_34235457的博客 305

手机状态栏HD是什么意思?一文读懂VoLTE高清语音通话

手机信号栏出现HD,是运营商启用高清语音通话的标志。这项体验背后是VoLTE技术:将语音以IP数据包形式承载于4G LTE网络,替代传统回落2G/3G的语音通道。相比旧方案,VoLTE带来更宽的传输带宽与更高质量的音频编码,让通话声音更清晰、接通速度更快,还能在通话过程中保持网络连接。对经常打电话、玩游戏或看视频的用户而言,这一技术切实改善了日常通信体验。如今三大运营商已默认开通相关服务,用户可通过手机设置中的VoLTE开关手动控制。了解HD的含义与原理,也能帮助排查信号异常、耗电等问题。本文将结合工程实践

weixin_31476015的博客 259

Grok Voice规模化服务Starlink:语音网关与会话编排实战

在全球化业务快速扩张的当下,高效智能的语音交互系统成为企业提升客户体验的关键。从传统的IVR按键导航到基于自然语言处理的对话式AI,语音客服的技术原理正经历深刻变革。通过语音网关接入、会话状态机编排以及意图识别与业务系统联动,企业可以构建稳定可靠的自动化客服与销售支撑体系。这类系统不仅适用于呼叫中心智能化改造,也在跨国卫星互联网服务等复杂场景中展现出巨大价值,能够应对时区覆盖、网络波动和规模化并发等挑战。本文围绕Grok Voice在Starlink客服与销售场景中的工程实践,完整展示了从语音网关到会话编排

weixin_30564785的博客 301

OpenClaw语音通话插件实战:从架构原理到SIP部署与优化

语音交互是人机交互的核心技术之一,其基本原理是通过自动语音识别将音频信号转换为文本,再经由自然语言处理模型理解并生成回复,最后通过语音合成技术将文本转化为自然语音输出。这项技术的关键价值在于打通了人类最自然的沟通方式与人工智能的认知能力,极大地提升了在移动、多任务及无障碍场景下的交互效率和体验。在客服自动化、智能家居控制、车载助手等实时性要求高的应用场景中,语音交互已成为不可或缺的解决方案。本文以OpenClaw语音通话插件为例,深入解析如何构建一个支持SIP协议、能够与传统电话网络集成的实时语音AI助手。

weixin_30412167的博客 502

深入Android电话流程:GsmCallTracker实战分析

本文还有配套的精品资源,点击获取 简介:在Android系统中,电话流程管理涉及到核心接口 Phone 及其子类如 GsmCallTracker ,用于模拟和管理电话状态变化。本文将深入探讨 GsmCallTracker 的工作机制,以及如何通过模拟电话状态来测试和验证电话管理功能。开发者将通过学习这个流程,理解电话状态变化通知、多...

weixin_30820933的博客 830

Android的Telephony框架

NULL 博文链接:https://forhope.iteye.com/blog/1276387

软件工程:数据字典

数据字典

永远怀着至诚之心拥抱世界 4275

手把手教你搭建硬件在回路(HIL)仿真系统:从Simulink建模到实时测试

本文详细介绍了如何从零开始搭建硬件在回路(HIL)仿真系统,涵盖Simulink建模、实时仿真、代码生成及调试等关键步骤。通过具体配置示例和优化技巧,帮助开发者解决复杂控制系统验证中的技术难题,提升半实物仿真的效率和可靠性。

weixin_30952535的博客 445

手把手教你用TUSB2E22中继器实现eUSB2与USB 2.0互转(附实测数据对比)

本文详细介绍了如何利用TUSB2E22中继器实现eUSB2与USB 2.0的高效互转,包括技术背景、硬件设计要点、信号完整性测试方法及故障排查策略。通过实测数据对比,展示了TUSB2E22在信号延迟、功耗和眼图性能上的显著优势,为工程师提供了实用的工程方案。

weixin_29199873的博客 283

ResNet理论基础与具体实现(详细教程)

论文地址:Deep Residual Learning for Image Recognition ​ Identity Mappings in Deep Residual Networks pytroch源码地址:resnet 0x00 前言 ResNet是2015年就提出的网络结构,中文名字叫作深度残差网络,主要作用是图像分类。现在在图像分割、目标检测等领域都有很...

coordinate的博客 8332

玩转RecyclerView | 实现子视图叠加 | 3D画廊效果 | 高级动效 | Android 3D坐标系介绍

之前写的一篇文章展示了RecyclerView实现的画廊效果,适用于专辑/图片/列表浏览效果。本篇文章阐述如何基于RecyclerView实现如下图所示的3D画廊效果。以下效果的重点在于实现子视图的图层叠加,滑动过程中的3D旋转效果较为简单。(1)无3D旋转效果图片(1)带3D旋转效果图片。

qq_38237224的博客 8155

2023年全国青少年信息素养大赛复赛真题(C++智能算法复赛真题:带解析)

2023年全国青少年信息素养大赛复赛真题(C++智能算法复赛真题:带解析)

王老师青少年编程 2114

学Simulink——基于Simulink的扰动观测器(DOB)补偿坡道重力分量

(质量5kg,坡度30°,目标速度1m/s)为例,基于Simulink搭建“DOB+PI”复合控制仿真平台,从系统建模、DOB算法推导、离散化实现到Simulink模块搭建,提供模块化模型、核心代码及参数整定表,帮助工程师彻底解决重力等恒值扰动引起的稳态误差问题。采用双线性变换(Tustin): s=Ts​2​z+1z−1​,其中 Ts​为控制周期。模块相加(注意符号:ufinal​=upi​−ucomp​或 upi​+ucomp​,取决于扰动定义方向,此处假设重力为正,控制力需反向抵消,故为减)。

MHD0815的博客 69

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

算法如诗的博客 5588

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 【Netd】初始化解析
下一篇: 运营商配置 (CarrierConfig) 架构设计
爆打葡萄汁
博客等级 码龄7年 30粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值