之前在Windows Mobile上实现过“电话已关机”,“此号码已停机”等,是用的来电转移实现的,现在需要在Android上实现,发现360手机安全卫士for Android 也是通过来电转移实现的,尝试了下,代码如下:
- //13800000000即是要转移到的号码
- Intent localIntent = new Intent();
- localIntent.setAction("android.intent.action.CALL");
- Uri uri = Uri.parse("tel:" + "**67*13800000000%23");
- localIntent.setData(uri);
- startActivity(localIntent);
以下号码供参考:
返回空号的提示音:**67#13800000000# 或者 **67#13444444444#
返回暂时无法接通:**67#13642952697# 返回停机的提示音:**67#13701110216# 返回电话号码有误:**67#13800516309# 返回电话号码关机:**67#13810538911#
转移还有以下方式
1、无条件呼叫转移: 激活方式**21*号码# , 取消方式##21# , 查询方式 *#21# ; ! [6 ~# a; [3 X) u" X) r8 Y4 d2、 遇忙呼叫转移: 激活方式**67*号码# , 取消方式##67# , 查询方式 *#67# ; 3、 无应答呼叫转移: 激活方式**61*号码# , 取消方式##61# , 查询方式*#61# ; 4、 不可及呼叫转移: 激活方式**62*号码# , 取消方式##62# , 查询方式 *#62# .
所以取消呼叫转移的代码如下
- Intent localIntent = new Intent();
- localIntent.setAction("android.intent.action.CALL");
- Uri uri = Uri.parse("tel:" + "%23%2367%23");
- localIntent.setData(uri);
- startActivity(localIntent);
注意:"#" 必须用 "%23“代替
拦截后提示忙音/空号/已关机/已停机
这个功能其实是要用到MMI指令,具体如何设置呼叫转移的指定可以参考这里 。 在 本文中我们会用到“遇忙转移”转移的功能。中国移动的设置方式是 **67#电话号码#,取消方式为 ##67#。这两个指令可以直接在手机的拨号界面输入测试。ITelephony的endcall方法挂断电话后,会提示电话忙。如果事前设置好了忙时转 移到一个空号/已关机/已停机的电话号码,就会提示您拨的电话号码是空号/已关机/已停机。 其实大家可以下载 xxx卫士看下,它设置来电拒接模式后,都是会启动设置MMI指令的界面。然后再去“设置》通话设置》来电转接”,看看 “占线时转接” 设置好的电话号码,就可以知道空号/已关机/已停机对应的电话号码是什么了。 有几点要说明下: 1. 修改一下BLOCKED_NUMBER这个变量值,把它设置为你要测试拦截的电话号码。 2. 全部功能是在一个Activity里实现的,所以大家要先运行这个Activity,然后点击“设置呼叫转移”,设置好呼叫转移后,不要关闭这个Activity,关了就拦截不了电话了。有心的朋友可以自己去写一个Service在后台运行拦截功能。代码如下:
- import java.lang.reflect.Method;
- import android.app.Activity;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.media.AudioManager;
- import android.net.Uri;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.os.RemoteException;
- import android.telephony.TelephonyManager;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import com.android.internal.telephony.ITelephony;
- /**
- * 演示如何设置呼叫转移,拦截电话(拦截后提示为空号)的例子
- * @author Tony from ToEach.
- * @email wan1976@21cn.com
- */
- public class MainActivity extends Activity {
- private static final String TAG = MainActivity.class.getSimpleName();
- private final static int OP_REGISTER = 100;
- private final static int OP_CANCEL = 200;
- private final static String BLOCKED_NUMBER = "1892501xxxx";//要拦截的号码
- //占线时转移,这里13800000000是空号,所以会提示所拨的号码为空号
- private final String ENABLE_SERVICE = "tel:**67*13800000000%23";
- //占线时转移
- private final String DISABLE_SERVICE = "tel:%23%2367%23";
- private IncomingCallReceiver mReceiver;
- private ITelephony iTelephony;
- private AudioManager mAudioManager;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- findViewById(R.id.btnEnable).setOnClickListener(new OnClickListener(){
- public void onClick(View v) {
- //设置呼叫转移
- Message message = mHandler.obtainMessage();
- message.what = OP_REGISTER;
- mHandler.dispatchMessage(message);
- }
- });
- findViewById(R.id.btnDisable).setOnClickListener(new OnClickListener(){
- public void onClick(View v) {
- //取消呼叫转移
- Message message = mHandler.obtainMessage();
- message.what = OP_CANCEL;
- mHandler.dispatchMessage(message);
- }
- });
- mReceiver = new IncomingCallReceiver();
- IntentFilter filter = new IntentFilter("android.intent.action.PHONE_STATE");
- registerReceiver(mReceiver, filter);// 注册BroadcastReceiver
- mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
- //利用反射获取隐藏的endcall方法
- TelephonyManager telephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
- try {
- Method getITelephonyMethod = TelephonyManager.class.getDeclaredMethod("getITelephony", (Class[]) null);
- getITelephonyMethod.setAccessible(true);
- iTelephony = (ITelephony) getITelephonyMethod.invoke(telephonyMgr, (Object[]) null);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private Handler mHandler = new Handler() {
- public void handleMessage(Message response) {
- int what = response.what;
- switch(what) {
- case OP_REGISTER:{
- Intent i = new Intent(Intent.ACTION_CALL);
- i.setData(Uri.parse(ENABLE_SERVICE));
- startActivity(i);
- break;
- }
- case OP_CANCEL:{
- Intent i = new Intent(Intent.ACTION_CALL);
- i.setData(Uri.parse(DISABLE_SERVICE));
- startActivity(i);
- break;
- }
- }
- }
- };
- private class IncomingCallReceiver extends BroadcastReceiver{
- @Override
- public void onReceive(Context context, Intent intent) {
- String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
- Log.i(TAG, "State: "+ state);
- String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
- Log.d(TAG, "Incomng Number: " + number);
- if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){ //电话正在响铃
- if(number.equals(BLOCKED_NUMBER)){ //拦截指定的电话号码
- //先静音处理
- mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
- Log.d(TAG, "Turn ringtone silent");
- try {
- //挂断电话
- iTelephony.endCall();
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- //再恢复正常铃声
- mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
- }
- }
- }
- }
- }