基于Android平臺的雙網(wǎng)雙待的設計方法
在PhoneAPP 中new 一個GSMPhone 和一個CDMAPhone,分別對應兩種framework (不同的CallTracker)和RIL (不同的RIL),實現(xiàn)單模向雙網(wǎng)雙待的改進。
本文引用地址:http://butianyuan.cn/article/270832.htm圖中CallLiST 主要用來管理兩個電話之間的切換,以避免如掛掉某一個通話卻導致另一個的通話也結(jié)束等一系列界面顯示出錯問題。CallList 模塊管理兩個電話以及這兩個電話所有的通話,通過一個CallList 表來存儲兩個電話的所有呼叫。上層界面調(diào)用這個CallList 表來處理兩個電話的切換。在framework 中new 一個CallList 的類來存儲phone 的多個電話以便上層顯示。
CallList 類中包含attached(),detach(),update(),clear(),get-CurrentCall(),getDefault()等方法。使得兩個Phone 的Call 得到控制。掛掉的時候就從表中刪除,來電話的時候加入表中。
上層顯示的時候,只要調(diào)用CallList 中的最后存入Call 就不會出現(xiàn)界面出錯的情況。
在包含GSM 網(wǎng)絡和CDMA 網(wǎng)絡的雙網(wǎng)雙待模塊中,因為有了CDMA 部分的整合不少代碼已經(jīng)發(fā)生改變,原來的CallTracker只被GSM 使用,在這里改為CallTracker 和GsmCallTracker,抽象出CallTracker 基類,使其也可以被CDMA 利用; GSMCall 變成GsmCall,更加符合統(tǒng)一的命名規(guī)則; 另外,比如pppd 的啟動部分,也從Java 框架層放到RIL 層。
3. 2 Android RIL 層的改進
在Android 系統(tǒng)中RIL 是電話系統(tǒng)的本地實現(xiàn),它提供了Android 電話服務(android. telephony)與無線電硬件之間的抽象層,主要負責AT 命令的發(fā)送和響應解析,這也是電話服務的實現(xiàn)基礎(chǔ)。另外,RIL 還負責數(shù)據(jù)的可靠傳輸。因此RIL 在Android電話部分起核心作用。本方案設計過程中主要涉及到RIL以下四個部分的修改:
(1)由于本方案維護兩個RIL 實例,因此RIL 實例管理者(RIL instance Manager)需要各自負責與android telephony 通過socket 進行連接。每個RIL 實例針對各自的SIM 卡提供專用的通信通道來進行modem 側(cè)的通信服務。
(2)無線電仲裁管理者(Radio Service Arbitration Manager),這是實現(xiàn)雙網(wǎng)雙待方案中新增加的模塊,主要用來為每個RIL 實例進行語音和短消息業(yè)務的仲裁,數(shù)據(jù)服務的仲裁由MODEM 來進行。
(3)RIL 事件分配機(RIL Event Dispatcher),用于分配RIL請求及AMSS 事件到通信服務管理模塊進行的處理。
(4)無線電服務管理者(Radio Service Manager),Android 通話應用首先需要通過子系統(tǒng)信息來從framework 層獲得通話服務,然后每個SIM 卡子系統(tǒng)將會映射到一個特定的RIL 實例ID上,服務管理將使用RIL 實例的ID 來識別子系統(tǒng)ID 中DSS API的參數(shù)。
3. 3 Android 雙網(wǎng)雙待通話機制的實現(xiàn)
Android 系統(tǒng)電話服務的實現(xiàn)基礎(chǔ)是RIL.在Android 單模狀態(tài)下的RIL 同TI 等平臺類似,均使用了Google 默認的參考接口,也就是通過打開modem 側(cè)提供的串口或者USB 虛擬串口向modem 側(cè)發(fā)送AT 指令的方式,進行實際的無線通信。比如,UI上層向RIL 層發(fā)送RIL_REQUEST_DIAL 請求,RIL 層在接收到該請求的時候,通過串口向modem 發(fā)送"AT***"命令,發(fā)起呼叫,當然,最終真正實現(xiàn)通話的是modem 側(cè)的功能,此時,與Android 就無關(guān)了。Android 平臺RIL 與modem 的工作原理如圖4 所示。
圖4 RIL 與modem 的工作原理
呼叫(call)構(gòu)建于電話服務的基本架構(gòu)之上。
與呼叫相關(guān)的主要用戶接口,其實就是基于ITelephony 接口實現(xiàn)Phone 應用中的"Phone"服務,通過TelephonyManager 提供訪問接口。此服務內(nèi)部通過PhonyFactory 獲取的GSMPhone /CDMAPhone 來訪問RIL,提供諸如撥號、接通、掛斷、保持通話等服務功能。Android 雙網(wǎng)雙待呼叫部分的結(jié)構(gòu)如圖5 所示。
圖5 android 雙網(wǎng)雙待呼叫部分結(jié)構(gòu)
Android 系統(tǒng)雙網(wǎng)雙待呼叫部分的實現(xiàn),從GSMPhone /CDMAPhone到對應RIL 的路徑中間主要涉及幾個關(guān)鍵數(shù)據(jù)結(jié)構(gòu),即GSMCall /CDMACall、CallNotifiter、GSMConnection /CDMAConnection、CallTracker 等類。
其中GSMCall 和CDMAPhone 都繼承Call 基類,提供基本的呼叫控制結(jié)構(gòu)以及呼叫狀態(tài),如Hold、Active 等信息,每個接通的GSMCall / CDMACall 都擁有一個或多個(conference call)GSMConnection /CDMAConnection 結(jié)構(gòu),用于維護呼叫時長等相關(guān)信息。CallTracker 是呼叫模塊的核心,它提供與呼叫相關(guān)的接口,如通話、掛斷等。GSMPhone /CDMAPhone 擁有CallTracker的實例,并封裝相應的接口,這個接口通過調(diào)用GSMPhone /CDMAPhone中的CommandsInterface 實現(xiàn),即提交的RIL 封裝。
除此之外,CallTracker 還維護當前的GSMCall 和CDMACall列表,保持對所有呼叫狀態(tài)的追蹤,提供對來去電等呼叫狀態(tài)的管理。實現(xiàn)追蹤的方法為pollCallsWhenSafe,通過CommandsInterface的getCurrentCalls 接口獲取當前活動的呼叫列表。這一操作的底層實現(xiàn)為AT + CLCC(不同的Modem 實現(xiàn)可能不同),這是從Modem 獲取呼叫狀態(tài)列表的主要接口?;卣{(diào)通過ENENT_ POLL _ CALLS-RESULT 完成,回調(diào)函數(shù)為handlePollCalls,這是獲取Modem 中實際呼叫信息的核心方法,也是Tracker的含義所在。handlePollCalls 完成實際的追蹤功能,根據(jù)底層上報的Outgoing、Incomming 以及Active、Hold 等狀態(tài)更新Call列表的信息,每個呼叫在其生命周期內(nèi)的狀態(tài)轉(zhuǎn)換,在Call-Tracker 中都可得到體現(xiàn),并將這些變化信息及時通知其關(guān)注者,也就是實現(xiàn)Phone 的應用。
4 結(jié)果分析
基于Android 操作系統(tǒng)實現(xiàn)的雙網(wǎng)雙待功能模塊設計,利用Android 通用的系統(tǒng)架構(gòu)和設備無關(guān)的應用程序開發(fā)平臺,實現(xiàn)了雙網(wǎng)雙待單通系統(tǒng)電話部分的框架設計和上層Phone 應用程序設計。改進后的Android 系統(tǒng)平臺同時支持GSM 和CDMA兩種網(wǎng)絡同時待機,這大大方便了許多擁有兩張手機卡并且不在同一制式網(wǎng)絡的用戶。圖6 為Android 系統(tǒng)平臺上GSM和CDMA 雙網(wǎng)同時待機的狀態(tài)圖。
圖6 GSM 和CDMA 雙網(wǎng)同時待機界面
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關(guān)文章:linux教程
cdma相關(guān)文章:cdma原理
評論