[Android][M0][Call] 呼叫转移

呼叫转移场景

呼叫转移一般有以下几种场景:

  1. 无条件转移(始终转移):不管手机当前处于何种状态,来电都会被转移到指定的电话号码上,自己的手机将不会有任何反应。

  2. 遇忙转移(占线转移):在自己的手机正处于通话状态时,来电将会被转移到指定电话号码上。这种方式在拒接时,也将进行来电转移。

一般的第三方安全软件可能会利用这种方式实现来电拦截功能,即来电时用代码迅速将电话挂断,这时候就会根据设置的转移号码的不同,对方会听到“已停机”、“已关机”、“空号”、“通话中”等语音提示。

  1. 无应答转移:因为某种原因,没有接听来电,知道一定的等待时间结束,信号中断后,才进行转移。

  2. 不可及转移(无法接通转移):当手机不在服务区、没有信号、关机时,进行呼叫转移。


Android 的呼叫转移设置

Android系统也同样提供了相应的程序入口进行设置,不同的手机ROM定制不一样,具体入口位置以及设置方式可能会有差异,但总体上都通过如下几种特殊号码格式进行设置的:

转移类型 激活 取消 查询 荣耀6移动标准版验证
无条件转移 **21*号码# ##21# *#21# 有效
遇忙转移 **67*号码# ##67# *#67# 有效
无应答转移 **61*号码# ##61# *#61# 有效
不可及转移 **62*号码# ##62# *#62# 有效

以如下号码为参考,号码格式大致就是这样的:
返回空号的提示音:**67#13800000000#,或者 **67#13444444444#
返回暂时无法接通:**67#13642952697#
返回停机的提示音:**67#13701110216#
返回电话号码有误:**67#13800516309#
返回电话号码关机:**67#13810538911#

但在实际编码过程中,# 号要替换成 %23,不能直接写。
如下设置遇忙返回空号提示:

Uri phoneUri = Uri.parse("tel:**67*13800000000%23");
Intent intent = new Intent(Intent.ACTION_CALL, phoneUri);
/// 6.0开始需要检查权限
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
    Log.e("Shawn", "open: 没有权限");
    return;
}
startActivity(intent);

跳转到示例代码(20191010更新地址)
运行效果如下:

[Android][M0][Call] 呼叫转移_第1张图片
荣耀6移动标准版
[Android][M0][Call] 呼叫转移_第2张图片
测试App界面

点了“开启呼叫转移”后,会有 Toast 提示正在运行代码,随后会弹框提示:


[Android][M0][Call] 呼叫转移_第3张图片
注册成功

点击“查询呼叫转移”后,会提示:


[Android][M0][Call] 呼叫转移_第4张图片
查询成功

进到通话设置里面的呼叫转移设置进行确认。这里遇忙已经设置成功了,不可及是我的手机本身就有的,并不是本次设置的。


[Android][M0][Call] 呼叫转移_第5张图片
确认设置成功

再回到测试App,点击“关闭呼叫转移”,会提示:


[Android][M0][Call] 呼叫转移_第6张图片
删除呼叫转移

再次进入通话设置里的呼叫转移设置进行确认:


[Android][M0][Call] 呼叫转移_第7张图片
确认删除成功

这里因为上面的呼叫转移设置界面不具备实时刷新能力,所以切回来的时候要注意先回退到上一级界面,再重新打开呼叫转移设置。


据说 CDMA 手机有自己的设置方法,如下:(未验证)
转移类型 激活方式 取消方式 查询方式
无条件转移 *72电话号码 *720 UNKNOWN
无应答转移 *92电话号码 *920 UNKNOWN
遇忙转移 *90电话号码 *900 UNKNOWN

你可能感兴趣的:([Android][M0][Call] 呼叫转移)