android 黑名单中电话拦截
今天讲一下最近项目中刚做的黑名单拦截,其中可以拦截短信和电话
先讲一下拦截电话的操作
首先要注册一个监听电话广播的广播接收器。
在Manifest文件中
<receiver android:name=".Receiver.InterceptSmsReceiver" android:enabled="true" android:exported="true"> <intent-filter android:priority="2147483647"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
同时还要添加读取电话记录,写入电话记录,以及监听电话的权限
<uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.WRITE_CALL_LOG" /> <uses-permission android:name="android.permission.READ_CALL_LOG" />
现在来说一下拦截电话的逻辑
使用广播接收器监听电话广播,如果发现来电号码存在于黑名单中,那么就endCall(),这时要注意通话记录中是都存在需要拦截的号码的电话记录,如果存在的话,要通过ContentResolver将其删除掉。
public class InterceptCallReceiver extends BroadcastReceiver {private static final String TAG = "interceptcall"; public InterceptCallReceiver() {}@Override public void onReceive(Context context, Intent intent) {SharedPreferences mSp = context.getSharedPreferences("config", Context.MODE_PRIVATE); boolean BlackNumStatus = mSp.getBoolean("BlackNumStatus", true); if (!BlackNumStatus) {return; }BlackNumberDBOperation operation = new BlackNumberDBOperation(context); if (!intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {String mIncomingNumber = ""; /**来电**/ TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); switch (telephonyManager.getCallState()) {case TelephonyManager.CALL_STATE_RINGING:mIncomingNumber = intent.getStringExtra("incoming_number"); int blackContactMode = operation.getBlackContactMode(mIncomingNumber); /**这里的Opration是一个实体类的操作类,用户与查询黑名单是都存在,并返回拦截模式**/ if (blackContactMode == 1 || blackContactMode == 3) {/** * 观察呼叫记录(其他的应用程序,像是手机通讯录程序)的变化 * 如果生成了呼叫记录,就把呼叫记录删除掉 */ Uri uri = Uri.parse("content://call_log/calls"); context.getContentResolver().registerContentObserver(uri, true, new CallLogObserver(new Handler(), mIncomingNumber, context)); endCall(context); }break; }}}private class CallLogObserver extends ContentObserver {/** * Creates a content observer. * * @param handler The handler to run {@link #onChange} on, or null if none. */ private String incomingNumber; private Context context; public CallLogObserver(Handler handler, String incomingNumber, Context context) {super(handler); this.incomingNumber = incomingNumber; this.context = context; }@Override public void onChange(boolean selfChange) {super.onChange(selfChange); Log.d(TAG, "呼叫数据库的内容变化了"); context.getContentResolver().unregisterContentObserver(this); deleteCallLog(incomingNumber, context); }}/** * 清除呼叫记录 * @param incomingNumber * @param context */ public void deleteCallLog(String incomingNumber, Context context) {ContentResolver resolver = context.getContentResolver(); Uri uri = Uri.parse("content://call_log/calls"); Cursor cursor = resolver.query(uri, new String[]{"_id"}, "number=?", new String[]{incomingNumber}, "_id desc limit 1"); if (cursor.moveToNext()) {String id = cursor.getString(0); resolver.delete(uri, "_id", new String[]{id}); }}/** * 挂断电话需要复制两个AIDL(利用反射) */ public void endCall(Context context){try {Class clazz=context.getClassLoader().loadClass("android.os.Service Manager"); Method method=clazz.getDeclaredMethod("getService",String.class); IBinder iBinder = (IBinder) method.invoke(null,Context.TELEPHONY_SERVICE); ITelephony itelephony = ITelephony.Stub.asInterface(iBinder); itelephony.endCall(); } catch (ClassNotFoundException e) {e.printStackTrace(); } catch (NoSuchMethodException e) {e.printStackTrace(); } catch (InvocationTargetException e) {e.printStackTrace(); } catch (IllegalAccessException e) {e.printStackTrace(); }} }
最后,需要讲的是程序挂断电话,需要通过反射得到ITelephony接口。
需要将android源码中的两个AIDL复制到程序目录中。
一个是ITelephony.aidl,需要建立一个与其包名一致的包com.android.internal.telephony(在src下建立的是com/android/internal/telephony),然后将其复制到包下
还有一个则是与ITelephony关联的AIDL文件,NeighboringCellInfo.aidl,它所在的包是android.telephony,如上方法创建
两个AIDL文件的下载路径:http://pan.baidu.com/s/1pLrh9VX
密码:y4fw
android 黑名单中电话拦截相关推荐
- Android App开发--电话拦截
1)Android开发环境搭建 2)APP主要功能及实现方式 3)APP其他功能及实现方式 4)APP中应用到的技术 5)测试和代码 --------------------------------- ...
- MTK方案上基于Android N拦截黑名单中的短/彩信的方法
--- 作者 zuhui.zhang 安卓7.0原生系统增加了在framework层拦截黑名单来电和短信,但不会将数据保存到数据库,因此无法查看到被拦截的来电和短信.在安卓7.0之前,黑名单的短信默认 ...
- Android手机安全软件之电话拦截功能浅析
目前中国市场,骚扰电话大量的充斥手机用户的生活,因此手机安全软件的电话拦截功能受到广泛关注和使用.但第三方应用级电话拦截功能的效果并不理想,比如拦截电话时已经响了一声.或出现短暂的来电界面,多款安全软 ...
- android 电话拦截
1. 床架aidl文件,ITelephony.aidl 这个文件创建在aidl文件夹下面的 com.android.internal.telephony包下面 2. ITelephony文件里面添加接 ...
- Android项目:手机安全卫士(13)—— 通讯卫士之电话拦截与挂断
Android项目:手机安全卫士(13)-- 通讯卫士之电话拦截与挂断 1 介绍 上一节我们讲了黑名单数据的存储等 CRUD 操作,今天,就到了它们发挥作用的时候了,通讯卫士功法终于要练成了.我们实现 ...
- 广播接收者android,电话拦截广播,电话接收者demo
一.Android广播机制介绍 广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的. Android中广播的是操作系统中产生的各种各样的事件.例如,收到一条短信就会 ...
- Android电话拦截及拦截提示音的实现
本文所讲的内容是在Android系统中如何写程序进行 电话拦截,并发出拦截提示音提醒用户,可以说此功能还是比较实用的. 1.电话拦截 这个功能大家可能都知道了,就是利用反射原理调用ITelephony ...
- android电话拦截软件下载,骚扰电话拦截器
骚扰电话拦截器是一款支持自定义数据库的电话拦截软件,你可以自定义的在上面倒入各种骚扰电话的数据或者是API,这款软件会通过这些API来帮助你进行拦截,小巧的体积以及轻松的操作方式非常适合那些需要高颜D ...
- Android中电话拦截器案例
实验要求:实现拦截保存到手机中的号码 1.在main-activity布局文件中代码如下: <?xml version="1.0" encoding="utf-8& ...
- Android M ROM 层拦截电话
最近需要添加联系人黑名单功能,涉及到电话拦截,在CallsManager.java中有如下方法: @Overridepublic void onSuccessfulIncomingCall(Call ...
最新文章
- hung-yi lee_p22_无监督学习:词嵌入
- 【转】C++ this指针(直戳本质)
- 高年薪的Web前端工程师经常思考哪些问题?
- book电子书数据库设计_如何为杀手book的封面设计写出完美的摘要
- 在.NET Core下的机器学习--学习笔记
- 7001.ubuntu18.04搭建go语言开发环境
- python备份目录下文件夹_python---备份目录和文件
- C++ STL sort 函数的用法(自定义排序函数)
- linux进程通信方式总结
- 关于段地址和偏移地址的理解
- java 字母大小写的转换_Java字母大小写转换的方法
- 用Android studio设计贺卡,功能强大的贺卡设计制作软件推荐:Hallmark Card Studio
- 检测OTU序列遗传发育信号的R实现
- Spring Boot统一日志框架
- 大三第一次参加ACM ICPC Regional打了两块铁,怎么办?
- 如何在微信小程序中下载APP?
- MacBook Pro使用记录(一):手动清理内存
- 淘宝标题怎么写?写标题营销词怎么应用恰当?
- 最全解决方法:未解压的word文档修改保存后找不到
- 软件基础原理——程序运行原理