GSMCallTracker在本质上是一个Handler。
GSMCallTracker是Android的通话管理层。GSMCallTracker建立了ConnectionList来管理现行的通话连接,并向上层提供电话调用接口。
在GSMCallTracker中维护着通话列表:connections。顺序记录了正连接上的通话,这些通话包括:ACTIVE,DIALING,ALERTING,HOLDING,INCOMING,WAITING等状态的连接。 GSMCallTracker将这些连接分为了三类别进行管理:
RingingCall: INCOMING ,WAITING
ForegourndCall: ACTIVE, DIALING ,ALERTING
BackgroundCall: HOLDING
上层函数通过getRingCall(),getForegrouandCall()等来获得电话系统中特定通话连接。
为了管理电话状态,GSMCallTracker在构造时就将自己登记到了电话状态变化通知表中。RIL-Java一收到电话状态变化的通知,就会使用EVENT_CALL_STATE_CHANGE通知到GSMCallTacker
在一般的实现中,我们的通话Call Table是通过AT+CLCC查询到的,CPI可以通知到电话的改变,但是CPI在各个Modem的实现中差别比较大,所以参考设计都没有用到CPI这样的电话连接改变通知,而是使用最为传统的CLCC查询CALL TABLE。在GSMTracker中使用connections来管理Android电话系统中的通话连接。每次电话状态发生变化是GSMTracker就会使用CLCC查询来更新connections内容,如果内容有发生变化,则向上层发起电话状态改变的通知。
1 RIL-JAVA中发起电话连接列表操作
在RIL-JAVA中涉及到CurrentCallList查询的有以下几个操作:
(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,并向上传递电话状态改变的通知。
分享到:
相关推荐
标题中的"GsmCallTracker.rar_tracker"表明这是一个与追踪GSM(全球系统移动通信)通话相关的程序或工具,可能是一个用于Linux操作系统的应用。在Linux环境下,这个工具可能用于监控、记录或者分析GSM网络中的通话...
**Android核心分析(19):** GSMCallTracker是电话系统中负责管理电话呼叫状态的关键组件。这部分内容深入分析了其内部实现机制。 #### 十三、应用程序框架 **Android核心分析(20):** 讨论了Android应用程序...
在Android电话系统中,GSMCallTracker扮演着至关重要的角色,它是电话管理层的核心组件,主要负责管理和跟踪GSM网络下的通话连接。GSMCallTracker基于Handler机制,它维护了一个名为connections的列表,用来记录和...
### Android核心分析概览 #### 一、设计意图与方法论 **设计意图:** - **背景与动机:** 在Android开发中,开发者们经常面对的是一个庞大且复杂的系统。对于初学者而言,掌握Android的核心知识并非易事。因此,...
电话系统是Android中的另一个关键部分,包括rilD、RIL-Java和GSMCallTracker等组件,它们负责处理电话相关的功能,如呼叫、短信和网络连接。 在应用程序框架层面,Android Application和Activity是开发者最常打交道...
#### 场景分析 在Android系统中,针对来电时音乐播放的控制机制可以分为以下两种典型场景: 1. **电话处于响铃模式时**: - 当有来电时,系统首先会自动暂停正在后台播放的音乐。 - 接着,系统会播放来电铃声,...
而Android的电话系统组件(如rilD、RIL-Java、GSMCallTracker)则负责管理电话通信相关的功能,包括来电、去电、短信等功能的实现。 最后,Android的启动过程是理解整个系统运行的基础,Zygote服务作为Android系统...
详细分析了Android的输入系统架构,包括输入路径、输入事件分发机制等,以及电话系统的构成,从RIL(Radio Interface Layer)到GSMCallTracker,覆盖了通话控制、信号处理等关键环节。 ### 应用程序框架 应用程序...
GSMCallTracker是Android电话系统中用于跟踪和管理GSM呼叫状态的组件,它负责处理呼叫过程中的各种事件。 #### Android应用程序框架之无边界设计意图 应用程序框架为开发者提供了构建应用所需的各种工具和服务,无...
- **GSMCallTracker:** 跟踪并管理GSM网络下的呼叫状态。 #### 六、Android应用程序框架 - **关键组件:** - **Activity:** 展示用户界面的主要容器,一个应用程序可以包含多个Activity。 - **Intent:** ...
这一流程涉及到多个组件和步骤,包括RIL(Radio Interface Layer)、GsmCallTracker、CallManager、CallNotifier以及InCallScreen。下面将详细介绍这些组件在被动接听流程中的作用以及它们是如何协作完成来电处理的...
以下是关于Android通话过程分析的详细知识点: 1. **Call**: Call是通话的基本单位,负责管理Connection。Call的状态至关重要,包括IDLE(空闲)、ACTIVE(活跃)、HOLDING(保持)、DIALING(拨号中)、ALERTING...
- **电话系统**:电话功能是Android系统的重要组成部分,涉及RIL(Radio Interface Layer)、RIL-Java、GSMCallTracker等多个组件。RIL是连接Android系统和底层调制解调器的桥梁,负责处理所有的无线通信操作。 ###...
`GSMCallTracker`通过`handleMessage()`处理`EVENT_CALL_STATE_CHANGE`消息,进而调用`pollCallsWhenSafe()`方法获取当前的通话列表。`RIL`通过`getCurrentCalls()`方法向Modem请求最新的通话状态信息。 总的来说,...
通过分析和学习这个示例,开发者不仅可以了解Android电话流程的基本原理,还能掌握如何在代码中模拟和测试电话状态,这对于调试电话应用或者开发自定义的通话管理功能非常有用。同时,这也涉及到Android的多线程编程...
- 流程大致为:RIL -> GsmCallTracker -> GSMPhone -> PhoneBase -> CallManager。 2. **TeleService部分**: - 这部分源自Android 4.4之前的Phone APP改造。 - 负责与Framework层的Telephony进行通信,处理电话...
- **GSM呼叫跟踪**:深入分析了GSMCallTracker组件的功能,它是如何跟踪和管理GSM网络下的通话过程。 - **呼叫状态管理**:详细介绍了呼叫状态的管理机制,包括如何检测和处理各种异常情况。 #### 二十、Android...
- **GSMCallTracker**:跟踪并管理GSM电话呼叫的过程。 7. **应用程序框架** - **无边界设计意图**:指在设计应用程序时考虑到与其他组件的交互,确保应用程序能够在各种环境中顺畅运行。 - **Android...