Android 实现电话和短信拦截的功能如下:

1.实现广播接口,即【BroadcastReceiver】

检测到电话来时,则挂断电话,同时保存来电的电话号码,一做特殊处理【发信息或者一段时间后提示用户有人来电】
package com.xxx.phone;import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;import com.android.internal.telephony.ITelephony;//见第二点
import android.telephony.SmsMessage;import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;/*** 监听电话状态,挂断特定情况下的电话** */
public class PhoneReceiver extends BroadcastReceiver {private TelephonyManager telephonyManager;private final String PHONE_RECEIVER_ACTION ="android.intent.action.PHONE_STATE";private final String MSM_RECEIVER_ACTION ="android.provider.Telephony.SMS_RECEIVED";@Overridepublic void onReceive(Context context, Intent intent) {telephonyManager = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);String action = intent.getAction();//判断是否电话还是信息Log.i("PhoneReceiver", "获取action:" + action);if(PHONE_RECEIVER_ACTION.equals(action)){//处理电话防打扰telephone(context,intent);}else if(MSM_RECEIVER_ACTION.equals(action)){messageInfo(context,intent);}}/*** 挂断电话* ITelephony 对象,需要aidl 和系统service 通信,挂断电话* 注:aidl文件 会自动生成相应的java 文件*/private boolean endCall() {Class<TelephonyManager> c = TelephonyManager.class;try {Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);getITelephonyMethod.setAccessible(true);ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(telephonyManager, (Object[]) null);iTelephony.endCall();return true;}catch (Exception e)  {Log.e("PhoneReceiver","反射获取ITelephony 对象异常",e);}return false;}/*** 电话防打扰*  对于一段时间内多次连续拨打,则放行【待实现】*/private void  telephone(Context context, Intent intent){telephonyManager = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);switch(telephonyManager.getCallState()){//响铃case TelephonyManager.CALL_STATE_RINGING:String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);Log.i("PhoneReceiver", "当前电话号码:" + number);endCall();}break;}}
    //参照网上的代码拦截短信private void messageInfo(Context context, Intent intent){//获取intent参数Bundle bundle=intent.getExtras();//判断bundle内容if (bundle!=null){//取pdus内容,转换为Object[]Object[] pdus=(Object[])bundle.get("pdus");String format = intent.getStringExtra("format");//解析短信SmsMessage[] messages = new SmsMessage[pdus.length];for(int i=0;i<messages.length;i++){byte[] pdu=(byte[])pdus[i];messages[i]=SmsMessage.createFromPdu(pdu);}//解析完内容后分析具体参数for(SmsMessage msg:messages) {//获取短信内容String content=msg.getMessageBody();String sender=msg.getOriginatingAddress();Date date = new Date(msg.getTimestampMillis());SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String sendTime = sdf.format(date);Log.i("PhoneReceiver","电话["+sender+"] 内容:"+content+"时间:"+sendTime);}}}
}

2. 挂断电话,endCall()

由于系统将挂断电话的api隐藏了,因此需要是有反射机制来获取,ITelephony ,但是其引用需要使用aidl来和系统服务通信,创建好相应的包路径,然后创建aidl 文件 如:


具体内容参见Android源码或者 参见ITelephony.aidl    ,android studio 中 make project 就会生成相应的java代码,然后项目中就可以使用了

3.注册广播

在AndroidManifest.xml 注册

  <!-- 注册监听手机状态 --><receiver android:name="com.xxx.phone.PhoneReceiver"><intent-filter android:priority="1000" ><action android:name="android.intent.action.PHONE_STATE" /><action android:name="android.provider.Telephony.SMS_RECEIVED" /></intent-filter></receiver>

4.添加权限

 <!-- 电话权限 --><uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>    <!-- 短信监控权限 --><uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
完成
注意:该功能有点流氓,需要用到合适的地方

Android 用代码实现防打扰【能够屏蔽电话和短信】相关推荐

  1. Android运行时权限,设置帮助类BaseActivity;电话权限,短信权限,

                                      Android运行时权限设置帮助类BaseActivity  一.电话权限 package com.glandroid.smssen ...

  2. Arduino+sim800C家居安防火灾报警 拨打电话 发送短信例程程序

    家居安防报警器,参考程序. 火灾报警 涉及用sim800c发短信,拨打电话通知.               接线: Sim800c 3.3V -> Arduino 3.3V Sim800c G ...

  3. setup 阶段 屏蔽电话和短信

    来电和接收到短信的流程, 在 基本原理都是,底层发广播上层接收处理 (手机管家的framework 层相关处理也可以在这里) //在开机向导阶段,禁止电话接入packages/services/Tel ...

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

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

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

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

  6. android stuido 如何使用SIM2或双SIM卡提交短信

    Android studio 使用默认SIM卡发送短信的代码非常简单 SmsManager.getDefault().sendTextMessage("电话号码", null, & ...

  7. Android电话和短信拦截器

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

  8. Android通讯录管理(获取联系人、通话记录、短信消息)(二)

    Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 同样的,你可以到这里下载源码:http://download ...

  9. Android通讯录管理(获取联系人、通话记录、短信消息)(三)

    Android通讯录管理(获取联系人.通话记录.短信消息)(三) 这是通讯录管理的最后一篇,前面两篇已经把获取联系人和通话记录解决了,短息消息就相对来说要稍微复杂那么一点.我们先来看看效果图: 源码下 ...

最新文章

  1. Windows10完美安装VMTK(血管建模工具包)
  2. python3.5 mysql 库_Python 3.5 连接Mysql数据库(pymysql 方式)
  3. 团队作业9--beta版本测试报告及发布说明
  4. 成功解决ImportError: cannot import name ‘Imputer‘
  5. 温州大学《机器学习》课程代码(四)朴素贝叶斯
  6. iOS开发 - App程序启动原理
  7. java语言入门要多久,王者笔记!
  8. Python基础:内置异常(未完待续)
  9. 一些很有用的JS特效
  10. 统一的账号密码管理系统-信息安全课程设计
  11. HTML5视频自动循环播放
  12. Git常用命令及其作用_艾孜尔江撰
  13. 实验一 简单io应用—流水灯控制示例程序_【正点原子FPGA连载】第十章呼吸灯实验--领航者ZYNQ之linux开发指南...
  14. 荣联再次中标中国移动云资源池项目
  15. 中小企业发展电子商务的必要性
  16. 安卓启动中的PARTUUID
  17. 北京内推 | ​轻舟智航自动驾驶感知组招聘深度学习算法实习生
  18. ubuntu网络连接问题(网络图标不见了,ifconfig不显示ip....)
  19. 推荐排序模型2—— wideDeep及python(DeepCTR)实现
  20. Qt for Android 程序实现对手机文件的导入打开与导出保存

热门文章

  1. 男孩变成男人的标志35岁前必须做好的十件事情 [转]
  2. 2.3 Linux系统中的日志管理
  3. 3DMAX 阵列工具、间隔工具快捷键
  4. mac sed 正则表达式匹配空格
  5. 微信小程序自定义导航栏返回和标题
  6. 未来教育官网计算机一级考试题,2019年计算机一级考试MS Office操作试题021
  7. QChart绘图时出现警告:axisX has been explicitly marked deprecated here
  8. anaconda :An unexpected error has occurred. Conda has prepared the above report
  9. 关闭云平台、强制重启
  10. 旺店通·企业奇门与用友BIP对接集成查询退换管理连通销售退货单个保存(退换货生成销售退货(线下)-测试重传)