对于想要拦截一些莫名的陌生号码,就需要电话拦截功能与删除其电话记录功能。拦截的主要业务逻辑,分别是在一个服务里面进行: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. [ HOJ 2713]Matrix1[网络流] 最大点权独立集问题

    题目大意: 一个 N*M 的网格,每个单元都有一块价值 Cij 的宝石.问最多能取多少价值的宝石且任意两块宝石不相邻.(1 <= N, M <= 50, 0 <= Cij <= ...

  2. Python3 中 random模块

    Python中的random模块用于生成随机数. 下面具体介绍random模块的功能: 1.random.random() #用于生成一个0到1的 随机浮点数:0<= n < 1.0 im ...

  3. PHP 扩展开发检测清单(扩展开发必读)

    想要做出一个成功的 PHP 扩展包,不仅仅是简单的将代码放进文件夹中就可以了,除此之外,还有非常多的因素来决定你的扩展是否优秀.以下清单的内容将有助于完善你的扩展,并且在 PHP 社区中得到更多的重视 ...

  4. [ Java学习基础 ] Java的继承与多态

    看到自己写的东西(4.22的随笔[ Java学习基础 ] Java构造函数)第一次达到阅读100+的成就还是挺欣慰的,感谢大家的支持!希望以后能继续和大家共同学习,共同努力,一起进步!共勉! ---- ...

  5. 从零开始搭建口袋妖怪管理系统(2)-借助ngRoute实现详情页面跳转

    一.目标 上一次我们用Angular1.x完成了简单的口袋妖怪展示列表页面,现在我们想要了解口袋妖怪更多的信息,但是发现原有单行表格可能容纳不下口袋妖怪的所有信息,所以现在我们需要一个口袋妖怪详情界面 ...

  6. Spring boot结合Maven实现不同环境的配置

    配置文件层次: pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http ...

  7. 安装插件出现eclipse An internal error occurred during: "Installing Software". xxxxxxxxx

    就是你自己本来就有那个插件了 百度怎么删吧.... 看一下我这个文章 强烈建议本地安装的时候用第四种安装 http://www.cnblogs.com/ydymz/articles/7203260.h ...

  8. String String Buffer String Builder

    如题,在java中这是一个典型的问题. 在stackoverflow上已经有很多相似的问题被提问,并且有很多不正确或不完整的答案.如果你不往深处想,这是一个很简单的问题.但如果深入思考,它却很让人迷惑 ...

  9. Linux的哲学思想

    1.一切皆文件:2.单一目的的小程序:3.组合小程序完成复杂任务:4.文本文件保存配置信息:5.尽量避免捕获用户接口:6.提供机制,而非策略. 说到底Linux的哲学思想在于方便和更好的管理后台,不同 ...

  10. nginx的yum安装,基本参数使用,编译参数说明和Nginx基本配置,模块安装

    nginx的yum安装从nginx官网获取源 vim /etc/yum.repose.d/nginx.repo[nginx]name=nginx repobaseurl=http://nginx.or ...