对于想要拦截一些莫名的陌生号码,就需要电话拦截功能与删除其电话记录功能。拦截的主要业务逻辑,分别是在一个服务里面进行:1、注册电话监听;2、取消注册电话监听(当然注册于取消是在服务里面建立一个广播接收者)。删除电话日志的功能,是靠内容观察者和内容提供者。

下面给出实现电话监听,取消注册监听,内容观察者监听电话数据库状态的主要代码。对于以后开发此类产品,不需要去查看系统源码,复制粘贴这段代码就行了。下面给出代码:

一、注册电话监听与内容观察者监控电话数据库状态:

因为是在服务里面,因此,注册写在onCreate方法里面

	<span style="font-size:12px;">@Override
public void onCreate() { // 注册电话监听
// 通过电话管理类TelephoneManager
tm = (TelephoneManager</span><span style="font-size:12px;">) getSystemService(TELEPHONY_SERVICE); // 监听电话的状态
listener = new PhoneStateListener() { /*
* (non-Javadoc) 该方法用来监听电话的状态
*
* @see android.telephony.PhoneStateListener#onCallStateChanged(int,
* java.lang.String)
*/
@Override
public void onCallStateChanged(int state, final String incomingNumber) {
// TODO Auto-generated method stub
// state 电话的状态 incomingNumber 打进来的号码
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:// 挂断的状态,空闲的状态
System.out.println("CALL_STATE_IDLE");
break;
case TelephonyManager.CALL_STATE_RINGING://响铃状态
System.out.println("CALL_STATE_RINGING");
//判断是否是黑名单号码
//获取电话的模式
int mode = dao.getMode(incomingNumber); //如果是拦截号码
if ((mode & BlackTable.TEL) != 0) {
//电话拦截
System.out.println("挂断电话");
//挂断电话之前先注册内容观察者,新生成的日志之后(数据库发生改变)
getContentResolver().registerContentObserver(Uri.parse("content://call_log/calls"), true,
new ContentObserver(new Handler()) { @Override
public void onChange(boolean selfChange) {
//电话日志变化 触发此方法调用
deleteCalllog(incomingNumber);//删除电话日志 super.onChange(selfChange);
} });
endCall(); }
break;
case TelephonyManager.CALL_STATE_OFFHOOK:// 通话的状态
System.out.println("CALL_STATE_OFFHOOK");
break; default:
break;
}
super.onCallStateChanged(state, incomingNumber);
} }; // 注册电话的监听
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
} /**
* 删除电话日志
* @param incomingNumber
* 要删除日志的号码
*/
protected void deleteCalllog(String incomingNumber) {
//只能内容提供者来删除电话日志
Uri uri = Uri.parse("content://call_log/calls");
//删除指定号码(黑名单号码)日志
getContentResolver().delete(uri, "number=?", new String[]{incomingNumber}); } /**
* 挂断电话:反射+AIDL
*/
protected void endCall() {
//tm.endCall(); 1.5版本后,把该方法阉割掉了
//想用该功能,实现方法
//ServiceManager.getService();
//反射调用
//1.class
try {
Class clazz = Class.forName("android.os.ServiceManager");
//2. method
Method method = clazz.getDeclaredMethod("getService", String.class); //3.obj 不需要 因为是静态方法
//4. 调用
IBinder binder = (IBinder) method.invoke(null, Context.TELEPHONY_SERVICE); //5.aidl
ITelephony iTelephony = ITelephony.Stub.asInterface(binder);
iTelephony.endCall();//挂断电话
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }</span>

因为用到AIDL因此,要把在相应应用中加入两个文件:截图:

若用到了相应的功能,直接复制核心代码就行了

Android初级教程反射+AIDL+内容观察者监控黑名单号码代码模板的更多相关文章

  1. Android初级教程理论知识(第四章内容提供器)

    之前第三章理论知识写到过数据库.数据库是在程序内部自己访问自己.而内容提供器是访问别的程序数据的,即跨程序共享数据.对访问的数据也无非就是CRUD. 内容提供者 应用的数据库是不允许其他应用访问的 内 ...

  2. Android初级教程理论知识(第三章测试&数据存储&界面展现)

    首先介绍单元测试,我在javaweb部分有详细介绍单元测试框架的一篇文章. 可以先看在javaweb中的单元测试详解篇http://blog.csdn.net/qq_32059827/article/ ...

  3. Android初级教程IP拨号器初识广播接受者

    需求:输入ip号码并且保存在本地,监听打电话广播,如果电话号码以0开头,则加上ip区号拨打. 首先定义一个页面布局: <LinearLayout xmlns:android="http ...

  4. Android初级教程进程间的通信AIDL

    在介绍跨程序进程间通信AIDL前,先看一下本程序activity与某个服务是怎么绑定在一起进行交互的. 需求:服务有两个方法.分别是播放音乐与停止播放音乐.该程序的活动要访问这两个方法,在activi ...

  5. Android初级教程之内容提供者获取联系人信息

    内容提供折详细理论知识请参考之前的博文:http://blog.csdn.net/qq_32059827/article/details/51646513 这里新建了三个联系人信息,通过查看系统联系人 ...

  6. Android初级教程初谈自定义view自定义属性

    有些时候,自己要在布局文件中重复书写大量的代码来定义一个布局.这是最基本的使用,当然要掌握:但是有些场景都去对应的布局里面写对应的属性,就显得很无力.会发现,系统自带的控件无法满足我们的要求,这个时候 ...

  7. Android初级教程理论知识(第一章快速入门)

    一.综合介绍. Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包, ...

  8. Android初级教程:RatingBar的使用

    记得淘宝里面买家给卖家评分的时候会有一个星星状的评分条,其实就是基于RatingBar做了自定义使用了.那么本篇文章就对RatingBar的使用做一个基本的认识. 接下来就是正题,那就是对于Ratin ...

  9. Android初级教程:ViewPage使用详解

    转载本博客,请注明出处:http://blog.csdn.net/qq_32059827点击打开链接 ViewPage使用之一就是轮播广告,就以此为出发点,来详细解析一下ViewPage的使用和加载机 ...

随机推荐

  1. hihocoder #1159 : 扑克牌

    描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数. 牌的表示方法为XY,其中 ...

  2. 例10-9 uva1636简单概率问题

    题意:一个01串,0代表没子弹,1代表有子弹.在开一次空枪后,开下一枪没子弹概率大的方案 ①接着开枪    ②随机转一下再开枪 思路: 在情况一就是求00在0中占的比例,情况二则是0在整个串中的比例 ...

  3. 使用jquery.qrcode.js生成二维码

    通常生成二维码的方式有两种:第一种是java代码的形式,第二种是通过Js方式. 在这里我做个记录,用js生成二维码,可以在官网下载源码:http://jeromeetienne.github.io/j ...

  4. MongoDb进阶实践之六 MongoDB查询命令详述(补充)

    一.引言         上一篇文章我们已经介绍了MongoDB数据库的查询操作,但是并没有介绍全,随着自己的学习的深入,对查询又有了新的东西,决定补充进来.如果大家想看上一篇有关MongoDB查询的 ...

  5. Python开发——利用正则表达式实现计算器算法

    Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...

  6. 查询优化--小表驱动大表(In,Exists区别)

    Mysql 系列文章主页 =============== 本文将以真实例子来讲解小表驱动大表(In,Exists区别) 1 准备数据 1.1 创建表.函数.存储过程 参照  这篇(调用函数和存储过程批 ...

  7. Mysql锁机制--间隙锁的危害

    Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS employee; CREATE TABLE IF NOT EXISTS ...

  8. javascript装饰器模式

    装饰器模式 什么是装饰器 原名decorator 被翻译为装饰器 可以理解为装饰 修饰 包装等意 现实中的作用 一间房子通过装饰可以变得更华丽,功能更多 类似一部手机可以单独使用 但是很多人都愿意家个 ...

  9. Docker安装tomcat和部署项目

    随着微服务的流行,Docker越来越流行,正如它的理念"Build, Ship, and Run Any App, Anywhere"一样,Docker提供的容器隔离技术使得开发人 ...

  10. Ubuntu搭建owncloud10

    前言: 在此我先吐槽一下.用Centos系统简直是为难我自己,是看到那个系统 感到无比的绝望. 正文: 自己在虚拟机中搭建Ubuntu系统.这里就不说了 安装好之后自己换源.建议的源: 清华源: # ...