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

来源:互联网 发布:赛捷软件 编辑:程序博客网 时间:2024/05/29 04:00

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


0 0