简介
运行商为我们提供了如下4中呼叫转移场景:
1、无条件呼叫转移:不管当前手机处于何种状态,来电都会被转移到指定的电话号码上。在使用这种呼叫转移时应当非常小心,如果启用了这种呼叫转移,你可就永远也接不着电话了,而且自己的手机不会有任何反应。
2、遇忙呼叫转移:这种呼叫转移方式很有用。例如,如果某个销售人员业务比较多时,恰好身边有另一部座机,可以将该呼叫转移号设置为座机号。这样在自己用手机接电话或打电话时恰巧有来电,会直接转移到座机上,这样就不会漏掉重要的电话了。该呼叫转移方式也在拒接时进行来电转移,因此,可以利用这种呼叫转移方式实现来电拦截功能。也就是说,当来电时,用程序迅速将电话挂断,这是根据设置的转移电话号码不同,对方会听到“电话已停机”、“电话已关机”、“号码是空号”和“正在通话中”4种语音答复。
3、无应答时呼叫转移:如果某种原因没有接听电话来电,知道一定时间后信号中断来进行转移。
4、无法接通时呼叫转移:当信号不在服务器、没有信号或关机时进行呼叫转移。
上述4种呼叫转移方式都要在拨号盘通过特殊号码来设置。不仅如此,还可以通过特殊号码取消呼叫转移以及查询某种呼叫转移是否已启用。上述4种呼叫转移方式对应的特殊号码如下所示:
功能 | 设置 | 取消 | 查询 |
始终进行呼叫转移 | **21*电话号码# | ##21# | *#21# |
占线时进行呼叫转移 | **67*电话号码# | ##67# | *#67# |
无应答时呼叫转移 | **61*电话号码# | ##61# | *#61# |
无法接通时呼叫转移 | **62*电话号码# | ##62# | *#62# |
Android 实现
设置占线时呼叫转移号码的代码如下:
Intent callIntent=new Intent(Intent.ACTION_CALL,Uri.parse(Uri.encode("tel:**67*12345678910#")));
startActivity(callIntent);
取消占线时呼叫转移号码的代码如下:
Intent callIntent=new Intent(Intent.ACTION_CALL,Uri.parse(Uri.encode("tel:##67#")));
startActivity(callIntent);
查询占线时呼叫转移号码的代码如下:
Intent callIntent=new Intent(Intent.ACTION_CALL,Uri.parse(Uri.encode("tel:*#67#")));
startActivity(callIntent);
无条件呼叫前转
无条件前转属于被叫侧业务,是指允许用户将所有来话无条件的转接到预先设定的前转方上,或前转到语音邮箱。
每一个通话所允许前转的最大次数不超过5次。前转的计数包括所有的前转类型。
对于一般的主、被叫用户号码,都可以做为前转目的号码,但是为了防止恶意呼叫,对于一些特殊的公众服务号码,如110,119,120等,不能被设置为呼叫前转的目的号码。
除特服号码外,用户已设置的呼叫限制号码也不能被设置成呼叫前转目的号码。
1-2)UE_A发送Invite请求,呼叫UE_B.
3)S-CSCF检测UE_B有呼叫前转业务,将请求转发给AS
4-6)AS执行无条件转移业务逻辑,给UE_A发送通知音,告诉UE_A呼叫被转移
7-8)AS向UE_C发送呼叫请求,添加History-Info头域
History-Info头域说明:
History-Info:<sip:UE_B@example.com>;index=1,<sip:UE_C@example.com?Reason=SIP;cause=302>;index=1.1
当前示例的History-Info含有两个条目,sip:UE_B@example.com指明最初的被叫方是UE_B,sip:UE_C@example.com指明后面呼叫指向UE_C。
URI中的Reason=SIP;cause=302属性,指明当前呼叫是由无条件前转触发的。如果cause=408指明是无应答前转,如果cause=486指明是遇忙前转。
index属性是用来表示呼叫历史的层次及不同层次的深度的,概念上比较容易混乱,我的理解如下:
红1.蓝1.绿3.黄1
在上图这个示例里,红色到蓝色转移了一次,之后从蓝色向绿色转移了一次,之后绿色转移了3次,其中2次自身转向自身,第3次转移到黄色,黄色为最终的转移目的地。
3GPP 协议
3GPP 24.604详细规定了无条件呼叫前转的流程,可前往查看。
参考资料
《IMS网络PSTN仿真业务技术要求(事件订阅机制)V1.2_markup120717(目录刷新)》
《IMS网络呼叫前转业务技术要求》
《RFC4244》
《RFC3326》