Android IMS 通話應(yīng)用設(shè)計

背景

以下內(nèi)容基于Android P code。

應(yīng)用框架設(shè)計

Android電話模塊是一個典型的分層結(jié)構(gòu)設(shè)計妆棒,如下:

分層結(jié)構(gòu)

IMS在CS通話的基礎(chǔ)上增加了telephony/ims net/ims vendor/ims 和ims相關(guān)的media模塊糕珊。

其中:

telephony/ims:主要包括了對外接口ImsPhone红选,通話管理中心ImsPhoneCallTracker喇肋,某一路通話ImsPhoneCall苟蹈,某一路通話連接ImsPhoneConnection右核。需要實現(xiàn)的提供IMS相關(guān)服務(wù)的ImsService贺喝。

net/ims:主要包括提供了IMS services API的ImsManager,以及ImsManager創(chuàng)建的負責(zé)處理 IMS語音和視頻通話連接的ImsCall殷绍。

vendor/ims:主要包括了ImsService的實現(xiàn)類鹊漠,提供ims相關(guān)的服務(wù)躯概。負責(zé)和modem和media打交道娶靡,這一模塊由各個芯片廠商定制,所以各個芯片廠商的實現(xiàn)方式都不同塔鳍。但都有一個實現(xiàn)?ImsService的類轮纫。

IMS service

IMS的服務(wù)類蜡感,telephony通過ImsResolver來和綁定它。它的實現(xiàn)類必需在AndroidManifest中對它進行注冊以便fw檢測到它贝乎。

其主要結(jié)構(gòu)如下:

ims service 結(jié)構(gòu)

主要包括 ImsService览效、ImsManager锤灿、MmTelFeatureConnection但校、ImsCallSession啡氢。其中:

ImsService:ims的Service,實現(xiàn)了所有的ImsFeature(MmTelFeature和RcsFeature)和ims協(xié)議行為袭艺。通過ImsResolver綁定猾编。由ImsServiceController來負責(zé)管理其生命周期及這個service所支持的ImsFeatures答倡。其主要操作可以通過IImsServiceController來調(diào)用冻晤。

ImsManager:單例類鼻弧。提供了與IMS services交互的API攘轩,如創(chuàng)建ims call度帮。這個類是所有ims相關(guān)操作的起點笨篷。

MmTelFeatureConnection:IImsServiceController binder的容器類。

ImsCallSession:負責(zé)ImsCall的發(fā)起和終止练俐,以及兩個ims端點間的媒體交換腺晾。它和ImsService直接交互悯蝉。

其service的綁定過程如下:

ims service bind

可以看到鼻由,phone進程在創(chuàng)建后由ImsResolver通過ImsServiceController來綁定service嗡靡,service返回IImsServiceController給ImsServiceController讨彼,然后通過這個binder來創(chuàng)建IImsMmTelFeature的binder。之后可以通過TelephonyManager來獲取IImsMmTelFeature的binder哈误,用它可以獲取IImsCallSession的binder哩至。

具體的綁定流程如下:

ims service bind詳解

應(yīng)用間進程交互

交互方式如下:

ims 進程交互

在android o之前phone和ril的交互是通過socket,android o之后改成了HIDL蜜自。其余進程間的交互都是通過AIDL菩貌,具體交互方式如圖:

ims 進程交互細節(jié)

其中,phone到modem的過程重荠,CS Call是由RILRequest通過HIDL調(diào)用IRadio.hal再到modem箭阶,IMS Call是由ImsCallSession通過AIDL調(diào)用ImsCallSessionImpl再通過HIDL調(diào)用IImsRadio.hal再到modem戈鲁。而modem到phone的過程仇参,CS Call是由IRadioResponse.hal通過HIDL非主動上報結(jié)果給RadioResponse,而IRadioIndication.hal通過HIDL主動上報通知給RadioIndication婆殿,IMS Call則是從hal上報到Ims service诈乒,再通過ImsCallSessionListener通知到ImsCallSession。

總的來說就是IMS Call比CS Call在phone進程和ril hal中多了一層ims service婆芦。

通話流程

IMS Call結(jié)構(gòu)

先看CS Call和IMS Call的結(jié)構(gòu)對比:

call 結(jié)構(gòu)對比

從圖中可以看出怕磨,其實整體的設(shè)計模式差不多。其對比如下:

1. 對外接口GsmCdmaPhone對應(yīng)ImsPhone消约。

2. 一路通話的封裝類GsmCdmaCall對應(yīng)ImsPhoneCall肠鲫。

3. 通話中的某路連接GsmCdmaConnection對應(yīng)ImsPhoneConnection。

