前话:
虽然5G都要上码了。但是还是有CDMA 1x通话存在世上。就还是有CDMA 1X的通话问题需要解释。
这不,就遇到了电信1X网络收到第三方来电,对方主动挂断后,来电界面不消失。
简单解释
1X的三方通话时通过flash消息辅助的。第三方来电网络只是下发一个带电话号码的flash的消息。modem向AP报一个RIL_CDMA_DISPLAY_INFO_REC,framwork层转换成一个CDMAconnection。
由于只有一个flash信令通知来电,所以AP其实无从得知对方是否挂断电话。只好设置一个20s的定时器。20s定时到后,移除这通电话。(当然20s内接听也会移除)
所以第三方来电无论是第三方在来电后10s就挂了,还是来电后40s才挂,被叫方都是显示第三方来电20s自动消失。
如果10s就挂,会出现,为什么主叫已经挂了,还响铃10s呢?
如果40s才挂,会出现,为什么主叫还没有挂,怎么响铃20s响铃就没了呢?
目前看到的平台代码,计时是20s。我用华为机器测试是18s。
1x网络和其他网络正常流程对比-AP侧
1x网络第三方来电
1x网络下电放来电通过UNSOL_CDMA_CALL_WAITING 上报。没有生成的新的通话。所以第三方来电后,第三方主动挂断也无从得知。
Volte通话
很明显第三方的来电时有独立的call id的。主叫方挂断会触发call id进到end状态。
3gpp 普通语音
很明显第三方的来电时也有独立的call id的。主叫方挂断会触发移除call id。
总结
从上面log截图可以看出,1x的第三方来电通过UNSOL_CDMA_CALL_WAITING 上报,当第三方挂断时没有其他UNSOl 命令上报上来。(为什么没有,这是由于1x网络协议导致,第三方来电时有flash消息,第三方挂断时没有任何消息啊!无奈。。。)。没有UNSOL命令上报,自然无法移除第三方来电。
而其他网络第三方通话是有独立的call id,独立的状态机。
modem侧上报
call状态上报
call id是modem 侧通过qmi消息上报上来的,需要抓modem侧log。以volte通话为例:
modem上报的voice_all_call_status ind,中包含了call_id, 和call type 。volte高清语音的call_type是CALL_TYPE_VOICE_IP。
1x的第三方来电 qmi ind
1x网络下第三方来电没有通过voice_all_call_status ind上报,而是通过voice_info_rec_ind上报,call_id仍然是1,不独立。
其他网络第三方来电的ind
第三方来电
第三方来电挂断
还是通过voice_all_call_status ind上报,num_of_instances为2.第三方来电的call_id是2,状态是waiting。其第三方通话来电和挂断时都有相应的voice_all_call_status ind上报。(当然主要是依赖网络侧信令设计给力。)
第三方来电空口消息
1x网络消息
可以看到 第三方来电只有一个flash消息。第三方挂断没有特殊消息。
volte通话 SIP消息
可以看到第三方通话的SIP消息也是完整的。
1X网络下,第三方主动挂断后,来电界面何时消失
从测试结果看,当1x下不主动挂断第三方来电时,无论是第三方提前挂断,还是第三方一直等待知道网络挂断,第三方来电界面都是20s消失。
AP telecom层消息和一般电话end的日志是一样的。
通过日志中INCOMING_MISSED查找,
从这里可以看出来CdmaConnection建立后,开启20s定时器,超时断开connection。startCallWaitingTimer函数的注释也说的很明白,由于无法判断waitingcall的走向,所以用户没有接听时,超时移除。