在之前的这篇博客中,https://blog.csdn.net/huangbaokang/article/details/112334420

一、手工调用Service来拦截黑名单号码

我们讲解了手工挂断电话,使用的是AIDL,通过点击按钮来触发挂断电话的功能。接下来我们实现自动挂断电话,到达拦截黑名单电话的功能。
具体原理是通过广播接收器,通过注册开机的广播,启动一个挂断电话的服务即可,我们分两步,手工启动挂断电话的服务,此处不使用广播,后面将讲解。
布局

<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"tools:context="${relativePackage}.${activityClass}" ><Buttonandroid:id="@+id/btn_main_start"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="启动来电监听"android:onClick="startListenCall" /><Buttonandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="停止来电监听"android:onClick="stopListenCall" android:layout_below="@id/btn_main_start"/></RelativeLayout>

处理Activity类,很简单,直接启动服务,和中断服务

package com.hbk.service;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void startListenCall(View v) {startService(new Intent(this, ListenCallService.class));}public void stopListenCall(View v) {stopService(new Intent(this, ListenCallService.class));}
}

我定义ListenCallService类,并使用PhoneStateListener来监听不同打电话的状态,重点在处理响铃状态。

package com.hbk.service;import java.lang.reflect.Method;import com.android.internal.telephony.ITelephony;import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;public class ListenCallService extends Service {private TelephonyManager tm;private PhoneStateListener listener = new PhoneStateListener() {// 当通话状态发生改变时调用/*** Callback invoked when device call state changes.** @see TelephonyManager#CALL_STATE_IDLE* @see TelephonyManager#CALL_STATE_RINGING* @see TelephonyManager#CALL_STATE_OFFHOOK*/public void onCallStateChanged(int state, String incomingNumber) {switch (state) {case TelephonyManager.CALL_STATE_IDLE:// 空闲 (挂断电话/未来电之前)Log.e("TAG", "空闲 (挂断电话/未来电之前)");break;case TelephonyManager.CALL_STATE_RINGING:// 响铃Log.e("TAG", "响铃");// 如果来电电话是黑名单号(110), 就挂断电话if ("110".equals(incomingNumber)) {try {endCall();} catch (Exception e) {e.printStackTrace();}}break;case TelephonyManager.CALL_STATE_OFFHOOK:// 接通Log.e("TAG", "接通");break;default:break;}}};@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}/*** 挂断电话* @throws Exception */private void endCall() throws Exception {// 通过反射调用隐藏的API// 得到隐藏类的Class对象Class c = Class.forName("android.os.ServiceManager");// 得到方法所对应的Method对象Method method = c.getMethod("getService", String.class);// 调用方法IBinder iBinder = (IBinder) method.invoke(null,Context.TELEPHONY_SERVICE);// 得到接口对象ITelephony telephony = ITelephony.Stub.asInterface(iBinder);// 结束通话telephony.endCall();}@Overridepublic void onCreate() {super.onCreate();Log.e("TAG", "Service onCreate()");// 得到电话管理器tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);// 监听电话状态tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);}@Overridepublic void onDestroy() {super.onDestroy();Log.e("TAG", "Service onDestroy()");// 停止电话监听tm.listen(listener, PhoneStateListener.LISTEN_NONE);}}

如上文件需要根据AIDL文件生成代码,才能在ListenCallService 中进行引用。

清单文件中增加如下两个权限

     <!-- 挂断电话 --><uses-permission android:name="android.permission.CALL_PHONE"/><!-- 读取电话状态 --><uses-permission android:name="android.permission.READ_PHONE_STATE"/>

并注册服务

<service android:name="com.hbk.service.ListenCallService"></service>

测试点击启动监听,然后在模拟器中对110进行打电话,发现没有电话呼入,但在通话记录里却可以看到记录。
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程

二、使用广播进行黑名单号码短信拦截

解析来我们介绍使用广播来实现黑名单号码的电话及短信拦截。
新建一个BootReceiver来接收开机完成广播的receiver

package com.hbk.service;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;/*** 接收开机完成广播的receiver**/
public class BootReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//启动电话监听的servicecontext.startService(new Intent(context, ListenCallService.class));}}

并在清单文件中增加如下权限

 <!-- 接收开机完成广播的权限 --><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

注册广播,action name是固定写法,记住即可

     <receiver android:name="com.hbk.service.BootReceiver"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver>

工作中常用的广播

同理,我们定义一个拦截黑名单短信的receiver

package com.hbk.service;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;/*** 接收来了短信的广播的receiver**/
public class SmsReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//1. 得到intent短信数据, 并封装为短信对象smsMessageBundle extras = intent.getExtras();Object[] pdus = (Object[])extras.get("pdus");SmsMessage smsMessage = SmsMessage.createFromPdu((byte[])pdus[0]);//2. 取号码String number = smsMessage.getOriginatingAddress();String content = smsMessage.getMessageBody();Log.e("TAG", number +" : "+content);//3. 判断是否是黑名单号if("110".equals(number)) {//4. 如果是, 中断广播(拦截短信)abortBroadcast();Log.e("TAG", "拦截到一个黑名单短信");}}}

在清单文件中进行配置

<receiver android:name="com.hbk.service.SmsReceiver"><intent-filter android:priority="2147483647"><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>

通过SmsMessage 对象去取出电话号码及短信内容。测试的话,先部署应用,然后关掉虚拟机,重新开机进行测试,开机的时候可以看到黑名单号码的广播接收器生效了。

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

  1. Android 12.0Launcher3 电话和短信app图标显示未读短信和未接来电的条数

    1.概述 在12.0产品开发中,最近客户有需求要求在电话app图标显示未接来电的条数 在短信app图标上显示未读信息的条数 根据需求首选要在Launcher3的Launcher.java中,启动lau ...

  2. Android电话和短信拦截器

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

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

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

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

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

  5. 手机黑名单,拦截电话和短信,清除通话记录

    首先对功能简单分析一下,既然是黑名单功能,那么肯定是写在服务里面,需要一直在后台运行着. 一.拦截短信 短信在接收的时候,广播发送,监听广播接受者,拦截短信(有序广播) 将广播的优先级级别提高到最高 ...

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

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

  7. Android 来电(包括铃声),短信拦截的实现方法

    关于拦截的文章我之前写过拦截Back按键和Home按键的处理方法,今天就开发过程中关于电话,短信的拦截做一个总结. 一:拦截来电的功能实现 现在的Android版本已经把Phone类的相关API给隐藏 ...

  8. Android开发学习之电话、短信、联系人

    作为一部手机,最重要的功能当属电话.短信.联系人了,所以今天想和大家分享的是关于Android电话.短信.联系人这块的API接口. 1.通话记录的获取 List<TelePhoneRecord& ...

  9. Android监听消息(二)——电话及短信监听

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为2747字,预计阅读6分钟 前言 前面一篇<Android监听消息(一)--应用消息捕获>我们使用Notificat ...

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

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

最新文章

  1. 2022-2028年中国康复辅具行业市场研究及前瞻分析报告
  2. MarkDown 流程图 ... ...
  3. 李嘉诚拥有8500亿资产, 是真正的世界首富,为何要藏富?
  4. 抽奖系统的流量削峰方案
  5. arduino COM口被占用问题解决
  6. 基于OK6410开发板Uboot源码简单分析
  7. linux杂谈(十七):iscsi存储分离技术
  8. 【ArcGIS|空间分析】第七届全国大学生GIS技能大赛——上午
  9. 库伦法-锂电池容量计量
  10. 行测题中逻辑判断题的规律
  11. graphpad做单因素方差分析_GraphPad中国官网 - Prism 8 统计指南 - 单因素方差分析
  12. 翻译Allegorithmic的文档《THE PBR GUIDE - PART 1》
  13. Python爬虫进阶--js逆向-某天下与某某二手房密码加密分析
  14. Python-函数入参和全局变量
  15. linux打开python3_号外:RIDE 可以在 linux+python3 的环境中运行啦!
  16. MFC实现简单连续加减计算器
  17. iOS字体像数与磅的对应关系
  18. python2048游戏撤销上一部功能怎么实现_python 实现 2048 游戏 (一)
  19. 机器学习:python实现LDA降维算法
  20. Linux 下安装 Tomcat 6(zhuang)

热门文章

  1. 一信通短信接口对接_实例分享:验证码短信接口如何对接?接口api哪个好用?...
  2. TP5路由知识简单个人汇总
  3. android自定义pickerview,一个非常好用的Android PickerView库
  4. 群晖NAS教程(十五)、利用Web Station安装typecho博客
  5. Java实战项目,附带源码+视频教程。
  6. 推荐四款实用的局域网文件夹同步工具
  7. python遗传算法解简单整数规划与原理探究
  8. 实证分析 | 中介效应检验原理与Stata代码实现
  9. 《趣谈网络协议》课程学习笔记
  10. Boss说:你要是能搞懂这六个分布式技术栈,我给你薪资翻倍