实现思路

1.MyDBhelper 创建数据库和3张表格

public class MyDBhelper extends SQLiteOpenHelper{public MyDBhelper(Context context) {super(context, "phone.db", null, 1);//固话构造方法,避免输入错误Log.i("TAG", "onCreate2");}@Overridepublic void onCreate(SQLiteDatabase db) {// 创建3张表//1黑名单电话表 backphone(id,number)Log.i("TAG", "onCreate");String sql = "create table if not exists backphone("+ "_id integer primary key autoincrement,"+ "number text not null"+ ")";db.execSQL(sql);//2黑名单的电话记录 phonelist(id,number,type,date) 会话,谁,打进打出,时间String sql2 = "create table if not exists phonelist("+ "_id integer primary key autoincrement,"+ "number text not null,"+ "type integer,"+ "date integer"+ ")";db.execSQL(sql2);//3黑名单的短信记录 smslist(id,number,body,date)String sql3 = "create table if not exists smslist("+ "id integer primary key autoincrement,"+ "number text not null,"+ "body text,"+ "date integer"+ ")";db.execSQL(sql3);Log.d("TAG", "MyDBhelper onCreate ok");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//表结构有变化时候>修改版本>启动此方法// TODO Auto-generated method stub}}

2.DBManager 判断是不是黑名单,存入黑名单表,存入黑名单通话记录表,存入短信记录表

public class DBManager {MyDBhelper helper = null;public DBManager(Context context){helper = new MyDBhelper(context);}//添加黑名单电话public void insertBlackNumber(String number){SQLiteDatabase sdb = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("number", number);sdb.insert("backphone", null, values);Log.i("TAG", "加入黑名单成功");}//判断是不是黑名单电话public boolean isBlackNunber(String number){SQLiteDatabase sdb = helper.getReadableDatabase();String selection = "number=?";Cursor cursor = sdb.query("backphone",null,selection, new String[]{number},null, null,null);if(cursor.moveToNext()){return true;}cursor.close();return false;}//打入的黑电话号码保存在列表中public void insertPhone(Phone phone){SQLiteDatabase sdb = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("number", phone.getNumber());values.put("type", phone.getType());values.put("date", phone.getDate());sdb.insert("phonelist", null, values); Log.d("TAG", "insertPhone ok");}//将黑名单发过来的短信保存在短信列表中public void insertSMS(SMS sms){SQLiteDatabase sdb = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("number", sms.getNumber());values.put("body", sms.getBody());values.put("date", sms.getDate());sdb.insert("smslist", null, values);}}

3.PhoneService 拦截短信,拦截打出黑名单电话

/*** 1.黑名单短信的拦截 2/3.黑名单打进(出)电话时候挂断电话* * @author tarena**/public class PhoneService extends Service {public final static String SMS_RECEIVI = "android.provider.Telephony.SMS_RECEIVED";public final static String OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL";DBManager dbmanager;@Overridepublic void onCreate() {super.onCreate();dbmanager = new DBManager(this);// 服务中注册广播接收器// 拦截短信,对黑名单处理registerPhoneReceiver();Log.e("TAG", "服务已经启动");}private void registerPhoneReceiver() {receiver = new PhoneReceiver();IntentFilter filter = new IntentFilter();//定义接收短信广播filter.addAction(SMS_RECEIVI);//订阅打出电话的有序广播filter.addAction(OUTGOING_CALL);filter.setPriority(1000);registerReceiver(receiver, filter);}PhoneReceiver receiver;public class PhoneReceiver extends BroadcastReceiver {// 收到短信内容会回调@Overridepublic void onReceive(Context context, Intent intent) {// 拆解短信1.拿到电话号码2.判断是否为黑名单String action = intent.getAction();if (SMS_RECEIVI.equals(action)) {//回掉原因是收到短信Bundle b = intent.getExtras();Log.i("TAG", "短信拦截广播");String number = SMSManager.getNumberFromSMS(b);// 判断是不是黑名单发过来的if (dbmanager.isBlackNunber(number)) {String body = SMSManager.getBodyFromSMS(b);Log.i("TAG", "黑名单短信发过来");// 拦截短信abortBroadcast();// 存入短信列表SMS sms = new SMS();sms.setBody(body);sms.setDate(System.currentTimeMillis());sms.setNumber(number);}}else if(OUTGOING_CALL.endsWith(action)){//回调原因是因为打出号码Log.i("TAG", "打出电话");String number = getResultData();//拿到的是一手数据(从广播中获取电话号码)//如果是黑名单则拦截黑名单if(dbmanager.isBlackNunber(number)){Log.i("TAG", "打出黑名单电话号码");//将电话置空setResultData(null);//记录信息Phone phone = new Phone();phone.setType(2);phone.setDate(System.currentTimeMillis());phone.setNumber(number);//存入电话信息表dbmanager.insertPhone(phone);}}}}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();if(receiver!=null){unregisterReceiver(receiver);Log.i("TAG", "unregisterReceiver");receiver=null;}}}

4.Phone SMS 封装实体类

public class Phone {private int _id;private String number;private int type;private long date;public Phone() {super();// TODO Auto-generated constructor stub}public Phone(int _id, String number, int type, long date) {super();this._id = _id;this.number = number;this.type = type;this.date = date;}public int get_id() {return _id;}public void set_id(int _id) {this._id = _id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public int getType() {return type;}public void setType(int type) {this.type = type;}public long getDate() {return date;}public void setDate(long date) {this.date = date;}@Overridepublic String toString() {return "Phone [_id=" + _id + ", number=" + number + ", type=" + type + ", date=" + date + "]";}
}
public class SMS {private int id;private String number;private String body;private long date;public SMS() {super();// TODO Auto-generated constructor stub}public SMS(int id, String number, String body, long date) {super();this.id = id;this.number = number;this.body = body;this.date = date;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getBody() {return body;}public void setBody(String body) {this.body = body;}public long getDate() {return date;}public void setDate(long date) {this.date = date;}@Overridepublic String toString() {return "SMS [id=" + id + ", number=" + number + ", body=" + body + ", date=" + date + "]";}
}

5.SMSManager 获取短信号码 ,获取短信内容

public class SMSManager {/** 根据拦击的短信来查询电话号码 */public static String getNumberFromSMS(Bundle b) {Object[] pdus = (Object[]) b.get("pdus");SmsMessage[] smses = new SmsMessage[pdus.length];smses[0] = SmsMessage.createFromPdu((byte[]) pdus[0]);String number = smses[0].getOriginatingAddress();return number;}/*** 获得短信内容* * @return*/public static String getBodyFromSMS(Bundle b) {//Android设备接收到的SMS是以pdu形式的(protocol description unit)。所以从intent提取数据时就会遇到pdusObject[] pdus = (Object[]) b.get("pdus");SmsMessage[] smses = new SmsMessage[pdus.length];//提取短信内容for (int i = 0; i < pdus.length; i++) {smses[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);}StringBuilder builder = new StringBuilder();//短信内容拼接(大于140字节)for (int i = 0; i < smses.length; i++) {builder.append(smses[i].getMessageBody());}return builder.toString();}}

6.mainActivity 获取拦截号码,启动和拦截服务

public class MainActivity extends Activity {private EditText etadd;private DBManager dbmanager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);etadd = (EditText) findViewById(R.id.etadd_blackphone);dbmanager = new DBManager(this);}public void add(View v){//添加黑名单String number = etadd.getText().toString();dbmanager.insertBlackNumber(number);Toast.makeText(this, "添加成功", 0).show();etadd.setText("");}public void start(View v){//开启监听Intent intent  = new Intent(this, PhoneService.class);startService(intent);}public void stop(View v){//停止监听Intent intent = new Intent(this, PhoneService.class);stopService(intent);}
}

添加拦截号码后启动服务拦截短信(abortBroadcast())和电话广播(setResultData(null)),实现拦截;

附加:清单配置文件和布局文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.backphone"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="17" /><!-- 接收短信的权限(短信拦截) --><uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 打电话权限 --><uses-permission android:name="android.permission.CALL_PHONE"/><!-- 订阅系统的打电话时发出的广播权限 --><uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.example.backphone.MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name="com.example.service.PhoneService"></service></application></manifest>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity" ><EditTextandroid:id="@+id/etadd_blackphone"android:inputType="phone"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入要加入黑名单的电话号码" /><Buttonandroid:id="@+id/btnadd_blackphone"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignLeft="@+id/etadd_blackphone"android:layout_below="@+id/etadd_blackphone"android:layout_marginTop="26dp"android:onClick="add"android:text="添加" /><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/btnadd_blackphone"android:layout_alignRight="@+id/btnadd_blackphone"android:layout_below="@+id/btnadd_blackphone"android:layout_marginTop="26dp"android:onClick="start"android:text="启动监听" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/button1"android:layout_alignRight="@+id/button1"android:layout_below="@+id/button1"android:layout_marginTop="26dp"android:onClick="stop"android:text="停止监听" /></RelativeLayout>

黑名单电话和短信拦截相关推荐

  1. Android电话和短信拦截器

    1. 引言 在Android中实现电话和短信拦截器功能,这个是我从网上找的,并非自己实现,使用时需要修改一下代码(需要拦截的号码),测试已经通过,工程結构和实现如下. 2. 工程结构 3. 功能实现 ...

  2. Android-实现对指定电话的短信拦截和来电拦截

    用service的onCreate/onDestroy来控制广播的监听(电话,sms). 先写一个这样的框架,具体功能不实现: /*** 用TelSmsBlackService来控制广播监听(电话,s ...

  3. Android 电话和短信拦截

    之前用的手机上没有黑名单功能,下载第三方的软件又觉得不安全,所以自己写了一个简单版本的凑合用,在这里记录一下. 因为之前有做过短信的拦截相关功能,但是电话拦截接触也不是很多,所以并没有做过详细的测试( ...

  4. Android 用代码实现防打扰【能够屏蔽电话和短信】

    Android 实现电话和短信拦截的功能如下: 1.实现广播接口,即[BroadcastReceiver] 检测到电话来时,则挂断电话,同时保存来电的电话号码,一做特殊处理[发信息或者一段时间后提示用 ...

  5. Android6.0 源码添加黑名单拦截电话和短信记录

    [目标] 在上一篇 Android6.0 源码增加黑名单功能 的基础上增加黑名单和短信拦截记录 [实现] 黑名单数据库和拦截记录数据库上一篇已经增加完成,这就需要我们在电话和短信分发的地方去判断号码是 ...

  6. android 短信接口收拦截,给手机装“来点黑名单” 拒绝垃圾短信和电话

    给手机装个"来电黑名单" 有了手机之后,不自觉就被卷入信息漩涡中间.面对排山倒海的垃圾短信和骚扰电话,我们如何能拒绝?或者是"礼貌地拒绝"?其实,对于类似QQ. ...

  7. android电话、短信黑白名单拦截、电话录音

    功能描述: 总的来说这是一个防骚扰的应用,设置黑名单,白名单,通话录音名单.添加到黑名单的联系人或号码将被拒绝来电或短信:添加到白名单的联系人或号码将通过来电或短信(除白名单以外的号码将被拒绝来电或短 ...

  8. android 黑名单 短信拦截

    上一篇讲了电话拦截,现在讲一下短信拦截. 由于android4.4以上,提高了系统的安全性,同时,也对短信的处理进行了保护 先来讲一下在android4.4以下的短信拦截机制 在android4.4一 ...

  9. php虚拟电话号码,虚拟号码能挡住骚扰电话垃圾短信?

    原标题:虚拟号码能挡住骚扰电话垃圾短信? 尽管有了电邮.各色IM应用,手机号依然是联络一个人抵达率最高且最高效的联系方式.理想的情况是,手机号只被用于熟人之间,但现实的情况却是:在网购.快递.外卖等诸 ...

  10. [高通SDM450][Android9.0]禁止电话、短信呼入

    文章目录 开发平台基本信息 问题描述 解决方法 禁止电话.短信呼入 开发平台基本信息 芯片: SDM450 版本: Android 9.0 kernel: msm-4.9 问题描述 公司有一款设备,作 ...

最新文章

  1. 区块链技术特点之去中心化特性
  2. BERT论文阅读(二): CG-BERT:Conditional Text Generation with BERT for Generalized Few-shot Intent Detection
  3. 【More Effective C#】LINQ表达式与方法调用的映射
  4. 4.02Day12函数 装饰器
  5. 电脑怎么打印文件步骤_电脑中毒后怎么办 电脑中毒后解决方法【详细步骤】...
  6. Codeforces Beta Round #5 B. Center Alignment 模拟题
  7. 生成器设计模式的应用
  8. 第一个关于中式菜谱的智能问答机器人小程序正式上线啦
  9. JDBC实现学生信息管理系统(仅增删改查)
  10. 我插计算机英语,帮我翻译以下计算机英语的句子
  11. 软件测试 查看网页打开时间,网页响应时间101(一)
  12. Unable to read entire header,0 bytes read;expected 512 bytes
  13. PPPOE拨号之一:Cisco 路由器adsl拨号配置
  14. 手工植锡、焊接BGA芯片
  15. 百旺红字发票信息表显示服务器返回为空,红字发票信息表状态详细说明
  16. 将文件夹的分组方式应用到电脑的所有文件夹
  17. 一周热图|陈飞宇成天梭表形象代言人;朱一龙赵丽颖登陆欧舒丹星球;张信哲代言欧宝娱乐...
  18. InvalidDefinitionException: No serializer found for class java.lang.Object and no properties discove
  19. 电脑硬件升级完全解决方案-1
  20. 铝板展开插件_钣金件快速绘图与展开程序CAD插件(钣金展开插件工具)Vr2.10 最新版...

热门文章

  1. Java程序设计基础(第五版)期末总复习
  2. linux下的PDF阅读器
  3. ubuntu 16.04/14.04 ORK 在 Kinect v2和 Kinect v1的安装(物体位姿估计)
  4. 局域网文件自动同步更新服务器版,自同步(局域网文件实时同步工具) V2.1.0 官方安装版...
  5. Oracle 高级教程
  6. 易班 华南理工大学 新生入学教育在线考试 题库共503题
  7. 专题导读:基于大数据的知识图谱及其应用
  8. python批量下载文件
  9. iOS C语言~bzero函数、memset函数
  10. VC之fseek函数、ftell函数和rewind函数