Advertisement

Telephony Call

阅读量:

1、Telephony 架构

Telephony整体架构和Android架构一样的,包括APP层,框架层,HAL层,内核层。

其中HAL层不同平台实现方式不同,其中MTK SPRD 平台使用AT通道的方式实现,高通使用QMI方式实现。

2、通话业务介绍

APP包括Dialer.apk、TeleService.apk、Telecom.apk。其中Dialer.apk跑在com.android.dialer进程中,TeleService.apk跑在常驻进程com.android.phone进程中,Telecom.apk跑在system进程中。框架包括包括 telephony fw、telecom fw。Code分别位于frameworks/opt/telephony、frameworks/base/telecomm。

Android 5.0是 只有Dialer和TeleService 这个两个APP。Google为了解除通话app和系统框架的耦合,Android 6.0新增了Telecom apk。并提供系统接口设置默认的通话APP。具体逻辑在Telecom.apk中。

2.1、Telecom的启动过程

虽然 Telecom app设置了android:directBootAware="true",提前启动属性。

但是将telecom service注册并拉起,并不是AMS执行Telecom app所执行的,而是在开机时框架执行的,具体流程如下。

相关开机Log打印如下

2.2、TeleService的启动过程

TeleService一般也称为phone进程, phone进程设置了android:directBootAware="true",系统启动完成后,会将phone进程拉起。

phone进程的启动过程大致如下,android版本不同,细节处还有所差异。

相关启动Log如下

2.3、RILD的启动

不同平台,RILD启动不一样,需要参考不同平台代码,如有兴趣,可以参考此案例分析过程。

[MTK RILD 无法启动问题分析_mtkrilj-博客]( "MTK RILD 无法启动问题分析_mtkrilj-博客")

3、去电流程

其中,蓝色表示普通CS通话,红色表示VOLTE通话

3.1、Dialer->Telecom

通话流程比较复杂,Dialer调用TelecomService服务的placeCall来进行通话。

Telecom app 中CallsManager会执行startOutgoingCall 主要建立通话Call对象,实现Dialer和Telecom双向Binder通信。 其bind详细流程如下。

Telecom 保存了Dialer的IInCallService 对象用于通知通话状态,而Dialer则保存了Telecom的的IInCallAdapter 对象用于操作通话,如暂停挂断,DTMF等,实现两个进程间双向通信。

3.2、Telecom->Telephony->Framework

placeOutgoingCall主要建立通话Call对应框架Connection,实现Telecom和TeleService双向Binder通信。

3.3、 Framwork->IMS

framework中创建ImsCall对象,与IMS apk中的ImsCallSessionProxy进行双向通信,ImsCall中保存 IMS apk中的ImsCallSession对象,ImsCallSessionProxy中保存ImsCallSessionListener进行双向通信,其具体类图如下。

3.4、相关Log如下

4、来电流程

其中,蓝色表示普通CS通话,红色表示VOLTE通话

4.1、IMS->Framwork

4.2、Telephony->Telecom->InCallUI

4**.3、相关Log如下**

5、三方通话和电话会议

5.1、三方通话

通话支持一路Active状态,一路Hold状态。用户可以在两路通话之间进行切换。

