Android:拦截系统BroadcastReceiver

 系统中的广播

  在Android系统中,内置了很多Action产量,在触发这些Action的时候,均会发布相应的Broadcast。一般而言,查看Android的API文档中,关于Intent的说明即可找到对应Action的Broadcast,但是列举的还不是很全,最好还是下载Android的源代码,通过查看源代码的方式查看需要拦截的Broadcast。

  下面列举一些常用的广播:

  • android.intent.action.TIME_SET:系统时间被修改。
  • android.intent.action.DATE_CHANGED:系统日期被修改。
  • android.intent.action.BOOT_COMPLETED:系统启动完成。
  • android.intent.action.BATTERY_CHANGED:设备电量改变。
  • android.intent.action.BATTERY_LOW:设备电量低。
  • android.intent.action.ACTION_POWER_CONNECTED:设备连接电源。
  • android.intent.action.ACTION_POWER_DISCONNECTED:设备断开电源。
  • android.provider.Telephony.SMS_RECEIVED:系统收到短信。
  • android.intent.action.NEW_OUTGOING_CALL:拨打电话。

  下面通过两个例子,来讲解如何在Android下,拦截系统Broadcast并对其进行处理。

       通过关键字拦截短信

  从上面列举的一些动作会发布的Broadcast,可以找到,当系统接收到一条短信的时候,会发布一个“android.provider.Telephony.SMS_RECEIVED”的Broadcast,之前已经介绍过了,一般系统Broadcast都是有序广播,如果不被高优先级的BroadcastReceiver停止传递,会按照优先级顺序传递下去。

  而在这个示例中,通过监听接收短信的广播,当其内容有黑名单中的关键字的话,则阻止Broadcast继续传播,并使用Toast提示,否则正常提示短信信息。

  通过上一篇博客了解到,onReceive方法的Intent参数包含了这条广播传递的参数,对于短信信息而言,需要获取key为"pdus"的数组,取出数组中每一项,它的每一项代表了一个byte[]格式的短信,需要使用SmsMessage类解析短信内容。

  当然,拦截短信的Broadcast侵犯了隐私,需要注册接收短信的权限: 

1 <uses-permission android:name="android.permission.RECEIVE_SMS"/>

  下面直接展示源代码了,关键注释已经写的很清楚了,这里不再累述:

  MessageBroadcast.java: 

 1 package cn.bgxt.Broadcastdemo.MessageWarn;
 2
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 import android.content.BroadcastReceiver;
 6 import android.content.Context;
 7 import android.content.Intent;
 8 import android.os.Bundle;
 9 import android.telephony.SmsMessage;
10 import android.widget.Toast;
11
12 public class MessageBroadcast extends BroadcastReceiver {
13     // 在模拟器上,通过DDMS发送短信会产生乱码,所以使用拼音代替
14     //在真机上不存在乱码的问题
15     private final String[] blackKeyWord = new String[] { "baoxian", "chuxiao",
16             "jiangjia" };
17
18     @Override
19     public void onReceive(Context context, Intent intent) {
20         // 判断当前接收到的Broadcast是否是收到短信的action
21         if (intent.getAction()
22                 .equals("android.provider.Telephony.SMS_RECEIVED")) {
23             StringBuilder sb = new StringBuilder();
24             // 获取Broadcast传递的数据
25             Bundle bundle = intent.getExtras();
26             if (bundle != null) {
27                 Object[] pdus = (Object[]) bundle.get("pdus");
28                 for (Object p : pdus) {
29                     byte[] pud = (byte[]) p;
30                     // 声明一个SmsMessage,用于解析短信的byte[]数组
31                     SmsMessage message = SmsMessage.createFromPdu(pud);
32                     boolean flag = false;
33                     for (String str : blackKeyWord) {
34                         if (message.getMessageBody().contains(str) ) {
35                             // 发现黑名单关键字,则标记为true
36                             flag = true;
37                             break;
38                         }
39                     }
40                     if (flag) {
41                         sb.append("发件人:n");
42                         sb.append(message.getOriginatingAddress());
43                         sb.append("n发送时间:n");
44                         Date date = new Date(message.getTimestampMillis());
45                         SimpleDateFormat format = new SimpleDateFormat(
46                                 "yyyy-MM-dd HH:mm:ss");
47                         sb.append(format.format(date));
48                         sb.append("n短信内容:n");
49                         sb.append(message.getMessageBody());
50
51                         Toast.makeText(context, sb.toString(),
52                                 Toast.LENGTH_SHORT).show();
53                         // 如果存在黑名单关键字内容,停止Broadcast传播
54                         abortBroadcast();
55                     }
56
57                 }
58             }
59         }
60
61     }
62
63 }

   在AndroidManifest.xml中配置Receiver。

