展会信息港展会大全

Android拦截系统BroadcastReceiver拦截Broadcast
来源:互联网   发布日期:2016-01-19 12:09:50   浏览:3634次  

导读:系统中的广播 在Android系统中,内置了很多Action产量,在触发这些Action的时候,均会发布相应的Broadcast。一般而言,查看 Android的API文档中,关于Intent的说明即可找到对应Action的Broadcast,但是列举的 ...

系统中的广播

在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//在真机上不存在乱码的问题

15private final String[] blackKeyWord = new String[] { "baoxian", "chuxiao",

16"jiangjia" };

17

18@Override

19public void onReceive(Context context, Intent intent) {

20// 判断当前接收到的Broadcast是否是收到短信的action

21if (intent.getAction()

22.equals("android.provider.Telephony.SMS_RECEIVED")) {

23StringBuilder sb = new StringBuilder();

24// 获取Broadcast传递的数据

25Bundle bundle = intent.getExtras();

26if (bundle != null) {

27Object[] pdus = (Object[]) bundle.get("pdus");

28for (Object p : pdus) {

29byte[] pud = (byte[]) p;

30// 声明一个SmsMessage,用于解析短信的byte[]数组

31SmsMessage message = SmsMessage.createFromPdu(pud);

32boolean flag = false;

33for (String str : blackKeyWord) {

34if (message.getMessageBody().contains(str) ) {

35// 发现黑名单关键字,则标记为true

36flag = true;

37break;

38}

39}

40if (flag) {

41sb.append("发件人:n");

42sb.append(message.getOriginatingAddress());

43sb.append("n发送时间:n");

44Date date = new Date(message.getTimestampMillis());

45SimpleDateFormat format = new SimpleDateFormat(

46"yyyy-MM-dd HH:mm:ss");

47sb.append(format.format(date));

48sb.append("n短信内容:n");

49sb.append(message.getMessageBody());

50

51Toast.makeText(context, sb.toString(),

52Toast.LENGTH_SHORT).show();

53// 如果存在黑名单关键字内容,停止Broadcast传播

54abortBroadcast();

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 {

8private final String STARTS="17951";

9@Override

10public void onReceive(Context context, Intent intent) {

11// 获取当前拨号的号码

12String number=getResultData();

13// 此号码没有被加IP拨号的前缀

14if(!number.startsWith(STARTS)){

15// 设置加了IP号码的号码

16String newnumber=STARTS+number;

17// 把新号码增加到返回结果数据中,用于传递给后面的Receiver

18setResultData(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>

效果展示:

赞助本站

人工智能实验室
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港