5.4 来电黑名单拦截 ,删除呼叫记录

本服务通过监听电话状态,当来电号码在黑名单数据库中且模式为'1'或'3'时,将挂断来电电话并删除相关呼叫记录。实现过程中包括了对电话管理者的操作、监听事件的配置、黑名单查询以及对系统隐藏API的调用。

1. 创建黑名单服务

2.在服务中创建TelephoneyManager,并给电话管理者设置来电监听事件

3.在实现监听事件未实现的方法中,switch电话管理者的状态 ,在电话处于来电状态时判断来电号码是否存在黑名单中

4.如果来电号码在黑名单数据库中,查找出号码对应的mode

5.如果mode的值是"1"||"3" , 挂掉来电电话,删除呼叫记录


 


 

-----------------------------------------------------------------------------------


 

挂掉来电电话:

 

  <!--黑名单拦截权限  -->
    <uses-permission android:name ="android.permission.CALL_PHONE" />


      /**
       * 挂断电话的方法: 利用发射技术找到系统隐藏的挂断电话的API
       */
      public void endCall(){
            
             try {
                   Class clazz = getClassLoader().loadClass("android.os.ServiceManager" );
                  Method method = clazz.getDeclaredMethod("getService",new Class[] { String. class });
                  IBinder b = (IBinder) method.invoke( null, new Object[] { TELEPHONY_SERVICE });
                  
                   //调用导入系统文件 aidl中的方法
                  ITelephony iTelephony = ITelephony.Stub.asInterface(b);
                  iTelephony.endCall();

            } catch (Exception e) {
                  e.printStackTrace();
            }
            
            
            
      }



-----------------------------------------------------------------------------
删除呼叫记录: 查询系统联系人数据库,在calls表中删除来电号码对应的数据

 

 <!--删除呼叫记录的权限  -->
     <uses-permission android:name ="android.permission.READ_CONTACTS"/>
     <uses-permission android:name ="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name ="android.permission.READ_CALL_LOG" />
    <uses-permission android:name ="android.permission.WRITE_CALL_LOG" />



          /**
           * 删除呼叫记录
           * @param incomingNumber
           */
             public void deleteCallLog(String incomingNumber) {
                  ContentResolver resoler = getContentResolver();
                  resoler.delete(Uri. parse("content://call_log/calls"), "number=?",new String[] { incomingNumber });
            }


--------------------------------------------------------------------------------------------



ublic class CallSmsSafeService extends Service {

      private static final String TAG = "CallSmsSafeService";
      private TelephonyManager  tm;
      private BlackNumberDao dao;
      private myListener  listener;
      
      @Override
      public IBinder onBind(Intent intent) {
            
             return null;
      }
      
      /**
       * 服务创建时
       */
      @Override
      public void onCreate() {
            Log. i(TAG, "意图创建时" );
            
             dao= new BlackNumberDao( this);
            
             //1.创建电话管理者
             tm=(TelephonyManager) getSystemService( TELEPHONY_SERVICE);
            
             listener= new myListener();
             //2.给电话管理者设置来电监听事件
             tm.listen( listener, PhoneStateListener. LISTEN_CALL_STATE);   //开启监听
            
            
             super.onCreate();
      }
      
      /**
       * 服务销毁时
       */
      @Override
      public void onDestroy() {
            Log. i(TAG, "意图销毁时" );
             tm.listen( listener, PhoneStateListener. LISTEN_NONE);   //关闭监听
             listener= null;
             super.onDestroy();
      }
      
      
      /**
       * 创建来电监听器
       * @author Administrator
       *
       */
      private class  myListener extends PhoneStateListener{
            
             private static final String TAG = "myListener";

             //当来电状态发生改变时
             @Override
             public void onCallStateChanged( int state, String incomingNumber) {
                   super.onCallStateChanged(state, incomingNumber);
                  
                   switch (state) {
                   case TelephonyManager. CALL_STATE_RINGING //来电时
                         //查询来电号码是否在黑名单数据库中
                        String mode= dao.findMode(incomingNumber);
                         if(mode.equals( "1")||mode.equals( "3")){
                              Log. i(TAG, "拦截黑名单电话" );
                              endCall(); //调用拦截电话的方法
                              
                               /*Log.i(TAG, "删除呼叫记录");
                              deleteCallLog(incomingNumber);  //删除呼叫记录*/
                              
                              
                               // 挂断电话 呼叫记录不是立刻产生出来的.
                               // deleteCallLog(incomingNumber);
                               // 在呼叫记录产生之后, 才能去移除呼叫记录.

                               // 注册一个内容观察者 观察呼叫记录的变化.
                              getContentResolver().registerContentObserver(
                                          Uri. parse("content://call_log/calls"), true,
                                           new MyObserver( new Handler(), incomingNumber));

                          }
                              
                              
                        
                        
                         break;
                        
                case TelephonyManager. CALL_STATE_IDLE:    //空闲时候 
                        
                         break;      

                  
                  }
                  
            }

            
}
      
      /**
       * 挂断电话的方法: 利用发射技术找到系统隐藏的挂断电话的API
       */
      public void endCall(){
            
             try {
                   Class clazz = getClassLoader().loadClass("android.os.ServiceManager" );
                  Method method = clazz.getDeclaredMethod("getService",new Class[] { String. class });
                  IBinder b = (IBinder) method.invoke( null, new Object[] { TELEPHONY_SERVICE });
                  
                   //调用导入系统文件 aidl中的方法
                  ITelephony iTelephony = ITelephony.Stub.asInterface(b);
                  iTelephony.endCall();

            } catch (Exception e) {
                  e.printStackTrace();
            }
            
            
            
      }
      
      
      /**
       * 创建内容观察者
       */
      
      public class MyObserver  extends ContentObserver{

             private String incomingNumber;   //来电号码
            
             public MyObserver(Handler handler,String incomingNumber) {
                   super(handler);
                  
                   this. incomingNumber = incomingNumber;
            
            }
            
             //当数据发生变化的时候
             @Override
             public void onChange( boolean selfChange) {
                   super.onChange(selfChange);
                  getContentResolver().unregisterContentObserver( this);
                  Log. i(TAG,"观察到数据库内容变化.删除呼叫记录" );
                  deleteCallLog( incomingNumber);
                  
            }
            
            
            
      }
      
      
      
          /**
           * 删除呼叫记录
           * @param incomingNumber
           */
             public void deleteCallLog(String incomingNumber) {
                  ContentResolver resoler = getContentResolver();
                  resoler.delete(Uri. parse("content://call_log/calls"), "number=?",new String[] { incomingNumber });
            }
      
      

}


























 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值