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. Jmeter之聚合报告

    1.添加线程组,添加请求接口 2.设置线程组 3.线程组右击添加—>监听器—>聚合报告

  2. 基于Tcp协议的上传下载

    目录格式: 构建此目录就可随意使用! client端 import socket import sys import os import json import struct sk = socket. ...

  3. AtCoder Grand Contest 012 A

    A - AtCoder Group Contest Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statem ...

  4. 洛谷 P2759 奇怪的函数

    https://www.luogu.org/problemnew/show/P2759 #include<cstdio> #include<algorithm> #includ ...

  5. 18.3.2从Class上获取信息(内部类接口等)

    内部类 接口.枚举.注释类型

  6. innobackupex的使用

    优点: 不暂停服务器创建Innodb热备份 为mysql做增量的备份 在mysql服务器之间做在线表迁移 使创建mysql replication更加容易 备份mysql但不增加服务器的负载 安装:x ...

  7. LinQ的高级查询

    模糊查询: //数据库 + 自定义名称 =new 数据库 //例子: mydbDataContext con = new mydbDataContext(); //模糊查询表达式中用.Contains ...

  8. ios学习笔记 UITableView(纯代码) (一)

    参考 “https://www.cnblogs.com/ai-developers/p/4557487.html” UITableViewCell 有一个代码重用 减少资源的浪费 参考  https: ...

  9. logging模块进阶2

    1.两种级别设置: 全局级别:生成logger对象后设置的级别 局部级别:生成handler对象设置的级别 我们都知道输出的级别不能低于设定的级别,那么全局级别和局部级别哪一个对输出产生影响? 经过多 ...

  10. 洛谷P2774 方格取数问题(最小割)

    题意 $n \times m$的矩阵,不能取相邻的元素,问最大能取多少 Sol 首先补集转化一下:最大权值 = sum - 使图不连通的最小权值 进行黑白染色 从S向黑点连权值为点权的边 从白点向T连 ...