以前刚开始接触android时对诸如短信拦截之类的功能很感兴趣,网上很多文章都介绍了使用广播接收android.provider.Telephony.SMS_RECEIVED的动作,从而接收到SMS信息,不过当时也不知道怎么样把这个广播删掉,从而实现一个类似短信黑名单的功能。后来在网上看到可以使用abortBroadcast来屏蔽广播,我测试了一下,可行。
先上源码:
AndroidManifest.xml的代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.study.sms"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name=".smsReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.RECEIVE_SMS">
</uses-permission>
</manifest>
smsReceiver的代码:
package com.study.sms;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class smsReceiver extends BroadcastReceiver {
public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (SMS_RECEIVED_ACTION.equals(action)){
Bundle bundle = intent.getExtras();
if (bundle != null){
Object[] pdus = (Object[])bundle.get("pdus");
for (Object pdu : pdus){
SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu);
String sender = message.getOriginatingAddress();
if ("5556".equals(sender)){
//屏蔽手机号为5556的短信,这里还可以时行一些处理,如把这个信息发送到第三人的手机等等。
abortBroadcast();
}
}
}
}
}
}
测试的效果图:
使用5556给5554发送短信,5554无法收到。同时再起一个5558的avd给5554发送短信,一切正常。
之所以这个程序能实现屏蔽系统短信的功能,是因为广播有两种不同的类型:普通广播(normal broadcasts)和有序广播(ordered broadcasts)。普通广播是完全异步的,可以被所有的接收者接收到,并且接收者无法终止广播的传播。然而有序广播是按照接收者声明的优先级别,被接收者依次接收到。优先级别声明在 intent-filter 元素的 android:priority 属性中,数越大优先级别越高,取值范围:-1000到1000,优先级别也可以调用IntentFilter对象的setPriority()进行设置。有序广播的接收者可以终止广播Intent的传播,广播Intent的传播一旦终止,后面的接收者就无法接收到广播。上面的实例就是将smsReceiver的优先级设为1000。
Context.sendBroadcast()
发送的是普通广播,所有订阅者都有机会获得并进行处理。
Context.sendOrderedBroadcast()
发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者。
我查看了一下系统发送android.provider.Telephony.SMS_RECEIVED广播的源码SMSDispatcher.java(frameworks\base\telephony\java\com\android\internal\telephony),证实其发送的是有序广播。
protected void dispatchPdus(byte[][] pdus) {
Intent intent = new Intent(Intents.SMS_RECEIVED_ACTION);
intent.putExtra("pdus", pdus);
dispatch(intent, "android.permission.RECEIVE_SMS");
}
- 相关文章
- 在Android上使用ZXing识别条码/二维码 (95人浏览)
- 开发 Standalone Android Java 应用程序 (53人浏览)
- android中activity的四种加载模式 (59人浏览)
- Android开发之ListView页眉页脚效果VS android背景渐变 (95人浏览)
- Android学习笔记-关于ListActivity的简单体验 (41人浏览)
- Android TabHost的使用【转】 (109人浏览)
- android Service教程 (69人浏览)
- 1楼 cartier replica watches for ladies 发表于 2015-3-30 19:22:26
- Il gatto non va sulla tastiera perché non ha dove stare, il gatto va sulla tastiera perché “oh tu come osi usare le tue mani per altro che non sia deliziarmi ?”. cartier replica watches for ladies http://www.001910.com/bbs/forum.php?mod=viewthread&tid=864330&fromuid=112912