现在的位置: 首页 > 综合 > 正文

Android广播机制—拦截接收短信

2014年03月27日 ⁄ 综合 ⁄ 共 1454字 ⁄ 字号 评论关闭

做了个例题。 这个例题拦截了短信内容。 先来看下功能。

   

 

我们先给自己的虚拟机发送一条短信。  内容是  I love you ...

然后看下我们的虚拟机。 收到了短信

注意: 左上角那个Notification没有收到短信的内容, 我们用一个Toast输出了这个短信的信息。 拦截掉了

来看一下代码:

首先这个例子没有Activity。 之后一个 SmsReceiver . 专门接收短信的Receiver

public class SmsReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		//如果是系统短信Action...
		if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
			//..不再往下传播 
			this.abortBroadcast();
			StringBuffer sb = new StringBuffer();
			Bundle bundle = intent.getExtras();
			if(bundle != null) {
				//通过pdus可以获得接收到的所有短信消息
				Object[] pdus = (Object[])bundle.get("pdus");
				//构建短信对象数组
				SmsMessage[] msgs = new SmsMessage[pdus.length];
				for(int i = 0; i < pdus.length; i ++) {
					msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
				}
				for(SmsMessage msg : msgs) {
					sb.append("短信来自: " + msg.getDisplayOriginatingAddress());
					sb.append("内容: " + msg.getMessageBody());
				}
			
			Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();}
		}
		
		
	}
	
}

只有一个重点。

this.abortBroadcast(); 我们让这个广播机制不再传播下去。 

这是因为短信收到由系统发出广播。 我们的SmsReceiver收到了这个广播。 因为我们在Manifest中配置了。代码如下

<receiver android:name=".SmsReceiver">
    		<intent-filter android:priority="800">
    			<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    		</intent-filter>
    	</receiver>

由于这个短信广播是  一个 有序广播  Ordered Broadcast  。

这个有序广播。会先发送给优先级最高的那个Receiver。 而我们的这个SmsReceiver中的优先级为800 

<intent-filter android:priority="800">

优先级的大小范围为 -1000 到 1000。  我们这个优先级比收到短信的那个软件优先级高。所以我们的SmsReceiver接收到了。 也不再往下传播了。

打印出来了。。

还有一点。 接收短信需要权限。 在Mainfest中配置

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

OK啦。

抱歉!评论已关闭.