1.短信拦截

首先需要声明的是,Android4.4版本以上,如果想做到短信拦截,必须成为default sms,把所有短信相关的功能都包揽了,然后再做短信拦截。但这种做法,适配性和兼容性的工作是非常巨大的,短信、wapush(多种)、彩信、单双卡等等,相当于要求短信拦截类的软件要集成一个功能非常完善的通讯录类应用的功能。但是即使拦截不到短信,同样是可以接收到短信的内容。4.4版本以前没有问题。

短信广播接收者就不用多说了,代码如下所示,业务逻辑一般通过数据库查询实现,通过继承SQLiteOpenHelper类构建数据库,再自定义一个提供数据库增删改查的Dao类即可。

private class InnerSmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Object[] objs = (Object[]) intent.getExtras().get("pdus");
for (Object obj : objs) {
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);
String sender = smsMessage.getOriginatingAddress();
Log.i("InnerSmsReceiver","收到了来自这个人的短信:"+sender);
//通过业务逻辑判断是否拦截sender By abortBroadcast();
}
}
}

2.电话拦截/接听

2.1 拦截电话,首先需要监听电话的状态。这个我们最好还是写在服务里吧。

public class InterceptService extends Service{
private TelephonyManager tm;
private MyListener listener;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
//实例化电话监听器
listener = new MyListener();
tm =(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
} @Override
public void onDestroy() {
tm.listen(listener,PhoneStateListener.LISTEN_NONE);//什么也不监听
super.onDestroy();
} private class MyListener extends PhoneStateListener{
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING: //零响状态
Log.i("InnerSmsReceiver",incomingNumber);
endCall(); //根据业务逻辑判断后调用挂断电话的逻辑
break;
}
}
}
}

2.1 拦截电话的逻辑可以仿照源码写。首先拿到Binder对象。

IBinder ibinder = ServiceManager.getService(TELEPHONY_SERVICE); 

2.2 由于ServiceManager被系统隐藏了,所以可以用反射的方法拿到。

Class clazz = InterceptService.class.getClassLoader().loadClass("android.os.ServiceManager");
Method method = clazz.getDeclaredMethod("getService", String.class);
IBinder ibinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);

2.3 接着就可以调用Binder里的方法了。不仅可以拿到endCall()挂断电话的方法,也可以拿到answerRingCall()接听电话的方法。这样就完成了整个挂断电话的逻辑。

ITelephony.Stub.asInterface(ibinder).endCall();
//用于接听电话 ITelephony.Stub.asInterface(ibinder).answerRingingCall();

Android开发——短信电话拦截/接听电话的更多相关文章

  1. Android获取短信验证码

    Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安全性,开始使用通过服务器向用户发送验证码的方式,来保护用户个人信息的安全性.无论是用户注册时的信息验证还是当用户发 ...

  2. Android之——短信的备份与还原

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47091281 眼下,Android手机中的一些软件能够实现手机短信的备份与还原操作 ...

  3. Android接收短信

    Android收到短信时会广播android.provider.Telephony.SMS_RECEIVED消息,因此只要定义一个Receiver,收听该消息,就能接收短信. <receiver ...

  4. android 发送短信 怎样做到一条一条的发送,仅仅有在上一条发送成功之后才发送下一条短信

    android发送短信截获上一条发送是否成功,然后再来发送下一条短信 1.问题:在项目中遇到例如以下要求:待发短信有N条,实现一条一条的发送并在上一条短信发送成功之后再来发送下一条. for(int ...

  5. android 发送短信的两种方式,以及接收报告和发送报告

               android发送短信,以及接收报告和发送报告          android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下:    一.调起系统发短信功能    ...

  6. android 获取短信验证码倒计时

    android 获取短信验证码倒计时 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWVuZ2xlbGUxMzE0/font/5a6L5L2T/fonts ...

  7. 用Tasker实现收到Android手机短信自动转发到邮箱

    发送短信到邮箱的原理与 <用Tasker实现收到Android手机短信自动转发到邮箱>有些类似.  发送短信到邮箱是利用Ifttt这个服务将短信转发到邮箱中.Ifttt服务的可扩展性很强, ...

  8. Android学习笔记_19_广播接收者 BroadcastReceiver及其应用_窃听短信_拦截外拨电话

    一.广播接收者类型: 广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”. 普通广播是完全异步的,可以在同一时刻(逻辑上 ...

  9. android之短信拦截器

    下面通过短信拦截器来介绍短信中的广播 布局文件 在布局文件中可以设置需要拦截的号码 <?xml version="1.0" encoding="utf-8" ...

随机推荐

  1. 第05课 Linux命令初探(一)

    该篇为第一部分,主要介绍的Linux指令有: mkdir.cd.ls.rm.touch.vi/vim.echo.cat.cp.mv.pwd.rm.rmdir 1.创建一个目录/data 提示:Wind ...

  2. h5-18-文件上传

    参考博客地址:https://developer.mozilla.org/zh-CN/docs/Web/API/FormData/Using_FormData_Objects 参考博客地址:http: ...

  3. MyEclipse常用快捷键及快捷键大全

    MyEclipse常用快捷键:alt+/     代码提示ctrl+shift+F   代码排版ctrl + /     注释当前行 ctrl+D      删除当前行 Alt+C       拷贝当 ...

  4. Eclipse安装jad反编译插件(在线安装)

    Help→Eclipse Marketplace→Find→jad 然后等安装完成重启eclipse即可

  5. oracle中的用户详解 【转】

      oracle中的用户很多,也很令初学者费解.oracle中的帐户分为两类:一类是必需的帐户,一类是存储各种应用的帐户 用户名 密码 描述 ANONYMOUS ANONYMOUS 访问http的匿名 ...

  6. Unity中所有特殊的文件夹

    1. 隐藏文件夹以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中.2. Standard Assets在这个文件夹中的脚本最先被编译 ...

  7. 模板方法模式及php实现

    模板方法模式: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 角色: 抽象模板角色:抽象模板类, ...

  8. Load average in Linux的精确含义

    Man 上的解释: load average System load averages is the average number of processes that are either in a ...

  9. webapi之fiddler头设置

    Host: localhost:16648Connection: keep-aliveContent-Length: 36Accept: application/json, text/javascri ...

  10. innerHTML与IE浏览器内存泄露问题

    使用 sIEve 扫描和筛选 如果大量使用 JavaScript 和 Ajax 技术开发 Web 2.0 应用程序,您很有可能会遇到浏览器的内存泄漏问题.如果您有一个单页应用程序或者一个页面要处理很多 ...