此文不完善,无需浪费时间阅读,谢谢。
感谢博友 @我闹 问题(怎么获得通话建立的时间点,不用广播)的提出,才促使我继续写这篇分析文章。
这篇文是上一篇Sipdorid的分析,进一步说明对外呼出的建立过程,如有错误,请指出。
CallCard中有两类注意一下,一个是更新通话界面的方法
//对外暴露的方法:更新如通话时间,通话状态
public void displayMainCallStatus(Phone phone, Call call){}
第二个私有
/**
* Updates the "upper" and "lower" titles based on the
* current state of this call.
*/
private void updateCardTitleWidgets(Phone phone, Call call){}
在私有方法里面你可以看到Call.State state = call.getState();
通话状态的判断,当Call.State.ACTIVE
时,计时器mElapsedTime
开始计时,从某种状态来说,这个已经算正式接通的状态。所以,更进一步是要对Call
状态的实时监听。
调用处:
CallCard的displayMainCallStatus:
CallCard的updateCardTitleWidgets:
Call通话状态枚举
IDLE, ACTIVE, HOLDING, DIALING, ALERTING, INCOMING, WAITING, DISCONNECTED
我们只注意ACTIVE
(通话中)这个。
在管理器Receiver
中,你可以查看到这里有对Call
状态的设置ccCall.setState(...)
,在我们向外拨打电话同时会发送OFFHOLD
广播(摘机)过程,你也可以通过这个广播同时判断Call
状态即可获取对外通话正式接通的时刻。
注:OFFHOLD
广播会发送两个,一次是开始拨打电话(按了拨号键)状态为Call.State.DIALING
,