Android中通过来电转移实现“电话已关机”,“此号码已停机”等

来源:互联网 发布:angular route.min.js 编辑:程序博客网 时间:2024/04/30 07:56

 挂断一个电话在API-10和之前版本中直接调用TelephonyManager对象的endCall方法即可, 但是之后的版本中这个API不再被公开(升级后的Android系统中还存在, 但是在Android SDK中不再提供给开发者* ). 所以这里用了反射机制

之前在Windows Mobile上实现过“电话已关机”,“此号码已停机”等,是用的来电转移实现的,现在需要在Android上实现,发现360手机安全卫士for Android 也是通过来电转移实现的,尝试了下,代码如下:

  1. //13800000000即是要转移到的号码  
  2. Intent localIntent = new Intent();  
  3. localIntent.setAction("android.intent.action.CALL");  
  4. Uri uri = Uri.parse("tel:" + "**67*13800000000%23");  
  5. localIntent.setData(uri);  
  6. 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 d
2、 遇忙呼叫转移: 激活方式**67*号码# , 取消方式##67# , 查询方式 *#67# ; 
3、 无应答呼叫转移: 激活方式**61*号码# , 取消方式##61# , 查询方式*#61# ; 
不可及呼叫转移: 激活方式**62*号码# , 取消方式##62# , 查询方式 *#62# .

 

所以取消呼叫转移的代码如下

  1. Intent localIntent = new Intent();  
  2. localIntent.setAction("android.intent.action.CALL");  
  3. Uri uri = Uri.parse("tel:" + "%23%2367%23");  
  4. localIntent.setData(uri);  
  5. startActivity(localIntent);   

注意:"#" 必须用 "%23“代替

拦截后提示忙音/空号/已关机/已停机
这个功能其实是要用到MMI指令,具体如何设置呼叫转移的指定可以参考这里http://baike.baidu.com/view/206402.html?fromTaglist
在 本文中我们会用到“遇忙转移”转移的功能。中国移动的设置方式是 **67#电话号码#,取消方式为 ##67#。这两个指令可以直接在手机的拨号界面输入测试。ITelephony的endcall方法挂断电话后,会提示电话忙。如果事前设置好了忙时转 移到一个空号/已关机/已停机的电话号码,就会提示您拨的电话号码是空号/已关机/已停机。
其实大家可以下载 xxx卫士看下,它设置来电拒接模式后,都是会启动设置MMI指令的界面。然后再去“设置》通话设置》来电转接”,看看 “占线时转接” 设置好的电话号码,就可以知道空号/已关机/已停机对应的电话号码是什么了。

 有几点要说明下:
1. 修改一下BLOCKED_NUMBER这个变量值,把它设置为你要测试拦截的电话号码。
2. 全部功能是在一个Activity里实现的,所以大家要先运行这个Activity,然后点击“设置呼叫转移”,设置好呼叫转移后,不要关闭这个Activity,关了就拦截不了电话了。有心的朋友可以自己去写一个Service在后台运行拦截功能。

