第一范文网 - 专业文章范例文档资料分享平台

Android通话过程分析

来源:用户分享 时间:2025/8/26 6:41:42 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

case ACTIVE: case DIALING: case ALERTING:

return owner.foregroundCall; //break;

case HOLDING:

return owner.backgroundCall; //break;

case INCOMING: case WAITING:

return owner.ringingCall; //break;

default:

throw new RuntimeException(\call state: \ + state); }

}

2) 在其他情况下,一般根据上面的状态直接传入对应的call。

3) GsmCallTracker中的事件处理机制

Call的事件处理基本上是请求应答模式,具体如下(以dail为例,其他类同):

其中涉及到3个变量的处理:

protected int pendingOperations;

protected boolean needsPoll;

protected Message lastRelevantPoll;

pendingOperations:顾名思义,这个变量是在发生请求的时候会++,在处理应答的时候会--。

needsPoll:该变量是用来配合pendingOperations处理是否需要从RIL获取当前calls列表,并更新connections列表。

lastRelevantPoll:在发送RIL_REQUEST_GET_CURRENT_CALLS的时候记录最近一次请求的message,在response的时候只对最近一次请求的response做出响应,更新connections列表。

上面的3个变量主要是用来判断是否需要发送RIL_REQUEST_GET_CURRENT_CALLS请

求来从RIL获取当前的calls列表,并更新connections列表。

候,用户有可能会继续的发送对应的请求,然后会有多个response同时上报过来,上

GsmCallTracker事件处理的核心是一个异步事件的处理,在发送请求后等待回应的时

面的3个变量主要是为了更好的处理这种情况,不管用户发送了多少次请求,

pendingOperations都会记录下来;而且只要用户发送了一次请求,needsPoll就为true,即就需要从RIL获取最新的call列表。所以只有当pendingOperations==0 并且 needsPoll == true的时候才发送RIL_REQUEST_GET_CURRENT_CALLS请求

去获取Calls列表。

if (pendingOperations == 0 && needsPoll) {

lastRelevantPoll= obtainMessage(EVENT_POLL_CALLS_RESULT); cm.getCurrentCalls(lastRelevantPoll); }

由于中间可能发送了多次RIL_REQUEST_GET_CURRENT_CALLS请求,在多次发送此请

求的过程中却没有一次response回来,最后的结果是到最后肯定会有多个response上来,而此时我们只需要更新一次就够了,lastRelevantPoll就是用来处理这个事情的:lastRelevantPoll记录了最近一次发送

RIL_REQUEST_GET_CURRENT_CALLS请求时的response message,当返回的response message是最后一个时就更新Connections列表。

4) GsmCallTracker的核心处理方法----更新connections列表处理方法

protected void handlePollCalls(AsyncResult ar)的处理分析

handlePollCalls(AsyncResult ar) { List polledCalls;

if(DBG_POLL) log(\);

if (ar.exception == null) { //没有异常,取得calllists列表

polledCalls = (List)ar.result;

} else if (isCommandExceptionRadioNotAvailable(ar.exception)) {

//如果radio是RADIO_NOT_AVAILABLE,则挂断所有的calls,这里的意思是所有的

DriverCall是null。

polledCalls = new ArrayList();

} else {

//其他的异常的话,推迟POLL_DELAY_MSEC = 250后再发送//RIL_REQUEST_GET_CURRENT_CALLS去获取DriverCall列表。

pollCallsAfterDelay(); return; }

Connection newRinging = null; //or waiting

boolean hasNonHangupStateChanged = false; // Any change besides // a dropped connection boolean needsPollDelay = false;

boolean unknownConnectionAppeared = false;

//遍历DriverCall和Connections,根据不同情况做相应处理。

for (int i = 0, curDC = 0, dcSize = polledCalls.size()

; i < connections.length; i++) { GsmConnection conn = connections[i]; DriverCall dc = null;

// polledCall list is sparse if (curDC < dcSize) {

dc = (DriverCall) polledCalls.get(curDC);

//此处说明connections数组的index+1就是callId,也即dc.index。 if (dc.index == i+1) { curDC++; } else { dc = null; } }

if (conn == null && dc != null) {

//conn为null,说明CallTracker中是没有对应的call的,这只有两种情况可以

//发生:MO的dialing状态和MT的incoming/waiting状态。打电话和来电的时候

//会执行到此处。

} else if (conn != null && dc == null) {

//说明在底层已经挂掉了,CallTracker需要drop该connection。对方挂断电话//的时候就会执行到此处。

} else if (conn != null && dc != null && !conn.compareTo(dc)) { //此处说明对应的connection和dc并不是同一个call,这种情况下就需要drop //当前的connection并根据dc重新构建一个。此处应该是一个异常的处理情况。

} else if (conn != null && dc != null) {

//此处表明connection和dc是同一个call,随后根据dc来更新connection。 }

if (REPEAT_POLLING) {} }

if (pendingMO != null) {

//此时dial请求已经发送给ril但是对应的response还没有上来的情况。正常情况

//下,到此时pengdingMO应该为null了,但是假如在dial后的response还没有上

//来的时候做了其他动作,如hangup call,则此时很可能就执行到此处。

droppedDuringPoll.add(pendingMO); pendingMO = null;

hangupPendingMO = false; }

if (newRinging != null) {

//表示是一个MT call,需要通知用户。

搜索更多关于: Android通话过程分析 的文档
Android通话过程分析.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c3tjj825kko01k8300sth_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top