Android初级教程反射+AIDL+内容观察者监控黑名单号码代码模板
对于想要拦截一些莫名的陌生号码,就需要电话拦截功能与删除其电话记录功能。拦截的主要业务逻辑,分别是在一个服务里面进行: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+内容观察者监控黑名单号码代码模板的更多相关文章
- Android初级教程理论知识(第四章内容提供器)
之前第三章理论知识写到过数据库.数据库是在程序内部自己访问自己.而内容提供器是访问别的程序数据的,即跨程序共享数据.对访问的数据也无非就是CRUD. 内容提供者 应用的数据库是不允许其他应用访问的 内 ...
- Android初级教程理论知识(第三章测试&数据存储&界面展现)
首先介绍单元测试,我在javaweb部分有详细介绍单元测试框架的一篇文章. 可以先看在javaweb中的单元测试详解篇http://blog.csdn.net/qq_32059827/article/ ...
- Android初级教程IP拨号器初识广播接受者
需求:输入ip号码并且保存在本地,监听打电话广播,如果电话号码以0开头,则加上ip区号拨打. 首先定义一个页面布局: <LinearLayout xmlns:android="http ...
- Android初级教程进程间的通信AIDL
在介绍跨程序进程间通信AIDL前,先看一下本程序activity与某个服务是怎么绑定在一起进行交互的. 需求:服务有两个方法.分别是播放音乐与停止播放音乐.该程序的活动要访问这两个方法,在activi ...
- Android初级教程之内容提供者获取联系人信息
内容提供折详细理论知识请参考之前的博文:http://blog.csdn.net/qq_32059827/article/details/51646513 这里新建了三个联系人信息,通过查看系统联系人 ...
- Android初级教程初谈自定义view自定义属性
有些时候,自己要在布局文件中重复书写大量的代码来定义一个布局.这是最基本的使用,当然要掌握:但是有些场景都去对应的布局里面写对应的属性,就显得很无力.会发现,系统自带的控件无法满足我们的要求,这个时候 ...
- Android初级教程理论知识(第一章快速入门)
一.综合介绍. Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包, ...
- Android初级教程:RatingBar的使用
记得淘宝里面买家给卖家评分的时候会有一个星星状的评分条,其实就是基于RatingBar做了自定义使用了.那么本篇文章就对RatingBar的使用做一个基本的认识. 接下来就是正题,那就是对于Ratin ...
- Android初级教程:ViewPage使用详解
转载本博客,请注明出处:http://blog.csdn.net/qq_32059827点击打开链接 ViewPage使用之一就是轮播广告,就以此为出发点,来详细解析一下ViewPage的使用和加载机 ...
随机推荐
- 计蒜客NOIP2017提高组模拟赛(五)day1-机智的 AmyZhi
传送门 很水的题目啦QAQ #include<cstdio> #include<cstdlib> #include<algorithm> #include<c ...
- Codeforces Round #408 (Div. 2)
C. Bank Hacking 题目大意:给出一棵n个节点的树,每个节点有一个权值,删掉一个点的代价为当前这个点的权值,并且会使其相邻点和距离为2且中间隔着未被删除的点的点权值加1,现在选一个点开始删 ...
- [bzoj4874]筐子放球
来自FallDream的博客,未经允许,请勿转载,谢谢. 小N最近在研究NP完全问题,小O看小N研究得热火朝天,便给他出了一道这样的题目: 有 n 个球,用整数 1 到 n 编号.还有 m 个筐子,用 ...
- Python【第二课】 字符串,列表,字典,集合,文件操作
本篇内容 字符串操作 列表,元组操作 字典操作 集合操作 文件操作 其他 1.字符串操作 1.1 字符串定义 特性:不可修改 字符串是 Python 中最常用的数据类型.我们可以使用引号('或&quo ...
- 关于导入excel问题
关于导入excel问题: 在VS中可以导入,部署在IIS上无法导入的原因: 1.可能部署IIS上发布的文件设置为只读,没有写入权限.解决方法为:设置程序发布的文件夹,添加写入权限,以及asp.net ...
- Hinton's paper Dynamic Routing Between Capsules 的 Tensorflow , Keras ,Pytorch实现
Tensorflow 实现 A Tensorflow implementation of CapsNet(Capsules Net) in Hinton's paper Dynamic Routing ...
- Android.mk 详解
Android中增加本地程序或者库,这些程序与其所在路径没有关系,只和它们的Android.mk有关系. Android.mk与普通的makefile略有不同,Android.mk具有统一的写法,主要 ...
- 关于 "java中常量定义在interface中好还是定义在class中好" 的一些思考
原文链接 http://blog.csdn.net/voo00oov/article/details/50433672 java中interface中定义变量都是"public static ...
- Mysql优化--慢查询日志
Mysql 系列文章主页 =============== 默认没有开启慢查询日志功能.如果不是调优需要的话,一般不建议开启. 查看是否开启慢查询日志: SHOW VARIABLES LIKE '%sl ...
- VGG网路结构
VGG网络的基本结构 如图所示,从A到E网络的深度是逐渐增加的,在A中有11个权重层(8个卷积层,3个全连接层),在E中有19个权重层(16个卷积层,3个全连接层),卷积层的宽度是十分小的,开始时在第 ...