首页 > 系统 > Android > 正文

38.android广播-短信防火墙

2019-11-09 15:29:16
字体:
来源:转载
供稿:网友

原理:

1.收到短信的时候,会启动短信的广播,短信广播里面包含短信的号码和内容,拿到短信的广播,检测短信里面包含的内容是不是黑名单的内容,本质就是广播接收者.

2.系统发送短信广播的时候,是怎么存的就怎么样取出来,如果短信过长,那么会拆分成多条短信发送,那么发送的短信广播中会有多条短信。

3.android4.0以后,广播接收者所在的进程从来没有被启动过,那么广播接收者是不会生效的,即使广播接收者所在的进程被关闭,还是会生效(仅限系统关闭,如果被用户或者因为内存原因是不会被启动,手动关闭是指在应用管理器里面for stop来关闭).android4.0之前,如果是系统关闭广播接收者所在进程,当系统发出的广播中的action跟该广播接收者的action匹配的时候,系统会启动该广播接收者所在的进程,并把广播发给该广播接收者所在的进程,但是如果用户手动关闭该进程,该进程进入冻结状态再也不会被启动,直到用户下一次手动启动该进程。

关键代码:

(1)Object[] pdus = (Object[])intent.getExtras().get("pdus");获得短信数据(2)byte[] pdu = (byte[])pdus[0];(3)SmsMessage message  = SmsMessage.createFromPdu(pdu);将字节数组封装为SmsMessage(4)String content = message.getMessageBody();获得短信内容(5)String date = new Date(message.getTimestampMillis()).toLocaleString();获得短信时间(6)String senderNumber = message.getOriginatingAddress();获得发送方号码(7)abortBroadcast(); //阻止其他的广播接收者收到广播,广播终止

权限配置:

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

清单文件配置:

        <receiver android:mame="com.ldw.smslanjie.smsReceiver">            <intent-filter android:PRiority="1000">  //设置优先级                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>            </intent-filter>        </receiver>

短信防火墙代码:

smsReceiver.java

package com.ldw.smslanjie;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsManager;import android.telephony.SmsMessage;public class smsReceiver extends BroadcastReceiver {	@Override	public void onReceive(Context context, Intent intent) {		// TODO Auto-generated method stub		//拿到短信的信息		//短信的内容封装在intent中		Bundle bundle = intent.getExtras();		//以pdus为键去除一个object数组,数组中的每一个元素,都是一个短信		Object[] objects = (Object[]) bundle.get("pdus");		//获取广播中的短信内容		for(Object object : objects){			//通过pdu构造短信			SmsMessage sms = SmsMessage.createFromPdu((byte[]) object);			if(sms.getOriginatingAddress().equals("21312")){				//阻止其他的广播接收者收到广播,广播终止				abortBroadcast(); 				//发送一条默认的信息				SmsManager.getDefault().sendTextMessage(sms.getOriginatingAddress(), null, "再见", null, null);			}			System.out.println(sms.getOriginatingAddress());			System.out.println(sms.getMessageBody());		}	}}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表