背景
以下内容基于Android Q。
单通通话
单通通话发生SRVCC时很简单,RIL上报SRVCC状态变更的消息,并会上报CALL状态变更的消息,fw收到后断开ImsCall/ImsPhoneConnection新建DriverCall/GsmCdmaConnection并把它关联到TelephonyConnection。其流程图如下:
srvcc变更流程整个过程TelephonyConnection、Telecom/Call、InCall/Call不会变。如下:
SRVCC后的Call变更更多Ims通话相关内容请参考:Android IMS 通话应用设计
会议电话
和单通通话一样,会议电话发生SRVCC后RIL上报SRVCC状态变更的消息,并会上报CALL状态变更的消息,fw收到后断开ImsCall/ImsPhoneConnection新建DriverCall/GsmCdmaConnection,但不同的是新建的GsmCdmaConnection不会延用原来Ims会议电话的host TelephonyConnection,而是断开原来所有的TelephonyConnection、ImsConference、ConferenceParticipantConnection,然后新建对应的TelephonyConnection和TelephonyConference。如下:
会议电话发生SRVCC后的Call变更可以看到因为断开又新建了TelephonyConference和它的参与者TelephonyConnection,Telecom/Call、InCall/Call也对应断开新建了。
流程图如下:
会议电话srvcc变更流程1. 和原先ImsPhoneConnection address A相同的GsmCdmaConnection通知ImsConference的host TelephonyConnection更新original connection,ImsConference得知后发现已不是ims通话则断开原先ims会议电话的TelephonyConnection,并为其新建一个与GsmCdmaConnection address A对应的TelephonyConnection。
2. address为B的GsmCdmaConnection直接通知注册的PstnIncomingCallNotifier有新的Unknown Connection(既不是来电也不是已知去电),PstnIncomingCallNotifier从GsmCdmaConnection来出address等消息直接调用TelecomManager#addNewUnknownCall(),之后Telecom新建一个Call并通知新建一个对应的TelephonyConnection。
3. 上面2的Telecom/Call和TelephonyConnection的连接建立完成后会触发TelephonyConferenceController重新评估会议电话的状态,当发现当前所有Connection都是多方通话的参与者时会构建TelephonyConference,并通知Telecom为其新建Call。
4. 将所有TelephonyConnection加入TelephonyConference并通知Telecom它们的父子关系。
会议电话的更多内容请参考:Android 会议电话应用设计
原创内容欢迎转载,但请注明出处,谢谢!
网友评论