代码如下:

  1. import java.lang.reflect.Method;  
  2.    
  3. import android.app.Activity;  
  4.  import android.content.BroadcastReceiver;  
  5.  import android.content.Context;  
  6.  import android.content.Intent;  
  7.  import android.content.IntentFilter;  
  8.  import android.media.AudioManager;  
  9.  import android.net.Uri;  
  10.  import android.os.Bundle;  
  11.  import android.os.Handler;  
  12.  import android.os.Message;  
  13.  import android.os.RemoteException;  
  14.  import android.telephony.TelephonyManager;  
  15.  import android.util.Log;  
  16.  import android.view.View;  
  17.  import android.view.View.OnClickListener;  
  18.    
  19. import com.android.internal.telephony.ITelephony;  
  20.    
  21. /**  
  22.   * 演示如何设置呼叫转移,拦截电话(拦截后提示为空号)的例子  
  23.   * @author Tony from ToEach.  
  24.   * @email wan1976@21cn.com   
  25.  */ 
  26.  public class MainActivity extends Activity {  
  27.   private static final String TAG = MainActivity.class.getSimpleName();  
  28.      
  29.   private final static int OP_REGISTER = 100;  
  30.   private final static int OP_CANCEL = 200;  
  31.     
  32.   private final static String BLOCKED_NUMBER = "1892501xxxx";//要拦截的号码  
  33.   //占线时转移,这里13800000000是空号,所以会提示所拨的号码为空号  
  34.      private final String ENABLE_SERVICE = "tel:**67*13800000000%23";  
  35.      //占线时转移  
  36.      private final String DISABLE_SERVICE = "tel:%23%2367%23";  
  37.    
  38.  private IncomingCallReceiver mReceiver;  
  39.      private ITelephony iTelephony;  
  40.      private AudioManager mAudioManager;  
  41.     
  42.      @Override 
  43.      public void onCreate(Bundle savedInstanceState) {  
  44.          super.onCreate(savedInstanceState);  
  45.          setContentView(R.layout.main);  
  46.            
  47.         findViewById(R.id.btnEnable).setOnClickListener(new OnClickListener(){  
  48.     public void onClick(View v) {  
  49.            //设置呼叫转移  
  50.            Message message = mHandler.obtainMessage();  
  51.      message.what = OP_REGISTER;  
  52.      mHandler.dispatchMessage(message);  
  53.     }  
  54.          });  
  55.            
  56.         findViewById(R.id.btnDisable).setOnClickListener(new OnClickListener(){  
  57.     public void onClick(View v) {  
  58.      //取消呼叫转移  
  59.               Message message = mHandler.obtainMessage();  
  60.         message.what = OP_CANCEL;  
  61.         mHandler.dispatchMessage(message);  
  62.     }  
  63.          });  
  64.            
  65.         mReceiver = new IncomingCallReceiver();  
  66.    IntentFilter filter = new IntentFilter("android.intent.action.PHONE_STATE");       
  67.         registerReceiver(mReceiver, filter);// 注册BroadcastReceiver   
  68.            
  69.         mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);  
  70.            
  71.         //利用反射获取隐藏的endcall方法  
  72.          TelephonyManager telephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
  73.    try {  
  74.     Method getITelephonyMethod = TelephonyManager.class.getDeclaredMethod("getITelephony", (Class[]) null);  
  75.     getITelephonyMethod.setAccessible(true);  
  76.     iTelephony = (ITelephony) getITelephonyMethod.invoke(telephonyMgr, (Object[]) null);  
  77.       } catch (Exception e) {  
  78.        e.printStackTrace();  
  79.       }  
  80.      }  
  81.        
  82.     private Handler mHandler = new Handler() {  
  83.    public void handleMessage(Message response) {  
  84.        int what = response.what;  
  85.        switch(what) {  
  86.         case OP_REGISTER:{  
  87.          Intent i = new Intent(Intent.ACTION_CALL);  
  88.                i.setData(Uri.parse(ENABLE_SERVICE));  
  89.                startActivity(i);  
  90.          break;  
  91.         }  
  92.         case OP_CANCEL:{  
  93.          Intent i = new Intent(Intent.ACTION_CALL);  
  94.                i.setData(Uri.parse(DISABLE_SERVICE));  
  95.                startActivity(i);  
  96.          break;  
  97.         }  
  98.        }  
  99.    }  
  100.   };  
  101.     
  102.   private class IncomingCallReceiver extends BroadcastReceiver{  
  103.    @Override 
  104.    public void onReceive(Context context, Intent intent) {  
  105.     String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);  
  106.           Log.i(TAG, "State: "+ state);  
  107.             
  108.    String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);  
  109.           Log.d(TAG, "Incomng Number: " + number);  
  110.             
  111.          if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){//电话正在响铃            
  112.            if(number.equals(BLOCKED_NUMBER)){//拦截指定的电话号码  
  113.             //先静音处理  
  114.             mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);  
  115.             Log.d(TAG, "Turn ringtone silent");  
  116.               
  117.             try {  
  118.              //挂断电话  
  119.        iTelephony.endCall();  
  120.       } catch (RemoteException e) {  
  121.        e.printStackTrace();  
  122.       }  
  123.         
  124.       //再恢复正常铃声  
  125.                   mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);  
  126.            }  
  127.           }  
  128.    }  
  129.   }  
  130.  }
0 0
原创粉丝点击