Android P OS Call 流程简析[telephony]

Call根据拨打网络不同, 分为normall call [通过CS网络拨打] 和 IMS call [也就是volte,通过IMS网络拨打]。

根据操作流程不同,分为主叫[MO]和被叫[MT].

 

一、MO call [往外拨打电话]

 

1. 整体状态流转 :

    DIALING -----------> ALERTING ----------->  ACTIVE ---------->HANGUP

 

2. 整体结构:      [图中文件根据log的主要体现列出,并非全部文件哦]

 

Android P OS Call 流程简析[telephony]

 

3. 重点关注telephony 部分

 

1. TelephonyConnectionService.java .

dial事件从Telecom 传到 Telephony,的入口就在TelephonyConnectionService中onCreateOutgoingConnection()这个函数。

a.这个函数会get真正的telephony的phone对象;

b.会通过CarrierConfigManager获取carrierConfig;

c.会检查radio的状态

d.会创建TelephonyConnection。

 

2.GsmCdmaPhone.java 

这个文件的dial函数 进行逻辑的dial动作,并且返回一个com.android.internal.telephony.Connection这个connection会跟随这个call的整个生命周期。

a.首先会根据刚才的CarrierConfig, 判断emergencycall 是否使用IMSPhone进行dial. 如果是,这一步会调用IMSPhone.dial()。

b.然后判断ServiceState是否可以打电话,airplane mode或者 outofService 等情况都会抛出异常。

c.然后转到dialInternal(),这个函数通过GsmMmiCode对Mmicode进行处理,并且会判断CLIR的状态。

d.对于normalcall ,满足mmi==null,接下来会直接调用GsmCdmaCallTracker.dial();

 

3.GsmCdmaCallTracker.java

a. 根据carrierConfig对拨出号码进行convert,通过convertNumberIfNecessary()。

b. 必须保证当前dial的这一通电话必须是foregroundCall, 所以如果当前已经有active的通话,需要将当前的通话 hold.

c. 创建了新的GsmCdmaConnection->mPendingMO , 这个Connection会成为telephony与RIL沟通的状态传递媒介。

 

Android P OS Call 流程简析[telephony]

 

 

上一篇:Android系统修改之展讯平台的Mms不能发送西班牙特殊字符ú的问题


下一篇:有没有办法让linux拿起电话?