背景
以下內(nèi)容基于Android N code。
本文會從應(yīng)用框架、進(jìn)程交互、流程幾個(gè)方面,講解Android手機(jī)中視頻通話的應(yīng)用層設(shè)計(jì)。
應(yīng)用框架設(shè)計(jì)
Android電話模塊是一個(gè)典型的分層結(jié)構(gòu)設(shè)計(jì),視頻電話在語音通話結(jié)構(gòu)的基礎(chǔ)上增加了一些類,但仍遵循原本的分層結(jié)構(gòu),如下:

可以看到,相較于語音通話,視頻通話主要增加了以下內(nèi)容:
在Application層的Telecom應(yīng)用增加了VideoProviderProxy類,InCallUI增加了一個(gè)控制顯示視頻電話界面的MVP結(jié)構(gòu)。
Framework層的telecom模塊增加了VideoCall及VideoProvider,分別為視頻電話call的信息存儲者和控制者。同時(shí)Framework層的telephony模塊增加了視頻電話相應(yīng)的Phone、Call、Connection和CallTracker。另外增加了net模塊,該模塊負(fù)責(zé)和telephony進(jìn)行撥號、來電、通話狀態(tài)變更等通話相關(guān)操作的交互,和telecom進(jìn)行camera、surface等media相關(guān)方面的交互。
原本Framework的telephony和RIL層進(jìn)行交互,改成了Framework的telephony和net進(jìn)行交互,net模塊再和vendor里面的ims模塊交互,ims再負(fù)責(zé)和modem、media進(jìn)行交互。這一部分的代碼雖然都按照google提供的接口實(shí)現(xiàn),但各個(gè)芯片廠家的具體實(shí)現(xiàn)方式都不一樣。
由于要顯示視頻界面,增加了media層負(fù)責(zé)設(shè)置視頻通話的Camera、Surface等操作和信息反饋。視頻通話和modem、media層的交互過程都封裝在vendor/ims層。
應(yīng)用間進(jìn)程交互
進(jìn)程交互方式
相較于語音通話,主要增加了phone進(jìn)程和ims進(jìn)程的交互,之前phone進(jìn)程和RIL、modem的交互,也改成了ims和modem的交互。
如圖:

Binder交互過程
其交互過程具體如下:

及InCallUI<->phone<->telecom<->ims,如果用戶在界面操作了掛斷電話或切換相機(jī)的操作要通話telecom、phone進(jìn)程的兩層中轉(zhuǎn)到ims進(jìn)程,ims再具體下發(fā)到modem或者media,反之有消息要傳到通話界面也是從ims通話phone和telecom兩進(jìn)程的中轉(zhuǎn)到InCallUI。
具體交互細(xì)節(jié)如下:

Phone進(jìn)程通過ServiceManager.getService(“ims”)拿到溝通ims進(jìn)程的橋梁。
值得注意的是phone進(jìn)程和telecom進(jìn)程分別創(chuàng)建了一個(gè)VideoProvider,phone進(jìn)程的VideoProvider負(fù)責(zé)phone進(jìn)程和telecom進(jìn)程的溝通,telecom進(jìn)程的VideoProvider負(fù)責(zé)telecom進(jìn)程和incallui進(jìn)程的溝通。
通話流程
因?yàn)槭欠謱咏Y(jié)構(gòu),和語音通話一樣來電、掛斷是從上到下,而來電和電話狀態(tài)的變化則是從下到上。
撥號流程
撥號是從上往下,即從APP到FW到ims再到Modem和media。
如下圖:

撥號盤通過TelecomManager的接口撥號,并帶有VideoState為RX或TX或RX&TX的intent參數(shù),telecom一邊向phone進(jìn)程請求撥號,一邊通知incallui顯示撥號界面。和語音通話不通的是語音通話是通過GsmCdmaPhone向RIL再向modem發(fā)送撥號請求,而視頻電話是通話ImsPhone向ims再向modem發(fā)送撥號請求。另外視頻通話增了向media設(shè)置camera、本機(jī)預(yù)覽surface和對端畫面surface的過程。
電話狀態(tài)更新流程
電話狀態(tài)更新和語音通話一樣,從結(jié)構(gòu)上看是從下往上,通過一層層的監(jiān)聽和通知通過觀察者模式從Modem通知到RIL到FW到APP。
如下圖:

ImsPhoneCallTracker在撥號或者來電創(chuàng)建新的ImsCall時(shí)同時(shí)會通話ImsCall向ims的IImsCallSession的實(shí)現(xiàn)者注冊listener,當(dāng)有狀態(tài)變更時(shí)modem傳到ims,ims再通過ImsPhoneCallTracker向其注冊的listener通話到ImsPhoneCallTracker,之后狀態(tài)的傳替和語音通話一樣。
來電流程
和語音通話不同的是,來電信息由modem通過socket傳到RIL再通過binder傳到phone,變成了modem通過socket傳到ims,ims再發(fā)廣播通知位于phone進(jìn)程的ImsPhoneCallTracker。

開機(jī)后phone進(jìn)程起來會根據(jù)手機(jī)的待機(jī)模式構(gòu)建GsmCdmaPhone,每個(gè)phone都會監(jiān)聽ims
service的狀態(tài)變更,一旦ims可用該GsmCdmaPhone就會創(chuàng)建一個(gè)屬于自己的ImsPhone,而這個(gè)ImsPhone同樣會創(chuàng)建為自己管理通話的ImsPhoneCallTracker,用其來撥號和接收來電廣播。
原創(chuàng)內(nèi)容歡迎轉(zhuǎn)載,但請注明出處,謝謝!