背景
以下內容基于Android N code。
本文會從應用框架、進程交互、流程幾個方面,講解Android手機中視頻通話的應用層設計。
應用框架設計
Android電話模塊是一個典型的分層結構設計,視頻電話在語音通話結構的基礎上增加了一些類,但仍遵循原本的分層結構,如下:
可以看到,相較于語音通話,視頻通話主要增加了以下內容:
在Application層的Telecom應用增加了VideoProviderProxy類,InCallUI增加了一個控制顯示視頻電話界面的MVP結構。
Framework層的telecom模塊增加了VideoCall及VideoProvider,分別為視頻電話call的信息存儲者和控制者。同時Framework層的telephony模塊增加了視頻電話相應的Phone、Call、Connection和CallTracker。另外增加了net模塊,該模塊負責和telephony進行撥號、來電、通話狀態變更等通話相關操作的交互,和telecom進行camera、surface等media相關方面的交互。
原本Framework的telephony和RIL層進行交互,改成了Framework的telephony和net進行交互,net模塊再和vendor里面的ims模塊交互,ims再負責和modem、media進行交互。這一部分的代碼雖然都按照google提供的接口實現,但各個芯片廠家的具體實現方式都不一樣。
由于要顯示視頻界面,增加了media層負責設置視頻通話的Camera、Surface等操作和信息反饋。視頻通話和modem、media層的交互過程都封裝在vendor/ims層。
應用間進程交互
進程交互方式
相較于語音通話,主要增加了phone進程和ims進程的交互,之前phone進程和RIL、modem的交互,也改成了ims和modem的交互。
如圖:
Binder交互過程
其交互過程具體如下:
及InCallUI<->phone<->telecom<->ims,如果用戶在界面操作了掛斷電話或切換相機的操作要通話telecom、phone進程的兩層中轉到ims進程,ims再具體下發到modem或者media,反之有消息要傳到通話界面也是從ims通話phone和telecom兩進程的中轉到InCallUI。
具體交互細節如下:
Phone進程通過ServiceManager.getService(“ims”)拿到溝通ims進程的橋梁。
值得注意的是phone進程和telecom進程分別創建了一個VideoProvider,phone進程的VideoProvider負責phone進程和telecom進程的溝通,telecom進程的VideoProvider負責telecom進程和incallui進程的溝通。
通話流程
因為是分層結構,和語音通話一樣來電、掛斷是從上到下,而來電和電話狀態的變化則是從下到上。
撥號流程
撥號是從上往下,即從APP到FW到ims再到Modem和media。
如下圖:
撥號盤通過TelecomManager的接口撥號,并帶有VideoState為RX或TX或RX&TX的intent參數,telecom一邊向phone進程請求撥號,一邊通知incallui顯示撥號界面。和語音通話不通的是語音通話是通過GsmCdmaPhone向RIL再向modem發送撥號請求,而視頻電話是通話ImsPhone向ims再向modem發送撥號請求。另外視頻通話增了向media設置camera、本機預覽surface和對端畫面surface的過程。
電話狀態更新流程
電話狀態更新和語音通話一樣,從結構上看是從下往上,通過一層層的監聽和通知通過觀察者模式從Modem通知到RIL到FW到APP。
如下圖:
ImsPhoneCallTracker在撥號或者來電創建新的ImsCall時同時會通話ImsCall向ims的IImsCallSession的實現者注冊listener,當有狀態變更時modem傳到ims,ims再通過ImsPhoneCallTracker向其注冊的listener通話到ImsPhoneCallTracker,之后狀態的傳替和語音通話一樣。
來電流程
和語音通話不同的是,來電信息由modem通過socket傳到RIL再通過binder傳到phone,變成了modem通過socket傳到ims,ims再發廣播通知位于phone進程的ImsPhoneCallTracker。
開機后phone進程起來會根據手機的待機模式構建GsmCdmaPhone,每個phone都會監聽ims
service的狀態變更,一旦ims可用該GsmCdmaPhone就會創建一個屬于自己的ImsPhone,而這個ImsPhone同樣會創建為自己管理通話的ImsPhoneCallTracker,用其來撥號和接收來電廣播。
原創內容歡迎轉載,但請注明出處,謝謝!