1         <receiver android:name="cn.bgxt.Broadcastdemo.MessageWarn.MessageBroadcast">
2             <!-- 设置优先级,短信优先级为0,大于0即可 -->
3             <intent-filter android:priority="200">
4                 <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
5             </intent-filter>
6         </receiver>

  效果展示,先发送一个包含黑名单中关键字的短信,再发送一个正常的短信。

 

 

 IP拨号

  再来看看IP拨号的示例,在Android中,如果触发拨打电话的Action,则会发布一个"android.intent.action.NEW_OUTGOING_CALL"的Broadcast出来,只需要针对它进行拦截即可,然后在加上IP前缀,把处理过的号码添加到数据传递给下一个Receiver。

  处理接收拨打电话的Broadcast,需要对Android增加权限: 

1 <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

    下面直接上代码了,注释写的很清楚,这里不再累述了。

  IpCallPhone.java: 

 1 package cn.bgxt.Broadcastdemo.IpCall;
 2
 3 import android.content.BroadcastReceiver;
 4 import android.content.Context;
 5 import android.content.Intent;
 6
 7 public class IpCallPhone extends BroadcastReceiver {
 8     private final String STARTS="17951";
 9     @Override
10     public void onReceive(Context context, Intent intent) {
11         // 获取当前拨号的号码
12         String number=getResultData();
13         // 此号码没有被加IP拨号的前缀
14         if(!number.startsWith(STARTS)){
15             // 设置加了IP号码的号码
16             String newnumber=STARTS+number;
17             // 把新号码增加到返回结果数据中,用于传递给后面的Receiver
18             setResultData(newnumber);
19         }
20     }
21 }

   AndroidManifest.xml配置Receiver:

1         <receiver android:name="cn.bgxt.Broadcastdemo.IpCall.IpCallPhone">
2             <intent-filter android:priority="200">
3                 <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
4             </intent-filter>
5         </receiver>

  效果展示:

 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索broadcastreceiver
, action
, 短信
, android intent
, android系统
, intent
, 电话拦截
, 短信拦截
, broadcast
, import
, ip拦截
, android 4 4 短信
, android 短信监听
android 拨号
,以便于您获取更多的相关知识。

时间: 2024-08-10 22:40:22

Android:拦截系统BroadcastReceiver的相关文章

android如何使用BroadcastReceiver后台实现来电通话记录的监听

android如何使用BroadcastReceiver后台实现来电通话记录的监听并存取到sqllite数据库通过Contentprovilder实现接口 BroadcastReceiver 是android四大组件的一个,本质上是一种全局的监听器 ,用于监听全局的广播消息.下面实现了后台监听android手机通话记录.本demo 分两个程序,第一个程序是设置监听器,然后模拟器重启后就会有一个全局的 service在后台监听你的来电显示,大多数通话管理软件都是这么干的,第二个项 目是获取通话记录

Android开发之BroadcastReceiver用法实例分析

  本文实例讲述了Android开发中BroadcastReceiver用法.分享给大家供大家参考.具体分析如下: 在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制. Braodcast Receiver顾名思义就是广播接收器,它和事件处理机制类似,但是事件处理机制是程序组件级别的(比如:按钮的单击事件),而广播事件处理机制是系统级别的.我们可以用Intent来启动一个组件,也可以用sendBroadcast()方法发起一个系统级别的事件广播来传递

