来电信息的拦截以及判断

如何拦截来电,并检测到某些特定号码时自动挂断电话?
使用反射的技术访问android SDK的内部功能来挂断电话
1.拦截来电的广播接收器类(InCallReceiver)的onReceive()方法

 

 1 public void onReceive(final Context context,Intent intent){  2  //得到电话管理服务,以便获得电话状态

 3  TelephonyManager tm=(TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);  4  //根据不同的来电状态进行处理

 5  switch(tm.getCallState()){  6      //响铃

 7   case TelephonyManager.CALL_STATE_RINGING:  8      //获得来电的电话号码

 9   String incomingNumber=intent.getStringExtra("incoming_number"); 10    //假如来电号码时12345678.则挂断电话

11    if("12345678".equals(incomingNumber)){ 12    Calss<TelephonyManager> telephonyManagerClass=TelephonyManager.class; 13    //通过Java反射技术获得getITelephony方法对应的Method对象

14  Method telephonyMethod=telephonyManagerClass.getDelaredMethod("getITelephony",(Class[]) null); 15    //允许访问getITelephony方法

16    telephonyMethod.setAccessible(true); 17    //调用getITelephony方法获取ITelephony对象

18    Object obj=telephonyMethod.invoke(telephonyManager.(Object[]) null); 19    //获取endCall方法对应Method对象

20    Method endCallMethod=obj.getClass().getMethod("endCall",null); 21   //允许访问endCall方法

22   endCallMethod.setAccessible(true); 23   //调用endCall方法挂断电话

24    endCallMethod.invoke(obj,null); 25 

26  } 27    break; 28    case TelephonyManager.CALL_STATE_OFFHOOK://接听电话

29   Log.d("call_state","offhook"); 30   break; 31   case TelephonyManager.CALL_STATE_IDLE://挂断电话

32  closeToast(); 33   break; 34  } 35  }

2.最后需要在清单文件中定义广播接收器,并添加可接收来电广播的权限
配置inCallReceiver

1 <receiver android:name=".InCassReceiver"

2 android:enable="treu">

3  <intent-=filter>

4  <action android:name="android.intent.action.PHONE_STATE"/>

5  <intent-filter>

6  </recevier>

 

你可能感兴趣的:(电信)