4. modem返回回來的某一路通話連接DriverCall對應(yīng)ImsCall或粮。

5. CS Call phone 通過IRadio滩届、IRadioResponse、IRadioIndication和RIL交互被啼。

6. IMS Call phone 通過IImsCallSession、IImsCallSessionListener棠枉、IImsMmTelListener和ims service交互浓体。

IMS Call MO流程

先看IMS和CS的對比:

MO 對比

可以看到CallTracker撥號之前的過程兩者一樣,CallTracker撥號時CS Call直接通過RIL用HIDL來調(diào)用IRadio.hal撥號辈讶;而IMS Call需要由ImsManager通過ImsCallSession用AIDL調(diào)用ImsCallSessionImpl命浴,再通過HIDL調(diào)用IImsRadio.hal來撥號,比CS Call多了ims service進程中的處理。

CallTracker撥號之前的過程可以參考我之前的文章?Android通話應(yīng)用設(shè)計生闲,其大致流程沒有變媳溺。這里補充一下telecom進程撥號的具體細節(jié)如下:

其大至流程就是:

telecom MO 流程

1. 撥號應(yīng)用如Dialer調(diào)用TelecomManager#placeCall()。

2. CallsManager#startOutgoingCall()創(chuàng)建Call碍讯,并設(shè)置Call狀態(tài)為Connecting悬蔽。判斷是否mmi code,如果不是通知InCallUI更新界面捉兴。

3. 發(fā)送order broadcast給接收該廣播的應(yīng)用更改號碼相關(guān)信息蝎困。

4. CallsManager#placeOutgoingCall()根據(jù)intent中所帶參數(shù)判斷該通電話是否為視頻電話.

5. 建立同ConnectionService的連接,通知TelephonyConnectionService撥號倍啥。

6.?TelephonyConnectionService通知撥號成功禾乘,更新Call狀態(tài)為Dialing。

其中IMS Call增加的流程就是在撥號時的intent中帶參數(shù)配置該通電話是否為視頻電話虽缕,然后把這個videoState一直傳遞下去始藕。

IMS Call 狀態(tài)變更流程

先看IMS和CS的對比:

狀態(tài)變更對比

和MO一樣,IMS Call多了ims service這一部分氮趋,而CS Call 多了GET_CURRENT_CALLS的過程伍派。

其中的重點部分是IMS Call 中的ImsPhoneCallTracker#processCallStateChange()及CS Call 中的GsmCdmaCallTracker#handlePollCalls()。

和app相關(guān)的流程請參考?Android通話應(yīng)用設(shè)計凭峡。

IMS Call MT流程

先看IMS和CS的對比:

MT 對比

其對比如下:

1.?CS Call 在收到RadioIndication上報的callStateChanged()后會通過GET_CURRENT_CALL來更新DriverCall拙已,?然后在GsmCdmaCallTracker#handlePollCalls()中通過DriverCall來更新Connection并通知app來電。

2. IMS Call 中會在ImsPhoneCallTracker#onIncomingCall()中通過ImsCallSession來創(chuàng)建ImsCall連接摧冀,并創(chuàng)建Connection倍踪,創(chuàng)建Connection時會通過IImsCallSession里帶的參數(shù)判斷通話是否為視頻通話。

app來電后的流程可參考?Android通話應(yīng)用設(shè)計,這里補充telecom app 來電的流程种蝶,如下:

telecom 來電流程

1. telephony收到來電通知時根據(jù)來電的phone找到PhoneAccountHandle丹喻,通話TelecomManager#processIncomingCallIntent()通知telecom來電。

2. CallsManager#processIncomingCallIntent()創(chuàng)建Call缤至,并建立和ConnectionService的連接。

3. ConnectionService返回連接成功康谆,通過phone進程中的Connection更新telecom/Call领斥,包括是否視頻電話。

4. CallsManager#onSuccessfulIncomingCall()開始號碼過濾查詢(包括黑名單查詢)沃暗,如果是過濾號碼來電直接拒接月洛。

5. 如果是非過濾號碼來電更新Call狀態(tài)為RINGING。

6. 通過InCallController建立與通話界面的連接孽锥,更新通話界面嚼黔。

MMI Code 流程

MMI:Man-Machine-Interface细层,人機界面,所有帶*或#的號碼都是MMI Code唬涧。通常以*疫赎、#、*#碎节、**捧搞、##等開頭,以#號結(jié)束钓株,各個部分以*隔開实牡。它們有些僅在設(shè)備上使用,有些發(fā)送給sim卡處理轴合,有些則發(fā)給運營商網(wǎng)絡(luò)處理创坞。它主要分為:

