Android視頻通話應(yīng)用設(shè)計(jì)

背景

以下內(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),如下:

分層結(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的交互。

如圖:

進(jìn)程交互

Binder交互過程

其交互過程具體如下:

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é)如下:

進(jìn)程交互結(jié)節(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)載,但請注明出處,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 目錄 Android通話應(yīng)用設(shè)計(jì) 1 一、 背景 1 二、 應(yīng)用框架設(shè)計(jì) 1 三、 常駐進(jìn)程開機(jī)喚醒 2 1. P...
    朱蘭婷閱讀 8,100評論 4 25
  • 1. 應(yīng)用進(jìn)程 從點(diǎn)擊撥號按鈕流程說起packages/apps/Dialer/src/com/android/d...
    小的橘子閱讀 4,510評論 3 1
  • 撥號流程 概述:撥號的過程,如果按照進(jìn)程來分,可以分成3個(gè)模塊。 com.android.dialer進(jìn)程,即電話...
    SevChen閱讀 3,067評論 4 2
  • 一、telecom進(jìn)程和bluetooth進(jìn)程的交互方方式 1. telecom進(jìn)程主動控制藍(lán)牙的操作是通過跨進(jìn)程...
    朱蘭婷閱讀 9,023評論 1 12
  • 這篇文章介紹一下機(jī)器學(xué)習(xí)算法的分類和算法的特點(diǎn),我們一般把機(jī)器學(xué)習(xí)算法分為監(jiān)督學(xué)習(xí)、非監(jiān)督學(xué)習(xí)、半監(jiān)督學(xué)習(xí)、強(qiáng)化學(xué)...
    呂不韋閱讀 919評論 0 3

友情鏈接更多精彩內(nèi)容