Android提高之BroadcastReceiver实例详解_Android

前面几篇文章分别讨论了Activity和Service,本文就来讨论BroastcastReceiver,Broastcast是应用程序间通信的手段.BroastcastReceiver也是跟Intent紧密相连的,动态/静态注册了BroastcastReceiver之后,使用sendBroadcast把Intent发送之后,系统会自动把符合条件的BroastcastReceiver启动,这和嵌入式系统的中断类似. 本文所示实例代码主要演示了如何静态/动态注册BroastcastReceiver

解析Android获取系统cpu信息,内存,版本,电量等信息的方法详解_Android

Android获取系统cpu信息,内存,版本,电量等信息 1.CPU频率,CPU信息:/proc/cpuinfo和/proc/stat 通过读取文件/proc/cpuinfo系统CPU的类型等多种信息.读取/proc/stat 所有CPU活动的信息来计算CPU使用率 下面我们就来讲讲如何通过代码来获取CPU频率: 复制代码 代码如下: package com.orange.cpu; import java.io.BufferedReader;import java.io.FileNotFound

Android开发之BroadcastReceiver用法实例分析_Android

本文实例讲述了Android开发中BroadcastReceiver用法.分享给大家供大家参考.具体分析如下: 在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制. Braodcast Receiver顾名思义就是广播接收器,它和事件处理机制类似,但是事件处理机制是程序组件级别的(比如:按钮的单击事件),而广播事件处理机制是系统级别的.我们可以用Intent来启动一个组件,也可以用sendBroadcast()方法发起一个系统级别的事件广播来传递消息

Android提高之BroadcastReceiver实例详解

前面几篇文章分别讨论了Activity和Service,本文就来讨论BroastcastReceiver,Broastcast是应用程序间通信的手段.BroastcastReceiver也是跟Intent紧密相连的,动态/静态注册了BroastcastReceiver之后,使用sendBroadcast把Intent发送之后,系统会自动把符合条件的BroastcastReceiver启动,这和嵌入式系统的中断类似. 本文所示实例代码主要演示了如何静态/动态注册BroastcastReceiver

突破一流信息监控拦截系统进行SQL注射

监控 by lake2 (http://lake2.0x54.org)上回渗透一站点,SQL Injection测试时返回这个页面(图1) 我晕,原来服务器上装了一个叫"一流信息监控拦截系统"的BT玩意儿,扫兴!查查它老底先. Google一下"一流信息监控拦截系统".原来这是广州××信息科技公司开发的内容监控系统,用来监控拦截非法信息的,当然也包括SQL注射.它主页上软件功能介绍赫然写着:"软件可以全面拦截任何的SQL注入式的攻击,就算多差的程序都不用担

理解Android Build系统

前言 Android Build 系统是 Android 源码的一部分.关于如何获取 Android 源码,请参照 Android Source 官方网站: http://source.android.com/source/downloading.html. Android Build 系统用来编译 Android 系统,Android SDK 以及相关文档.该系统主要由 Make 文 件,Shell 脚本以及 Python 脚本组成,其中最主要的是 Make 文件. 众所周知,Android

Android GUI系统之SurfaceFlinger(1)OpenGLES与EGL

第1章  GUI系统之SurfaceFlinger 在进入GUI系统的学习前,建议大家可以先阅读本书应用篇中的"OpenGLES"章节,并参阅OpenGL ES官方指南.因为Android的GUI系统是基于OpenGL/EGL来实现的,如果没有一定基础的话,分析源码时有可能会"事倍功半". 1.1 OpenGLES与EGL SurfaceFlinger虽然是GUI的核心,但相对于OpenGL ES来讲,它其实只是一个"应用". 对于没有做过Ope