1. USSD:Unstructured Supplementary Service Data,非結(jié)構(gòu)化補充服務(wù)數(shù)據(jù)碼受葛,發(fā)送給網(wǎng)絡(luò)處理题涨。所有以#號結(jié)尾且沒有被識別為MMI Code的號碼都會被發(fā)送到網(wǎng)絡(luò)來確認該號碼是否為運營商支持的USSD。

2. SS:Supplementary Service总滩,補充服務(wù)碼纲堵,發(fā)送給網(wǎng)絡(luò)處理。如*21*xxx xxxx xxxx#為GSM/UMTS/LTE網(wǎng)絡(luò)的來電轉(zhuǎn)接碼闰渔,這個號碼會由手機轉(zhuǎn)換成網(wǎng)絡(luò)可識別的來電轉(zhuǎn)接碼席函。

3. Manufacturer defined MMI codes:手機廠商自定義的mmi碼,在設(shè)備上執(zhí)行冈涧。如通用的*#06#會顯示手機IMEI號茂附。各家手機廠商也可以定義自己的mmi碼來做為暗碼,它的處理一般在Dialer/SpeciaCharSequenceMgr中督弓。

4. SIM control codes:sim卡控制碼营曼,發(fā)送給sim卡處理。如**04*1234*6789*6789#會把sim卡的pin碼從1234改成6789愚隧。

MMI code 分主動上報和非主動上報兩種蒂阱,下圖為非主動手報流程:

solicited mmi code

1. 手機自己處理的mmi碼一般直接通過Dialer處理。

2. 發(fā)送給sim卡處理的碼通過Dialer直接傳到GsmMmiCode給UiccCardApplication再由IRadio.hal處理狂塘,其處理結(jié)果會在PhoneUtils#displayMMIComplete()顯示給用戶录煤。

3. 發(fā)送給網(wǎng)絡(luò)處理的碼則和正常撥號一樣,只不過telecom在判斷其為mmi code后不會通知InCallUI荞胡,CallTracker#dial()后返回空的Connection給phone app通知其彈出對話框提示用戶正在進行MMI碼的處理妈踊。

4. 會先判斷該mmi code是不是ims網(wǎng)絡(luò)的碼,如果是直接由ims網(wǎng)絡(luò)處理硝训,如果不是則由gsm/umts/lte網(wǎng)絡(luò)處理。

5. SS code手機能直接判斷出,然后轉(zhuǎn)換為網(wǎng)絡(luò)能識別的命令發(fā)送給網(wǎng)絡(luò)窖梁,CS Call和通話一樣由IRadio.hal處理赘风,而IMS Call則不是由IImsCallSession處理而是通過IImsUt處理。USSD code直接透傳給網(wǎng)絡(luò)處理纵刘。網(wǎng)絡(luò)處理結(jié)果CS Call和通話狀態(tài)一樣直接由IRadioResponse.hal通知邀窃,IMS Call則由IImsUtListener通知。


原創(chuàng)內(nèi)容歡迎轉(zhuǎn)載假哎,但請注明出處瞬捕,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舵抹,一起剝皮案震驚了整個濱河市肪虎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惧蛹,老刑警劉巖扇救,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異香嗓,居然都是意外死亡迅腔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門靠娱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沧烈,“玉大人,你說我怎么就攤上這事像云⌒咳福” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵苫费,是天一觀的道長汤锨。 經(jīng)常有香客問我,道長百框,這世上最難降的妖魔是什么闲礼? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮铐维,結(jié)果婚禮上柬泽,老公的妹妹穿的比我還像新娘。我一直安慰自己嫁蛇,他們只是感情好锨并,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著睬棚,像睡著了一般第煮。 火紅的嫁衣襯著肌膚如雪解幼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天包警,我揣著相機與錄音撵摆,去河邊找鬼。 笑死害晦,一個胖子當(dāng)著我的面吹牛特铝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壹瘟,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼鲫剿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稻轨?” 一聲冷哼從身側(cè)響起灵莲,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澄者,沒想到半個月后笆呆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡粱挡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年赠幕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片询筏。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡榕堰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嫌套,到底是詐尸還是另有隱情逆屡,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布踱讨,位于F島的核電站魏蔗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏痹筛。R本人自食惡果不足惜莺治,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帚稠。 院中可真熱鬧谣旁,春花似錦、人聲如沸滋早。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杆麸。三九已至搁进,卻和暖如春浪感,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饼问。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工篮撑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匆瓜。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像未蝌,于是被迫代替她去往敵國和親驮吱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容