背景
以下內(nèi)容基于Android P code。 并以三方通話為例壮韭。
合并通話
IMS
先看下合并通話后Call、Connection的變化:
1. 合并通話后把新的ImsCallSession給了原來的foreground的ImsCall胖翰,原來的兩個ImsCallSession都斷開了帕膜。
2. 保留foreground的ImsCall給會議電話用。
3. 保留foreground的ImsPhoneConnection的給會議電話用拦宣。
4. 原本的fg bg TelephonyConnection都被斷開了截粗。從原來的fg TelephonyConnection來clone了會議電話的host connection,并創(chuàng)建了ImsConference和它的child connection鸵隧。
以三方通話為例绸罗,merge成功后有三個TelephonyConnection,一個為ImsConference的host connection豆瘫,另外兩個為ImsConference的paticipant connection珊蟀。
5. 原來的fg bg Telecom/Call被掛斷,新創(chuàng)建了會議電話的parent外驱、child Call育灸。
合并成功后有三個TelephonyConnection,Telecom/Call也有三個(會議電話和它的參與者)昵宇。ImsConference對應(yīng)parent Call磅崭,ConferenceParticipantConnection對應(yīng)child Call。它們構(gòu)成樹結(jié)構(gòu)的父子關(guān)系瓦哎。
這里需要注意的是砸喻,正常情況下是Telecom先創(chuàng)建Telecom/Call,再通過ConnectionService來創(chuàng)建telecom/Connection蒋譬,創(chuàng)建成功后再把telecom/Connection的信息填到Telecom/Call中割岛。但會議電話是先有telecom/Connection,再通知Telecom創(chuàng)建這個Connection的Call羡铲。如圖
5. InCallUI的Call同telecom一致蜂桶,原來的兩通Call被掛斷儡毕,而新成了三通構(gòu)成父子結(jié)構(gòu)的Call也切。
其中child Call因為界面設(shè)計的需要在getState時不是返回ACTIVE狀態(tài)而是CONFERENCED,用來表明這通Call是電話會議中的子Call腰湾。
總的來說就是:
1. 原本的fg bg通話都有自己的ImsPhoneConnection ImsCall ImsCallSession雷恃,但合并后只有會議電話的ImsPhoneConnection ImsCall ImsCallSession,從二變一费坊。
2. Telephony創(chuàng)建會議電話ImsConference和它的參與者ConferenceParticipantConnection倒槐,并把它們傳給Telecom,Telecom為它們建立樹結(jié)構(gòu)父子關(guān)系Call附井,并傳遞給InCallUI讨越。
其流程圖如下:
創(chuàng)建ImsConferece和其參與的Connection見上面圖”創(chuàng)建正常Telecom/Call和創(chuàng)建會議電話Telecom/Call的區(qū)別“两残。
GSM
GSM和IMS不同,其merge后只增加了一個conference call把跨,不會斷開之前的call人弓。如圖
其主要變更如下:
1. HOLD的通話變active。
2. 新建了會議電話TelephonyConference着逐,原有兩通電話的TelephonyConnection為它的參會者崔赌。
3. TelephonyConference會在Telecom創(chuàng)建對應(yīng)的Call,并和原有的Call構(gòu)建父子關(guān)系耸别。
其流程圖如下:
構(gòu)建會議電話和其參考者的流程圖:
和ims的會議電話一樣健芭,Telecom的parent call是由Telephony要求創(chuàng)建的。
IMS與GSM的對比
1. IMS合并通話后只保留原fg call的ImsCall秀姐、ImsPhoneConnection慈迈。GSM合并通話后原有的fg bg call的DriverCall、GsmCdmaConnection保持不變囊扳,但bg call的狀態(tài)由HOLD變?yōu)锳CTIVE吩翻。
2. IMS創(chuàng)建會議電話ImsConference時從原fg TelephonyConnection處克隆了一個conference host TelephonyConnection。GSM創(chuàng)建會議電話TelephonyConfence后并沒有創(chuàng)建一個conference host TelephonyConnection锥咸。
3. IMS合并通話后斷開了原來Call的TelephonyConnection狭瞎,而新建了會議電話參會者的TelephonyConnection,并通過這些Connection來創(chuàng)建Telecom/Call搏予。GSM保留原來的TelephonyConnection和Telecom/Call熊锭。
CDMA
CDMA在撥打或者接聽第二通電話時就自動變?yōu)闀h電話,不需要用戶點擊合并通話按鈕雪侥。其狀態(tài)更新如下:
接聽:
撥打:
可以看到它與GSM的不同在于:
1. CDMA第二通通話撥打或接聽后直接變成會議電話碗殷。GSM需要用戶發(fā)送合并通話的請求。
2. CDMA會議電話僅有一個DriverCall速缨、GsmCdmaConnection锌妻。GSM會議電話有和參會者數(shù)量相同的DriverCall、GsmCdmaConnection旬牲。
3. CDMA添加通話后原通話的HOLD狀態(tài)直接在TelephonyConnection創(chuàng)建一個假狀態(tài)仿粹,并由計時器在指定時間后恢復(fù)ACTIVE。GSM添加通話后的HOLD的狀態(tài)由網(wǎng)絡(luò)端返回原茅。
4. CDMA在通話中來電不會收到來電通知而是收到call waiting通知吭历,同時不會新增DriverCall而是構(gòu)建CdmaCallWaitingNotification來創(chuàng)建新來電的ImsPhoneConnection。GSM在通話中來電仍是收到來電通知并通過構(gòu)建DriverCall來建立ImsPhoneConnection擂橘。
5. CDMA的會議電話參會者之間不會構(gòu)成Conferenceable關(guān)系晌区,GSM會。
其具體流程圖如下:
接聽:
撥打:
分離通話
IMS
IMS不支持分離通話。
GSM
GSM的分離通話就是合并通話的反向過程朗若,分離通話后DriverCall變成非conference call恼五,且狀態(tài)變回一通HOLD一通ACTIVE。TelephonyConference發(fā)現(xiàn)沒有參與電話會議的TelephonyConnection后銷毀自己哭懈。其流程如下:
父子關(guān)系的解離流程單獨列出如下:
CDMA
CDMA不支持分離會議電話
掛斷會議電話中的一方通話
IMS
掛斷一方通話后唤冈,這個participant的status變成disconnected,conference和另外的participant的狀態(tài)不變银伟。如圖
其流程如下:
ImsCall不會把掛斷的participant加入到會議電話的參會者列表中去你虹,ImsConference收到更新的參會者列表時發(fā)現(xiàn)有參會者不見了便會把這個參會者的Connection設(shè)置為DISCONNECTED。
當(dāng)掛斷的通話是會議電話最后一個參會者時彤避,收到callSessionConferenceStateUpdate更新該參會者的ImsConferenceState的狀態(tài)為disconnected后傅物,IImsCallSessionListener還會收到callSessionTerminated的通知,它會掛斷會議電話琉预。如圖
GSM
掛斷一方通話后董饰,DriverCall只剩沒掛斷的那通,且不再是conference圆米。因此TelephonyConference發(fā)現(xiàn)沒有至少2個會議參加者后會銷毀自己掛斷會議電話卒暂。這樣整個通話就剩一通正常通話。其流程和GSM分離通話基本一樣娄帖。其狀態(tài)變更圖如下:
IMS和GSM的區(qū)別
IMS會議通話中的一方斷開后會議電話仍存在也祠,不會掛斷ImsConference,剩下一方參會者仍是conference call近速。GSM會掛斷TelephonConference诈嘿,剩下一方參會者不再是conference call。
CDMA
CDMA不能僅掛斷一方通話削葱。當(dāng)對方掛斷通話后本機不會收到網(wǎng)絡(luò)通知奖亚。
原創(chuàng)內(nèi)容歡迎轉(zhuǎn)載,但請注明出處析砸,謝謝昔字!