android Gsm通话状态机和相关数据结构

本文详细解读Phone通话相关的数据结构,包括RingingCall、ForgoundCall和BackgroundCall,以及它们在GSM网络中的特性。同时阐述GSM通话状态机的工作原理,包括会议通话、来电接听、挂断、合并和交换功能等核心操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.framework 中Phone通话相关的数据结构


代码位置位于framework/opt/telephony

Phone的通话状态维护是由CallTracker负责,CallTracker中有三个Call的对象,分别是RingingCall:对应来电,来电分为第一路来电,状态为call incoming,第二路来电call waiting;

ForgoundCall:前台通话,正在进行通话的Call;

BackgroundCall:后台通话,保持的通话在这一路,实际上只有Gsm网络有这个概念,CDMA中这个Call的Connections永远为零。

每个Call可以有0~n个Connection对象:RingingCall的话最多只有1个,ForegroundCall在GSM最多可以有5个(对应于会议通话),CDMA最多只有2个;BackgoundCall在GSM最多可以有5个(会议通话被保持的情况),CDMA只有0个。GSM的总Connection数目最大限制是7,即RingingCall 为1Connection,ForgroundCall和BackgroundCall为5 Connections + 1Connection。CDMA ForgroundCall最大数目限制为2,总Connection数目最大限制也是2,即Cdma最多是三方通话,然后就不能拨出或打入电话。

Connection对象实际上对应于AT+CLCC回应消息中的每个对象,在CallTracker的handlePollCalls中可以看到,程序是先将CLCC返回结果强制转换为DriverCall的列表,然后依据不同的情况再将DriverCall转换为Connection再挂到不同的Call上。如来电的话会将对应的Connection挂接到RingingCall上,如果用户接听就将其从RingingCall上摘下然后挂到ForegroundCall上,如果用户按了保持按键后就将其从ForegroundCall上摘下然后挂到BackgroundCall上,如果通话结束就将对应的Connection从Call中移除。

Connection可以看成基本是具体的对应于CLCC返回结果的对象,Call是某些具有逻辑共性Connection对象的合集,CallTracker是通话维护和管理的类,Phone是通信模块的抽象(通话只是一部分功能,其他的功能有短信、数据连接、UTK、STK、卡联系人等等)。

 

2.Gsm通话状态机



图画的初略,表示并不太确切,其实可以画更多的状态点的。

会议通话和一路通话相同处:只是一个Call,只是会议通话的Call 中Connections数目大于1而已,除去会议管理的功能在状态机中的表现是相同的。状态2和状态3中的ForeroundCall或BackgroundCall都可能是一个会议通话。

状态2中的来电接听要在通话设置中打开呼叫等待。接听后原先的通话成为BackgroundCall,来电成为ForegroundCall。保持和解除保持功能则让通话在BackgroundCall和ForegroundCall间切换,被保持的一方可以听到基站发送的音乐声。

状态3中的挂断目前的实现目前就是挂断ForegroundCall,BackgroundCall恢复成ForegroundCall。实际上可以做到单独挂断BackgroundCall,不过好像目前没做,也无此规范要求。

状态3中的来电接听,必须要挂断ForeroundCall或者BackgroundCall才能接听。

状态3的合并功能要求开通多方通话业务。合并后成为会议通话,即BackgoundCall中的Connection合并到ForegroundCall中,BackgroundCall中Connections数目变为0。

状态3 的交换功能要求让通话在BackgroundCall和ForegroundCall间切换,被保持的一方可以听到基站发送的音乐声。

状态4中可以进入会议管理模式,这个功能CDMA没有。进入会议管理模式后,可以查看当前会议通话的所有Connections,并可以单独挂断和分离某个Connection。

状态4中的单独挂断一个Connection后的状态依据Connection的数量不同而不同,如果还有2个或2个以上的Connection,则继续维持为会议通话;如果挂断后只有1个Connection,则迁移到状态2


### Android Dual-Mode 手机 RIL 设计与实现 #### 1. 双模手机中的 RIL 架构概述 Android 的 Radio Interface Layer (RIL) 是连接 Modem Android Framework 的桥梁。对于双模手机(例如支持 GSM/WCDMA 或 CDMA/LTE),其核心挑战在于如何管理两个不同的无线通信协议栈并提供一致的服务接口给上层应用[^1]。 在双模场景下,RIL 需要处理来自不同基带芯片的数据流,并将其抽象化为统一的 API 接口供 TelephonyManager 使用。这通常通过扩展标准 RIL 实现来完成,具体方法包括但不限于定义额外的状态标志位以及增强消息解析逻辑[^2]。 #### 2. 多上下文支持下的配置调整 为了使设备能够同时维持语音通话数据连接,在注册表项中设置 `Contexts` 参数至非零值是非常重要的一步操作;此外还需要启用特定功能键如断开按钮控制GPRS链接状态[HKEY_LOCAL_MACHINE/ControlPanel/Phone]"Flags2"=dword:8 这些改动有助于确保当处于DTM(Data Transfer Mode)模式期间不会意外丢失网络服务[^2]。 #### 3. 编译环境准备及相关工具链使用说明 构建适用于ARM架构处理器的目标文件时可以采用如下命令行参数指定编译选项make -C kernel O=../out/target/product/msm7630_surf/obj/KERNEL_OBJ ARCH=arm CROSS_COMPILE=arm-eabi- msm7630-perf_defconfig 此外还需注意调试接口的选择问题比如JTAG虽然强大但对于初学者来说可能较为复杂因此推荐优先考虑UART作为替代方案以便于快速定位解决问题所在[^3]。 #### 4. 呼叫信息结构体扩展 随着版本迭代更新到Windows Mobile 5.0之后,RILCALLINFO 结构得到了进一步扩充加入了disconnect code 元素用于描述呼叫终止原因等附加详情这对于提升用户体验具有重要意义因为现在不仅可以知道某个电话被挂掉了还可以了解到背后的具体缘由从而采取相应的补救措施或者向用户提供解释说明[^4]。 ```java public class MyDualSimRIL extends BaseCommands { public void dial(String address, int clirMode, ResultCallback callback){ // Custom logic for handling dual SIM scenarios. super.dial(address,clirMode,callback); } } ``` 以上代码片段展示了一个继承自BaseCommand类的新实例MyDualSimRIL ,其中重写了拨号函数以适应双重SIM卡情况下的特殊需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值