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

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、付费专栏及课程。

余额充值