首先对功能简单分析一下,既然是黑名单功能,那么肯定是写在服务里面,需要一直在后台运行着。
一、拦截短信
短信在接收的时候,广播发送,监听广播接受者,拦截短信(有序广播)
将广播的优先级级别提高到最高 (1000)
二、 拦截电话
有电话拨入,处于响铃状态,响铃状态通过代码去挂断电话(aidl,反射),拦截电话
挂断电话号码的方法,放置在了aidl文件中,方法名为endCall
在此处去查看TelePhoneManager源码,去查找获取ITelephony对象的方法
ServiceManager此类android对开发者隐藏,所以不能去直接调用其方法,所以需要反射调用
ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));

1,获取ServiceManager字节码文件
Class

代码:

package com.wutao.mobilesafe.service;import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.telephony.PhoneStateListener;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;import com.android.internal.telephony.ITelephony;
import com.wutao.mobilesafe.db.dao.BlackNumberDao;import java.lang.reflect.Method;/*** Created by 凸显 on 2016/8/14.*/
public class BlackNumberService extends Service {private InnerSmsReceiver mInnerSmsReceiver;private BlackNumberDao mDB;private TelephonyManager mTM;private MyPhoneStateListener mPhoneStateListener;private MyContentObserver mContentObserver;@Overridepublic void onCreate() {mDB = BlackNumberDao.getInstance(getApplicationContext());//拦截短信,注册短信监听的广播IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");intentFilter.setPriority(1000);mInnerSmsReceiver = new InnerSmsReceiver();registerReceiver(mInnerSmsReceiver, intentFilter);//电话状态的监听(服务开启的时候,需要去做监听,关闭的时候电话状态就不需要监听)//1,电话管理者对象mTM = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);//监听电话状态mPhoneStateListener = new MyPhoneStateListener();mTM.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);super.onCreate();}class MyPhoneStateListener extends PhoneStateListener {@Overridepublic void onCallStateChanged(int state, String incomingNumber) {switch (state) {//空闲状态,没有任何活动(移除吐司)case TelephonyManager.CALL_STATE_IDLE:break;//摘机状态,至少有个电话活动。该活动或是拨打(dialing)或是通话case TelephonyManager.CALL_STATE_OFFHOOK:break;//响铃case TelephonyManager.CALL_STATE_RINGING://挂断电话endCall(incomingNumber);break;}super.onCallStateChanged(state, incomingNumber);}}private void endCall(String number) {int mode = mDB.getMode(number);if (mode == 2 || mode == 3) {
//      ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE))
//      ServiceManager此类android对开发者隐藏,所以不能去直接调用其方法,需要反射调用
//      首先需要导入aidl文件try {//获取ServiceManager字节码文件Class<?> clazz = Class.forName("android.os.ServiceManager");//获取方法Method method = clazz.getMethod("getService", String.class);//静态方法直接调用IBinder iBinder = (IBinder) method.invoke(null, Context.TELEPHONY_SERVICE);//调用获取aidl文件对象方法ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);//调用在aidl中隐藏的endCall方法挂断电话iTelephony.endCall();//在内容解析器上,去注册内容观察者,通过内容观察者,观察数据库(Uri决定那张表那个库)的变化mContentObserver = new MyContentObserver(new Handler(), number);getContentResolver().registerContentObserver(Uri.parse("content://call_log/calls"), true, mContentObserver);} catch (Exception e) {e.printStackTrace();}}}class MyContentObserver extends ContentObserver {private String phone;public MyContentObserver(Handler handler, String phone) {super(handler);this.phone = phone;}//数据库中指定calls表发生改变的时候会去调用方法@Overridepublic void onChange(boolean selfChange) {//当插入一条数据后,再进行删除getContentResolver().delete(Uri.parse("content://call_log/calls"), "number = ?", new String[]{phone});super.onChange(selfChange);}}@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}private class InnerSmsReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//获取短信内容Object[] objects = (Object[]) intent.getExtras().get("pdus");for (Object object : objects) {//获取短信对象SmsMessage sms = SmsMessage.createFromPdu((byte[]) object);//获取短信对象的基本信息String address = sms.getOriginatingAddress();//拨入的电话号码String messageBody = sms.getMessageBody();int mode = mDB.getMode(address);if (mode == 1 || mode == 3) {//拦截短信(android 4.4版本失效  短信数据库,删除)abortBroadcast();}}}}@Overridepublic void onDestroy() {//当服务销毁时,广播也销毁if (mInnerSmsReceiver != null) {unregisterReceiver(mInnerSmsReceiver);}//注销内容观察者if (mContentObserver != null) {getContentResolver().unregisterContentObserver(mContentObserver);}//取消电话状态的监听if (mPhoneStateListener != null) {mTM.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);}super.onDestroy();}
}

手机黑名单,拦截电话和短信,清除通话记录相关推荐

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

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

