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 });
            }
      
      
}

























5.4 来电黑名单拦截 ,删除呼叫记录相关推荐

  1. 5.5 短信黑名单拦截

    1.在黑名单服务中, 动态代码创建短信广播接受者, 在服务开启时注册短信拦截广播意图过滤器, 在服务销毁时取消广播事件 2. 在广播接受者内部类中,判断来电号码是否在黑名单短信拦截和全部拦截模式中, ...

  2. 黑名单挂断电话及删除电话记录

    黑名单挂断电话及删除电话记录 挂断电话 挂断电话需要申请权限android.permission.CALL_PHONE 对于黑名单号码的来电如何挂断,由于监听来电时在TelephonyManager中 ...

  3. SQL操作语句之查询及删除重复记录的方法

    delete from 表 where id not in(select min(id) from 表 group by name ) //删除重复名字的记录 删除之前请用语句 select * fr ...

  4. SQL Server 删除重复记录,只保留一条记录

    原文地址:http://blog.csdn.net/eriato/article/details/17417303 有张表格之前没有设计关键字段的唯一约束,导致有时候执行插入操作时不小心执行了多次就出 ...

  5. jQuery如何动态删除TR,input按钮删除本行记录,checkbox全选反选

    checkbox 全选反选 1: var i = 1; 2: function CheckAllTeacher() { 3: if (i % 2 == 1) { 4: i++; 5: $(" ...

  6. [20190130]删除tab$记录的恢复2.txt

    [20190130]删除tab$记录的恢复2.txt --//前面链接写好了脚本,开始测试删除后的恢复.千万不要在生产系统做这样的测试!! --//参考链接:http://blog.itpub.net ...

  7. 【01】网页中清除历史浏览记录能不能彻底删除浏览记录?

    不能-- 即便你把记录全删了,也可用数据恢复工具给你找回来: 即便你用专业工具覆盖N遍,确保数据无法恢复,网站那头还记着哪个ip什么时候访问过哪些内容呢--然后跑ISP(联通或电信)一查,xx时间xx ...

  8. mysql删除重复文章标题_MySQL中查询、删除重复记录的方法大全

    前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: 一.查找重复记录 1.查找全部重复记录 2.过滤重复记录( ...

  9. mysql删除重复记录

    如果要删除的记录不多的话,可以把这个表创建成内存表形式: CREATE TABLE `tmp_wenku` ( `wk_id` int(8), `wk_title` varchar(200) ) EN ...

最新文章

  1. KVM中四种网络模型(三)
  2. oracle12c不能进入到http://localhost:1158/em的解决办法
  3. python关于七巧板的代码_Css打造一个简单的静态七巧板
  4. 「Ubuntu」仓库 “https://mirrors.tuna.tsinghua.edu.cn/ubuntu focal Release” 没有 Release 文件。
  5. 一个高效、快速、稳定的PHP日志扩展。
  6. library的英语怎么读音_library怎么读声音
  7. java包管理之gradle安装
  8. kippo mysql_Kippo:一款优秀的SSH蜜罐开源软件.pdf
  9. PgSQL · 应用案例 · 逻辑订阅给业务架构带来了什么?
  10. 20145201 20145227 《信息安全系统设计基础》实验二 固件开发
  11. 《产品设计与开发(原书第5版)》——3.2 机会识别的评比结构
  12. nodejs redis 发布订阅_「赵强老师」Redis的消息发布与订阅
  13. 简单常用的互联网赚钱工具分享
  14. 如何阅读看懂datasheet
  15. 文件系统(一)---文件系统基础知识
  16. 无线监控安ftp服务器,ftp服务器摄像头监控
  17. ps2模拟器linux,PS2模拟器PCSX
  18. 教你如何定位不合理的SQL?并优化之
  19. 如何构建自我的认知系统
  20. 小程序--语音合成tts 对接多平台(讯飞,思必驰,百度)

热门文章

  1. 何为程序员的理想生活方式
  2. 服务器电源输出电压不稳定,开关电源输出电压不稳定怎么解决?
  3. 蚊帐上有两个破洞怎么办
  4. oracle 12c (内存列存储)IM column store
  5. git 更新本地代码
  6. 一个repeater
  7. lorawan的工作原理_lora技术原理简介 LoRaWAN协议是什么
  8. 圣诞节会呼吸的玫瑰爱心代码 一起浪漫吧
  9. proto: file “EntryProtocol.proto“ has a name conflict over 解决方案
  10. uni-app H5页面打开地图组件 [system] Map key not configured