android Switching Voice Phone 流程

最近遇到voice phone在切phone时通话自动挂断的问题。


在android8.0上还没有这个问题。


android8.1在GsmCdmaphone.reset()函数添加了一行如下代码,导致framwork层清空通话信息。

gsmCdmaConnection.ondisconnect().

通过查谷歌的代码提交记录,谷歌在android8.1上的一次提交添加了这行代码。是在执行测试代码时,对reset()函数做的优化。这个优化是否合理这里就不讨论了。这个修改只是针对framwork层清空了所有通话connection,导致所有通话自动挂断。如果此通话在底层切phone的时候,仍然存在,那么久导致底层和上层的通话状态不一致。


这个不一致在某些产品拨紧急号码拨号时触发。为何不是所有产品?请注意只有通话是走GsmCdmaPhone拨出时才会建立gsmCdmaConnection。而目前很多情况下紧急号码都是走IMSphone呼出,此时底层虽然紧急号码目前还是走CS呼出不是走IMS,但是上层的connection是IMSphone维护。IMSphone不关注GSM  CDMAphone切换。(你切你的,能耐我何。。。。)所以紧急号码也就不会在框架层被自动清除。


那么切phone自动挂断电话的log如下:

04-02 16:35:48.721  2584  2584 D QtiGsmCdmaPhone: handleMessage: Event: 39
04-02 16:35:48.721  2584  2584 D GsmCdmaPhone: [GsmCdmaPhone][0]EVENT_VOICE_RADIO_TECH_CHANGED: newVoiceTech=3
04-02 16:35:48.721  2584  2584 D GsmCdmaPhone: [GsmCdmaPhone][0]phoneObjectUpdater: newVoiceRadioTech=3
04-02 16:35:48.721  2584  2584 D GsmCdmaPhone: [GsmCdmaPhone][0]Switching Voice Phone : CDMA >>> GSM

04-02 16:35:48.721  2584  2584 D GsmCdmaPhone: [GsmCdmaPhone][0]Precise phone type 1

04-02 16:35:48.721  2584  2584 D RILJ    : setPhoneType=1 old value=2 [SUB0]
04-02 16:35:48.722  2584  2584 D TelephonyManager: setTelephonyProperty: success phoneId=0 property=gsm.current.phone-type value: 1 propVal=1,1

04-02 16:35:48.723  2584  2584 D IccCardProxy: [0]Setting radio tech UMTS

04-02 16:35:48.734  2584  2584 D GsmCdmaCallTracker: reset
04-02 16:35:48.735  2584  2584 D GsmCdmaConnection: onDisconnect: cause=36

函数调用序列如下:

GsmCdmaPhone 初始化时GsmCdmaPhone.initOnce()->CommandInterface.registerForVoiceRadioTechchanged(EVENT_RIL_RADIO_TECH_CHANGED)-》mVoiceRadioTechChangeRegistrants.add()。即当RadioIndication.java的voiceRadipTechChanged函数被调用时,

RadioIndication.voiceRadipTechChanged()->RIL.mVoiceRadioTechChangeRegistrants.notifyRegistrants()-GsmCdmaPhone->handleMessage(EVENT_RIL_RADIO_TECH_CHANGED)->GsmCdmaPhone.phoneObjectUpdater(newVoiceTech)->GsmCdmaPhone.switchVoiceRadioTech()->GsmCdmaPhone.switchPhoneType()->GsmCdmaCallTracker.updatePhoneType()->GsmCdmaCallTracker.reset()->GsmCdmaConnection.onDisconnect(Error_UNSPECIFIED)->GsmCdmaPhone.notifyDisconnect() and GsmCdmaCall.connectionDisconnected()


GsmCdmaPhone.notifyDisconnect() 通知谁呢?

CallManager.registerForPhoneStates()->Phone.registerForDisconnect(Event_DISCONNECT)

则会触发CallManager.handleMessage(EVENT_DISCONNECT)->mDisconnectRegistrants.notifyRegistarants()


好了又来一层CallManager 通知谁呢,CallNotifier.registerForNofifications()->CallManager.registerForDisconnect(PHONE_DISCONNECT)





这部分打印的流程:

触发流程2选1

情况1

/    2580  2580 D Telephony: GsmConnection: Disconnected with cause DisconnectCause [ Code: (ERROR) Label: () Description: () Reason: (ERROR_UNSPECIFIED) Tone: (27) ]

情况2