  2. 一个手机通讯录、短信、通话记录读取依赖库

      一个通讯录.短信.通话记录读取工具库,jar包下载地址,使用方法:   读取通讯录 权限: <uses-permission android:name="android.permi ...

  3. adb 读取短信,通话记录、日历、通讯录等的方法

    读取手机短信: adb shell content query --uri content://sms/ 这将列出所有短信消息的详细信息,例如短信内容.发送者和接收者的电话号码.时间戳等. 读取手机通 ...

  4. 关于Google上架短信与通话记录权限的一深坑

    最近在做运动手环类 APP ,需要用到短信与通话记录的权限组 READ_CALL_LOG.WRITE_CALL_LOG . 首先,提交应用时会提示必须声明这些敏感权限,然后按照要求去声明就行. 这里核 ...

  5. Android拦截电话与短信(电话拒接/短信拒收)

    前段时间领导说了这样一个需求:对特定的号码电话进行拦截.短信拒收,在百度了查阅了很多的资料,结果有点不尽人意.特别是AIDL通信接口废了老大劲.直接上过程 创建aidl通信接口直接在main目录新建a ...

  6. iPhone电话与短信相关代码小结

    关于iPhone上电话与短信相关功能,做一个简单总结: 使用公开SDK能实现的功能: (1)获取和操作通讯录.使用函数 ABAddressBookRequestAccessWithCompletion ...

  7. Python数据挖掘处理通话数据、短信以及上网记录完整项目+源码+源码解释

    对通话.短信以及上网记录的数据来预测风险用户 本文代码全部采用jupyter运行 先导入相关的包 # -*- coding: UTF-8 -*- import pandas as pd import ...

  8. 手机“秘密” 发短信清除

    模仿功能:短信清除程序 模仿对象:手机看门狗 模仿进度:第二期 开发平台:Windows Mobile平台 手机丢了,里面的照片怎么办?文件怎么办?删除!如果不法分子利用电话簿进行诈骗,祸害无穷,电话 ...

  9. Android电话和短信拦截器

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

最新文章

  1. 2020年AI怎么发展?听加州大学、谷歌、英伟达、IBM怎么说
  2. VB无所不能之五:建立“标准”DLL动态链接库文件(1)
  3. 备忘之--apache下为站点添加错误页面
  4. C++:线程操作之CRITICAL_SECTION用法的介绍和例子理解
  5. mysql8.0.22 win7_ArcGIS10.8地理信息软件中英文版安装教程
  6. tiny core linux arm,极度简约 最小 Linux 发行版 Tiny Core Linux 7.1 发布
  7. linux的网络配置
  8. c++:json字符串拼接,json对象组装
  9. yum命令报错在linux下,执行yum命令报错
  10. AD将原理图转换成彩色或者黑白PDF
  11. POI Excel插入水印(只支持07版Excel文档)
  12. Vue的一些API理解整理,如何一次引入多次调用
  13. 数据库新用户登录报错user test lacks create session privilege logon denied
  14. 初学cesium时的一些笔记,过于潦草看看就好
  15. 数据库增删改查的基本操作和SpringBoot创建
  16. 常用Windows 快捷键
  17. Photoshop CC重磅功能发布:复杂抠图也能一键搞定
  18. [肖博数学干货]高考数学二轮复习方法之概率和统计附强化题型解析
  19. 预测分析·商品评论情感预测-基于PaddleNLP的京东商品评论情感分析竞赛
  20. matlab print用法,使用Matlab:错误使用 mprint (line 231) Wrong # rnames in mprint,怎么解决...

热门文章

  1. WPF入门0:WPF的基础知识
  2. WPF(三) WPF 命令
  3. Linq技术四:动态Linq技术 -- Linq.Expressions
  4. 开心消消乐java下载_开心消消乐下载_开心消消乐下载最新iPhone版-太平洋下载中心...
  5. SpringCloud知识点总结
  6. 【钉钉-场景化能力包】CRM销售系统集成
  7. 【捡肥皂】Microsoft SQL Server 2000 MSSQL2000下载中文企业版个人版免费下载
  8. 下载在线阅览的pdf文件
  9. 【ZJOI2022】 众数(根号分治)
  10. scrollToBottom