如何拦截来电,并检测到某些特定号码时自动挂断电话?
使用反射的技术访问android SDK的内部功能来挂断电话
1.拦截来电的广播接收器类(InCallReceiver)的onReceive()方法android
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.最后须要在清单文件中定义广播接收器,并添加可接收来电广播的权限
配置inCallReceiverspa
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>