Android电话系统之GSMCallTracker

GSMCallTracker在本质上是一个Handler。 java

wps_clip_image-65

GSMCallTracker是Android的通话管理层。GSMCallTracker创建了ConnectionList来管理现行的通话链接,并向上层提供电话调用接口。 函数

wps_clip_image-1

在GSMCallTracker中维护着通话列表:connections。顺序记录了正链接上的通话,这些通话包括:ACTIVE,DIALING,ALERTING,HOLDING,INCOMING,WAITING等状态的链接。GSMCallTracker将这些链接分为了三类别进行管理: 学习

RingingCall: INCOMING ,WAITING spa

ForegourndCall: ACTIVE, DIALING ,ALERTING 设计

BackgroundCall: HOLDING 接口

上层函数经过getRingCall(),getForegrouandCall()等来得到电话系统中特定通话链接。 事件

为了管理电话状态,GSMCallTracker在构造时就将本身登记到了电话状态变化通知表中。RIL-Java一收到电话状态变化的通知,就会使用EVENT_CALL_STATE_CHANGE通知到GSMCallTacker ip

    在通常的实现中,咱们的通话Call Table是经过AT+CLCC查询到的,CPI能够通知到电话的改变,可是CPI在各个Modem的实现中差异比较大,因此参考设计都没有用到CPI这样的电话链接改变通知,而是使用最为传统的CLCC查询CALL TABLE。在GSMTracker中使用connections来管理Android电话系统中的通话链接。每次电话状态发生变化是GSMTracker就会使用CLCC查询来更新connections内容,若是内容有发生变化,则向上层发起电话状态改变的通知。 ci

1 RIL-JAVA中发起电话链接列表操做

在RIL-JAVA中涉及到CurrentCallList查询的有如下几个操做: get

(1)hangup

(2)dial

(3)acceptCall

(4)rejectCall

在GSMcallTracker在发起这些调用的时候都有一个共同的ResultMessage构造函数:obtainCompleteMessage()。obtainCompleteMessage()其实是调用:

obtainCompleteMessage(EVENT_OPERATION_COMPLETE)

这就意味着在这些电话操做后,GSMCallTracker会收到EVENT_OPERATION_COMPLETE消息,因而咱们将目光转移到handleMessage()@GSMCallTracker的EVENT_OPERATION_COMPLETE事件处理:operationComplete@GSMCallTracker。

operationComplete()操做会使用cm.getCurrentCalls(lastRelevantPoll)调用,向RILD发起RIL_REQUEST_GET_CURRENT_CALLS调用,这个最终就是向Modem发起AT+CLCC,获取到真正的电话列表。

2 在RILD中,引发getCurrentCalls调用

(1)在RILD中,收到URC消息:

+CRING

RING

NO CARRIER

+CCWA

将会使用RIL_onUnsolicitedResponse( RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED),主动向ril-java上报RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED消息。

(2) 在处理requestCurrentCalls时,使用CLCC查询通话链接(CALL TABLE)后,如何发现有call Table不为空则开启一个定时器,主动上报RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED消息,直到没有电话链接为止。

在RIL-Java层收到RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED这个URC,并利用mCallStateRegistrants.notifyRegistrants(new AsyncResult(null, null, null))来通知电话状态的变化,此时GSMTracker会接收到EVENT_CALL_STATE_CHANGE消息,并使用

                pollCallsWhenSafe()->  cm.getCurrentCalls(lastRelevantPoll);

来发起查询,并更新JAVA层的电话列表。

3 handlePollCalls电话列表刷新

      首先咱们来看看是什么引发了handlePollCalls的调用。

     上面的1,2分析了,Android电话系统中全部引发电话链接列表更新的条件及其处理。他们共同的调用了cm.getCurrentCalls(lastRelevantPoll) 来完成电话列表的获取。

lastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT)

咱们这里就从能够看到获取到的电话列表Result使用handlePollCalls进行了处理。Result其实是一个DriverCall列表,handlePollCalls的工做就是将当前电话列表与RIL-Java的电话列表对比,使用DriverCall列表更新CallTracker的电话列表connections,并向上传递电话状态改变的通知。


本人转的博文是为了方便之后我的查找和学习,无其余目的,请支持原创,谢谢

相关文章
相关标签/搜索