今天讲一下最近项目中刚做的黑名单拦截,其中可以拦截短信和电话

先讲一下拦截电话的操作

首先要注册一个监听电话广播的广播接收器。

在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 黑名单中电话拦截相关推荐

  1. Android App开发--电话拦截

    1)Android开发环境搭建 2)APP主要功能及实现方式 3)APP其他功能及实现方式 4)APP中应用到的技术 5)测试和代码 --------------------------------- ...

  2. MTK方案上基于Android N拦截黑名单中的短/彩信的方法

    --- 作者 zuhui.zhang 安卓7.0原生系统增加了在framework层拦截黑名单来电和短信,但不会将数据保存到数据库,因此无法查看到被拦截的来电和短信.在安卓7.0之前,黑名单的短信默认 ...

  3. Android手机安全软件之电话拦截功能浅析

    目前中国市场,骚扰电话大量的充斥手机用户的生活,因此手机安全软件的电话拦截功能受到广泛关注和使用.但第三方应用级电话拦截功能的效果并不理想,比如拦截电话时已经响了一声.或出现短暂的来电界面,多款安全软 ...

  4. android 电话拦截

    1. 床架aidl文件,ITelephony.aidl 这个文件创建在aidl文件夹下面的 com.android.internal.telephony包下面 2. ITelephony文件里面添加接 ...

  5. Android项目:手机安全卫士(13)—— 通讯卫士之电话拦截与挂断

    Android项目:手机安全卫士(13)-- 通讯卫士之电话拦截与挂断 1 介绍 上一节我们讲了黑名单数据的存储等 CRUD 操作,今天,就到了它们发挥作用的时候了,通讯卫士功法终于要练成了.我们实现 ...

  6. 广播接收者android,电话拦截广播,电话接收者demo

    一.Android广播机制介绍 广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的. Android中广播的是操作系统中产生的各种各样的事件.例如,收到一条短信就会 ...

  7. Android电话拦截及拦截提示音的实现

    本文所讲的内容是在Android系统中如何写程序进行 电话拦截,并发出拦截提示音提醒用户,可以说此功能还是比较实用的. 1.电话拦截 这个功能大家可能都知道了,就是利用反射原理调用ITelephony ...

  8. android电话拦截软件下载,骚扰电话拦截器

    骚扰电话拦截器是一款支持自定义数据库的电话拦截软件,你可以自定义的在上面倒入各种骚扰电话的数据或者是API,这款软件会通过这些API来帮助你进行拦截,小巧的体积以及轻松的操作方式非常适合那些需要高颜D ...

  9. Android中电话拦截器案例

    实验要求:实现拦截保存到手机中的号码 1.在main-activity布局文件中代码如下: <?xml version="1.0" encoding="utf-8& ...

  10. Android M ROM 层拦截电话

    最近需要添加联系人黑名单功能,涉及到电话拦截,在CallsManager.java中有如下方法: @Overridepublic void onSuccessfulIncomingCall(Call ...

最新文章

  1. hung-yi lee_p22_无监督学习:词嵌入
  2. 【转】C++ this指针(直戳本质)
  3. 高年薪的Web前端工程师经常思考哪些问题?
  4. book电子书数据库设计_如何为杀手book的封面设计写出完美的摘要
  5. 在.NET Core下的机器学习--学习笔记
  6. 7001.ubuntu18.04搭建go语言开发环境
  7. python备份目录下文件夹_python---备份目录和文件
  8. C++ STL sort 函数的用法(自定义排序函数)
  9. linux进程通信方式总结
  10. 关于段地址和偏移地址的理解
  11. java 字母大小写的转换_Java字母大小写转换的方法
  12. 用Android studio设计贺卡,功能强大的贺卡设计制作软件推荐:Hallmark Card Studio
  13. 检测OTU序列遗传发育信号的R实现
  14. Spring Boot统一日志框架
  15. 大三第一次参加ACM ICPC Regional打了两块铁,怎么办?
  16. 如何在微信小程序中下载APP?
  17. MacBook Pro使用记录(一):手动清理内存
  18. 淘宝标题怎么写?写标题营销词怎么应用恰当?
  19. 最全解决方法:未解压的word文档修改保存后找不到
  20. 软件基础原理——程序运行原理

热门文章

  1. 学习总结-《父与子的编程之旅》chapter 9
  2. #洛谷oj:P3144 Closing the Farm S
  3. PDF控件Aspose.Pdf 12月新版17.12发布 | 附下载
  4. 2019最新java实战项目资料
  5. Google验证码ReCaptcha V3
  6. linux 基础知识考试试题,Linux常识型试题
  7. bzero 和 memset 函数对比
  8. iOS 颜色选择器 仿ps 调色板
  9. 趣谈网络协议学习笔记[计算机网络]
  10. 手把手教你使用Python做数据分析