//Dialer三方
12-28 15:27:58.334 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_6, ONHOLD , [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_VT_REMOTE_RX CAPABILITY_SUPPORTS_VT_REMOTE_TX CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL], [Properties:], children:[], parent:null, conferenceable:[Call [id: TC@12, state: ACTIVE, details: [id: TC@12, state: ACTIVE, ]
12-28 15:27:58.839 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_7, ACTIVE , [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_VT_REMOTE_RX CAPABILITY_SUPPORTS_VT_REMOTE_TX CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL], [Properties:], children:[], parent:null, conferenceable:[Call [id: TC@11, state: HOLDING, details: [id: TC@11, state: HOLDING,

//RILD Log
12-28 15:27:53.152 V/RtcCC ( 1229): [0] dumpImsCallList id=1, state=4, number=186, conf=0, confHost=0, ecc=0, video=0, mt=0name=
12-28 15:27:53.152 V/RtcCC ( 1229): [0] dumpImsCallList id=2, state=3, number=110, conf=0, confHost=0, ecc=0, video=0, mt=0name=

其中上层每一路通话对应框架一路Connection,Ims apk的ImsCallSessionProxy的一例对象。

5.2、电话会议

CS电话会议和IMS电话会议有所区别,从Log中就可以看出。

5.2.1、CS电话会议Log分析

//CS三方通话

12-28 15:32:13.924 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_14, ONHOLD,
12-28 15:32:17.953 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_15, ACTIVE,

//合并通话

12-28 15:32:23.716 D/Telephony( 1801): MtkGsmCdmaConnection: performConference - [TelephonyConnection objId:259151531 telecomCallID:TC@17_1 type:gsmcdma state:ACTIVE capabilities:[Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO] properties:[Properties:] address:[Qeo5wawV7n-GAB-19aQDO90JRqo] originalConnection: callId: TC@17_1 objId: 95801594 isExternal: N incoming: false state: ACTIVE post dial state: COMPLETE partOfConf:N confSupported:Y isAdhocConf:N]

12-28 15:32:23.721 D/MtkRILJ ( 1801): [1542]> CONFERENCE [SUB0]

//AT+CHLD=3:表示Adds a held call to the conversation。

12-28 15:32:23.723 I/AT ( 1229): [0] AT> AT+CHLD=3 (RIL_CMD_RT_7 tid:498919128320)
12-28 15:32:25.032 D/RILJ ( 1801): [1542]< CONFERENCE [PHONE0]

//ACTIVE
12-28 15:32:25.023 D/RmcCCBaseHandler( 1229): [0] AT< +ECPI: 1, 132, 0, 0, 0, 0, **, , **
12-28 15:32:25.024 D/RmcCCBaseHandler( 1229): [0] AT< +ECPI: 2, 132, 0, 0, 0, 0, **, , **

//查询当前通话列表,这里GET_CURRENT_CALLS上报的Call里参数conf表明是会议通话。
12-28 15:32:25.044 D/RILJ ( 1801): [1545]> GET_CURRENT_CALLS [PHONE0]
12-28 15:32:25.062 D/RILJ ( 1801): [1545]< GET_CURRENT_CALLS {[id=1,ACTIVE,toa=129,conf,mo,0,voc,noevp,,cli=1,,1,audioQuality=1] [id=2,ACTIVE,toa=129,conf,mo,0,voc,noevp,,cli=1,,1,audioQuality=1] } [PHONE0]

//创建电话会议Call
12-28 15:32:25.294 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_16, ACTIVE , [Capabilities: CAPABILITY_HOLD CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_MANAGE_CONFERENCE], [Properties: PROPERTY_CONFERENCE], children:[], parent:null, conferenceable:[], videoState:Audio Only, SessionModificationState:0, CameraDir:-1]

//合并成功后,子Call的电话状态设置为CONFERENCED,parent参数中设置了父Call。
12-28 15:32:25.373 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_14, CONFERENCED , [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO], [Properties:], children:[], parent:DialerCall_16, conferenceable:[Call [id: TC@17, state: ACTIVE,
12-28 15:32:25.529 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_15, CONFERENCED , [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO], [Properties:], children:[], parent:DialerCall_16, conferenceable:[Call [id: TC@16, state: ACTIVE,

//电话会议父Call的children参数包含了两通子Call
12-28 15:32:25.582 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_16, ACTIVE , [Capabilities: CAPABILITY_HOLD CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_MANAGE_CONFERENCE], [Properties: PROPERTY_CONFERENCE], children:[DialerCall_15, DialerCall_14], parent:null, conferenceable:[], videoState:Audio Only, SessionModificationState:0, CameraDir:-1]

5.2.2、IMS 电话会议Log分析

//Dialer三方通话
12-28 15:27:58.334 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_6, ONHOLD , [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_VT_REMOTE_RX CAPABILITY_SUPPORTS_VT_REMOTE_TX CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL], [Properties:], children:[], parent:null, conferenceable:[Call [id: TC@12, state: ACTIVE, details: [id: TC@12, state: ACTIVE, pa:
12-28 15:27:58.839 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_7, ACTIVE , [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_VT_REMOTE_RX CAPABILITY_SUPPORTS_VT_REMOTE_TX CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL], [Properties:], children:[], parent:null, conferenceable:[Call [id: TC@11, state: HOLDING, details: [id: TC@11, state: HOLDING, pa:

//三方通话
12-28 15:27:53.152 V/RtcCC ( 1229): [0] dumpImsCallList id=1, state=4, number=186, conf=0, confHost=0, ecc=0, video=0, mt=0name=
12-28 15:27:53.152 V/RtcCC ( 1229): [0] dumpImsCallList id=2, state=3, number=110, conf=0, confHost=0, ecc=0, video=0, mt=0name=

//开始合并通话
12-28 15:27:58.244 D/ImsCallSessionProxy( 2314): [callId = 2] merge()
12-28 15:27:58.274 I/AT ( 1229): [0] AT> AT+CHLD=3 (RIL_CMD_RT_7 tid:498919128320)
12-28 15:27:58.286 V/RtcCC ( 1229): [0] dumpImsCallList id=1, state=4, number=186, conf=0, confHost=0, ecc=0, video=0, mt=0name=
12-28 15:27:58.286 V/RtcCC ( 1229): [0] dumpImsCallList id=2, state=3, number=110, conf=0, confHost=0, ecc=0, video=0, mt=0name=
12-28 15:27:58.286 V/RtcCC ( 1229): [0] dumpImsCallList id=3, state=1, number=, conf=1, confHost=1, ecc=0, video=0, mt=0name=

//状态更新

12-28 15:27:59.370 V/RtcCC ( 1229): [0] dumpImsCallList id=1, state=4, number=186, conf=0, confHost=0, ecc=0, video=0, mt=0name=
12-28 15:27:59.370 V/RtcCC ( 1229): [0] dumpImsCallList id=2, state=4, number=110, conf=0, confHost=0, ecc=0, video=0, mt=0name=
12-28 15:27:59.370 V/RtcCC ( 1229): [0] dumpImsCallList id=3, state=3, number=, conf=1, confHost=1, ecc=0, video=0, mt=0name=

//待合入
12-28 15:27:59.370 V/RtcCC ( 1229): [0] dumpImsCallList mToBeMergedCalls id=1, state=4, number=186, conf=0, confHost=0, ecc=0, video=0, mt=0name=
12-28 15:27:59.370 V/RtcCC ( 1229): [0] dumpImsCallList mToBeMergedCalls id=2, state=4, number=110, conf=0, confHost=0, ecc=0, video=0, mt=0name=

//第一路加入电话会议成功
12-28 15:27:59.639 V/RtcCC ( 1229): [0] dumpImsCallList id=2, state=4, number=110, conf=0, confHost=0, ecc=0, video=0, mt=0name=
12-28 15:27:59.639 V/RtcCC ( 1229): [0] dumpImsCallList id=3, state=3, number=, conf=1, confHost=1, ecc=0, video=0, mt=0name=
12-28 15:27:59.639 V/RtcCC ( 1229): [0] dumpImsCallList participant id=301, state=3, number=186, conf=1, confHost=1, ecc=0, video=0, mt=0name=
12-28 15:27:59.639 V/RtcCC ( 1229): [0] dumpImsCallList mToBeMergedCalls id=2, state=4, number=110, conf=0, confHost=0, ecc=0, video=0, mt=0name= //合并成功
12-28 15:27:59.901 I/AT ( 1229): [0] AT< +ECONF=*** (RIL_URC_READER, tid:498916859136)
12-28 15:27:59.905 V/RtcCC ( 1229): [0] dumpImsCallList id=3, state=3, number=, conf=1, confHost=1, ecc=0, video=0, mt=0name=
12-28 15:27:59.905 V/RtcCC ( 1229): [0] dumpImsCallList participant id=301, state=3, number=186, conf=1, confHost=1, ecc=0, video=0, mt=0name=
12-28 15:27:59.905 V/RtcCC ( 1229): [0] dumpImsCallList participant id=302, state=3, number=110, conf=1, confHost=1, ecc=0, video=0, mt=0name=

//合并成功Dialer对应Log
12-28 15:28:00.789 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_8, CONFERENCED , [Capabilities:], [Properties:], children:[], parent:DialerCall_10, conferenceable:[], videoState:Audio Only, SessionModificationState:0, CameraDir:-1]
12-28 15:28:00.813 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_9, CONFERENCED , [Capabilities:], [Properties:], children:[], parent:DialerCall_10, conferenceable:[], videoState:Audio Only, SessionModificationState:0, CameraDir:-1]
12-28 15:28:00.891 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_10, ACTIVE , [Capabilities: CAPABILITY_HOLD CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_MANAGE_CONFERENCE CAPABILITY_SUPPORTS_VT_LOCAL_RX], [Properties: PROPERTY_CONFERENCE PROPERTY_HIGH_DEF_AUDIO], children:[DialerCall_8, DialerCall_9], parent:null, conferenceable:[], videoState:Audio Only, SessionModificationState:0, CameraDir:-1]

//断掉之前通话连接
12-28 15:28:00.053 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_6, DISCONNECTED , [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_VT_REMOTE_RX CAPABILITY_SUPPORTS_VT_REMOTE_TX CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL], [Properties:], children:[], parent:null, conferenceable:[Call [id: TC@12, state: ACTIVE, details: [id: TC@12, state: ACTIVE, pa:
12-28 15:28:00.988 I/DialerCallList(21480): com.android.incallui.call.CallList$DialerCallListenerImpl.onDialerCallDisconnect:1069 [DialerCall_7, DISCONNECTED , [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_VT_REMOTE_RX CAPABILITY_SUPPORTS_VT_REMOTE_TX CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL], [Properties:], children:[], parent:null, conferenceable:[], videoState:Audio Only, SessionModificationState:0, CameraDir:-1]

IMS电话会议流程和CS电话会议流程有较大区别,对于ap侧而言,IMS电话会议需要断开之前三方通话所有连接。

6、通话音频

6.1 、音频通道设置

通话音频在CallAudioRouteStateMachine.java 中进行设置,该类本身为状态机,包含多种状态,当有耳机或者用户手动操作时,状态机在不同状态之间进行切换,从而使音频从不同设备中发出声音。

复制代码
     private void createStates(int earpieceControl) {

    
     switch (earpieceControl) {
    
         case EARPIECE_FORCE_DISABLED:
    
             mDoesDeviceSupportEarpieceRoute = false;
    
             break;
    
         case EARPIECE_FORCE_ENABLED:
    
             mDoesDeviceSupportEarpieceRoute = true;
    
             break;
    
         default:
    
             mDoesDeviceSupportEarpieceRoute = checkForEarpieceSupport();
    
     }
    
  
    
     addState(mActiveEarpieceRoute);
    
     addState(mActiveHeadsetRoute);
    
     addState(mActiveBluetoothRoute);
    
     addState(mActiveSpeakerRoute);
    
     addState(mRingingBluetoothRoute);
    
     addState(mQuiescentEarpieceRoute);
    
     addState(mQuiescentHeadsetRoute);
    
     addState(mQuiescentBluetoothRoute);
    
     addState(mQuiescentSpeakerRoute);
    
  
    
  
    
     mStateNameToRouteCode = new HashMap<>(8);
    
     mStateNameToRouteCode.put(mQuiescentEarpieceRoute.getName(), ROUTE_EARPIECE);
    
     mStateNameToRouteCode.put(mQuiescentBluetoothRoute.getName(), ROUTE_BLUETOOTH);
    
     mStateNameToRouteCode.put(mQuiescentHeadsetRoute.getName(), ROUTE_WIRED_HEADSET);
    
     mStateNameToRouteCode.put(mQuiescentSpeakerRoute.getName(), ROUTE_SPEAKER);
    
     mStateNameToRouteCode.put(mRingingBluetoothRoute.getName(), ROUTE_BLUETOOTH);
    
     mStateNameToRouteCode.put(mActiveEarpieceRoute.getName(), ROUTE_EARPIECE);
    
     mStateNameToRouteCode.put(mActiveBluetoothRoute.getName(), ROUTE_BLUETOOTH);
    
     mStateNameToRouteCode.put(mActiveHeadsetRoute.getName(), ROUTE_WIRED_HEADSET);
    
     mStateNameToRouteCode.put(mActiveSpeakerRoute.getName(), ROUTE_SPEAKER);
    
  
    
     mRouteCodeToQuiescentState = new HashMap<>(4);
    
     mRouteCodeToQuiescentState.put(ROUTE_EARPIECE, mQuiescentEarpieceRoute);
    
     mRouteCodeToQuiescentState.put(ROUTE_BLUETOOTH, mQuiescentBluetoothRoute);
    
     mRouteCodeToQuiescentState.put(ROUTE_SPEAKER, mQuiescentSpeakerRoute);
    
     mRouteCodeToQuiescentState.put(ROUTE_WIRED_HEADSET, mQuiescentHeadsetRoute);
    
     }

该状态机种包含若干种状态,主要涉及听筒,蓝牙,有线耳机,外放等设备之间的相互切换。状态机中的状态仅仅四种设备和通话状态中的混合而已。Quiescent 表示静止状态,Acivte为通话中,Ring则为来电状态

/** Direct the audio stream through the device's earpiece. */ 听筒
public static final int ROUTE_EARPIECE = CallAudioState.ROUTE_EARPIECE;

/** Direct the audio stream through Bluetooth. */ 蓝牙模式
public static final int ROUTE_BLUETOOTH = CallAudioState.ROUTE_BLUETOOTH;

/** Direct the audio stream through a wired headset. */ 有线耳机
public static final int ROUTE_WIRED_HEADSET = CallAudioState.ROUTE_WIRED_HEADSET;

/** Direct the audio stream through the device's speakerphone. */ 外放
public static final int ROUTE_SPEAKER = CallAudioState.ROUTE_SPEAKER;

6.2 、耳机按键处理

Telecom 启动时会初始化 HeadsetMediaButton类,注册MediaSession监听。当存在通话时,将相关监听激活。一旦用户操作手机上的HOOK按键后,会回调回来进行通话的挂断或暂停操作。具体流程如下图。

具体实现在Telecom中的CallsManager中

6.3 、来电铃声

来电铃音在Telecom的Ringer类中,Android原生支持在来电时,power键关闭铃声,其具体流程如下

6.4 、来电回铃音

有些运营商VOLTE网络不健全,在通话接通过程前,没有嘟嘟的网络会铃音。Android系统支持来电回铃音定制,具体在Telecom中的RingbackPlayer中,部分运营商有相关需求定制。具体可以参考此文章。

VOLTE是否本地播放回铃音还是网络播放_终端的回铃音是网络侧处理还是自己播放-博客

7、SRVCC

当LTE信号弱时,会发生通话从IMS域回落到CS域的现象。

//拨打
06-25 14:21:37.738140 2855 2855 D ImsPhoneCallTracker: [0] dial clirMode=0

//IMS回落
06-25 14:21:52.701485 1688 1701 I AT : [0] AT< +EVADSREP: 0 (RIL_URC_READER, tid:2776584672)
06-25 14:21:52.702412 1688 1702 D RmcImsCCUrcHandler: [0] EVADSREP: cs
06-25 14:21:52.702541 1688 1702 E RmcImsCCUrcHandler: [0] Notify SRVCC state: 0
06-25 14:21:52.702672 1688 1702 E RmcImsCCUrcHandler: [0] Notify SRVCC state: 1

//SRVCC
06-25 14:21:52.709267 2855 3175 D RILJ : [UNSL]< UNSOL_SRVCC_STATE_NOTIFY {0} [PHONE0]
06-25 14:21:52.718913 2855 3175 D RILJ : [UNSL]< UNSOL_RESPONSE_CALL_STATE_CHANGED [PHONE0]
06-25 14:21:52.724245 2855 2855 D ImsPhoneCallTracker: [0] SRVCC: Connection isMultiparty is falseand isConfHost is false before handover
06-25 14:21:52.724956 2800 1510 D ImsCallSessionProxy: [callId = 1] close() : ImsCallSessionProxy is closed!!!
06-25 14:21:52.725541 2800 1510 D ImsCallSessionProxy: [callId = 1] getVideoCallProvider() : mVTProvider = com.mediatek.ims.internal.ImsVTProvider@64cec56
06-25 14:21:52.725641 2800 1510 D ImsCallSessionProxy: [callId = 1] close() : Start VtProvider setUIMode
06-25 14:21:52.729937 2855 2855 D ImsPhoneCallTracker: [0] transferHandoverConnections mSrvccState:COMPLETED

//CS域通知
06-25 14:21:52.741172 2855 2855 D GsmCdmaCallTracker: [0] notifySrvccState: state=COMPLETED, mHandoverConnections= [[ImsPhoneConnection objId: 218237521 telecomCallID: TC@6_1 address: [] isAdhocConf: N ImsCall: [ImsCall objId:42728077 onHold:N mute:N updateRequest:NONE merging:N merge action pending:N merged:N multiParty:N confHost:N buried term:N isVideo: N wasVideo: N isWifi: N session:null transientSession:null]] state:DIALING mParent:Handover Call]
06-25 14:21:52.746001 2855 2855 D RILJ : [4004]> GET_CURRENT_CALLS [PHONE0]
06-25 14:21:52.755570 2855 3175 D RILJ : [4004]< GET_CURRENT_CALLS {[id=1,DIALING,toa=129,norm,mo,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
06-25 14:21:52.796278 2855 2855 D GsmCdmaCallTracker: [0] New connection is not mPendingMO. Creating new GsmCdmaConnection, objId=54172833
06-25 14:21:52.796505 2855 2855 D GsmCdmaCallTracker: [0] getHoConnection - compare number: hoConn= [ImsPhoneConnection objId: 218237521 telecomCallID: TC@6_1 address: [
] isAdhocConf: N ImsCall: [ImsCall objId:42728077 onHold:N mute:N updateRequest:NONE merging:N merge action pending:N merged:N multiParty:N confHost:N buried term:N isVideo: N wasVideo: N isWifi: N session:null transientSession:null]] state:DIALING mParent:Handover Call
06-25 14:21:52.796595 2855 2855 D GsmCdmaCallTracker: [0] getHoConnection: Handover connection match found = [ImsPhoneConnection objId: 218237521 telecomCallID: TC@6_1 address: [****] isAdhocConf: N ImsCall: [ImsCall objId:42728077 onHold:N mute:N updateRequest:NONE merging:N merge action pending:N merged:N multiParty:N confHost:N buried term:N isVideo: N wasVideo: N isWifi: N session:null transientSession:null]] state:DIALING mParent:Handover Call
06-25 14:21:52.796644 2855 2855 D GsmCdmaCallTracker: [0] Handover connection found.
06-25 14:21:52.797920 2855 2855 D GsmCdmaCallTracker: [0] update phone state, old=IDLE new=OFFHOOK

//Telephony更新
06-25 14:21:52.802202 2855 2855 I Telephony: MtkGsmCdmaConnection: Connection changed due to: MSG_HANDOVER_STATE_CHANGED
06-25 14:21:52.803876 2855 2855 I Telephony: Setting original connection after handover or redial, current original connection=[ImsPhoneConnection objId: 218237521 telecomCallID: TC@6_1 address: [] isAdhocConf: N ImsCall: [ImsCall objId:42728077 onHold:N mute:N updateRequest:NONE merging:N merge action pending:N merged:N multiParty:N confHost:N buried term:N isVideo: N wasVideo: N isWifi: N session:null transientSession:null]] state:DIALING mParent:Handover Call, new original connection= callId: null objId: 54172833 isExternal: N incoming: false state: DIALING post dial state: NOT_STARTED
06-25 14:21:52.804521 2855 2855 I Telephony: setOriginalConnection: TelephonyConnection, originalConnection: callId: null objId: 54172833 isExternal: N incoming: false state: DIALING post dial state: NOT_STARTED
06-25 14:21:52.804692 2855 2855 I Telephony: MtkGsmCdmaConnection: clearOriginalConnection; clearing=[ImsPhoneConnection objId: 218237521 telecomCallID: TC@6_1 address: [
] isAdhocConf: N ImsCall: [ImsCall objId:42728077 onHold:N mute:N updateRequest:NONE merging:N merge action pending:N merged:N multiParty:N confHost:N buried term:N isVideo: N wasVideo: N isWifi: N session:null transientSession:null]] state:DIALING mParent:Handover Call
06-25 14:21:52.805411 2855 2855 I Telephony: MtkGsmCdmaConnection: registerForCallEvents; phone=Handler (com.mediatek.internal.telephony.MtkGsmCdmaPhone) {2f4267b}
06-25 14:21:52.812870 2855 2855 W Telephony: TelephonyConferenceController: add - connection already tracked; connection=[TelephonyConnection objId:33477698 telecomCallID:TC@6_1 type:gsmcdma state:DIALING capabilities:[Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO] properties:[Properties:] address:[****] originalConnection: callId: TC@6_1 objId: 54172833 isExternal: N incoming: false state: DIALING post dial state: NOT_STARTED partOfConf:N confSupported:Y isAdhocConf:N]

全部评论 (0)

还没有任何评论哟~