/     2580  2580 D Telephony: FailureSignalingConnection: Disconnected with cause DisconnectCause [ Code: (ERROR) Label: () Description: () Reason: (Phone is null, ERROR_UNSPECIFIED) Tone: (27) ]: (SBC.oSC)->CS.crCo->H.CS.crCo->H.CS.crCo.pICR@E-AZs_0_0_0

 1916  2122 D Telecom : ConnectionServiceWrapper: ConnectionService -> Telecom[com.android.phone/com.android.services.telephony.TelephonyConnectionService]: setDisconnected

04-02 16:35:24.671  1937  2644 I Telecom : CallsManager: setCallState DIALING -> DISCONNECTED, call: [TC@1, DIALING, com.android.phone/com.android.services.telephony.TelephonyConnectionService, tel:**, A, childs(0), has_parent(false), [Capabilities: CAPABILITY_MUTE CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO], [Properties:]]: CSW.sDc@AG8
04-02 16:35:24.676  1937  2644 I Telecom : Event: RecordEntry TC@1: SET_DISCONNECTED, disconnected set explicitly> DisconnectCause [ Code: (ERROR) Label: () Description: () Reason: (ERROR_UNSPECIFIED) Tone: (27) ]: CSW.sDc@AG8
04-02 16:35:24.687  1937  2644 I Telecom : CallAudioManager: is ConfURI call disconnected = false call = [TC@1, DISCONNECTED, com.android.phone/com.android.services.telephony.TelephonyConnectionService, tel:**, A, childs(0), has_parent(false), [Capabilities: CAPABILITY_MUTE CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO], [Properties:]]: CSW.sDc@AG8
04-02 16:35:24.693  1937  2644 I Telecom : InCallController: Sending updateCall [TC@1, DISCONNECTED, com.android.phone/com.android.services.telephony.TelephonyConnectionService, tel:**, A, childs(0), has_parent(false), [Capabilities: CAPABILITY_MUTE CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO], [Properties:]]: CSW.sDc@AG8
04-02 16:35:24.784  1937  2644 I Telecom : Event: RecordEntry TC@1: DESTROYED, null: CSW.rC@AHA

04-02 16:35:24.790  1937  2644 I Telecom : InCallController: onCallRemoved: [TC@1, DISCONNECTED, null, tel:**, A, childs(0), has_parent(false), [Capabilities: CAPABILITY_MUTE CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO], [Properties:]]: CSW.rC@AHA

相关函数调用如下:

在ConnectionService.addconnection()时conncetion.addConnectionListener(mConncetionListener).则Connection.setDisconnected->listener.onDisconnceted即   ConncetionService.mConncetionListener.onDisconnected()->ConncetionServiceAdapter.setDisconnected()->通过binder机制到服务端ConnectionServiceWrapper.IconncetionServiceAdapter.setDisconnected()->CallsManager.markCallAsDisconnected()->CallsManager.setCallState()->Call.setState and CallsManagerListener.onCallStateChanged()




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
电路交换(circuit switching)和分组交换(packet switching)是计算机通信网络中两种不同的传输方式。 电路交换是一种传输方式,它在通信双方建立连接后,为其保留一条专用的通信线路(电路),直到通信结束。在建立连接前,通信双方的资源(带宽、端口等)将被保留,无法被其他通信使用。这种方式类似于打电话,通信双方在通话期间拥有独占的通信线路。虽然电路交换具有稳定和有序的传输特点,在通话期间通信质量较好,但是连接建立需要时间,并且当通信线路空闲时也无法被其他通信使用,因此通信资源利用率较低。 分组交换是另一种传输方式,它将数据分割成小的数据包(分组)进行传输。发送方将数据包发送到网络中,然后它们独立地通过不同的路径到达目标地址,最后在目标地址处重新组装成完整的数据。与电路交换不同,分组交换在传输数据前不需要建立连接,数据包可以按需发送,并且网络的资源可以被多个通信共享。分组交换的特点是资源利用率高,灵活性强,适应性强。然而,由于数据包在网络中可能选择不同的路径,因此数据包可能会以不同的顺序到达目标地址。 综上所述,电路交换和分组交换是两种不同的传输方式。电路交换通过建立连接来进行通信,资源利用率较低,但通信质量较好;分组交换将数据分割成小的数据包进行传输,资源利用率高,但可能导致数据包乱序到达。根据不同的通信需求和网络规模,可以选择合适的传输方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值