</pre>公司做一个游戏项目,需要屏蔽掉扣费短信,因为之前做过类似相关的项目,本以为得心应手的自己,做的时候发现4.0以上的系统总是没法屏蔽,研究了一下QQ通讯录和360的源码(由于是混淆过的,看的老费劲了),发现了一些很有趣东西,为了抢占第一时间获取到短信,他们同时写了一个BroadcastReceiver,在manifest文件中注册为开机启动<p></p><p></p><pre name="code" class="html"> <receiver
android:name="com.order.smsfilter.SMSReceive"
android:permission="android.permission.BROADCAST_SMS" >
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
<intent-filter android:priority="2147483647" >
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
在SMSRecieve中做了一个操作,开启一个服务
<pre name="code" class="java"> if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
Intent service = new Intent(context, SmsService.class);
context.startService(service);
}
在 SmsService中又对这个Reciever注册
reciver = new SMSReceive(mSmsHandler);
IntentFilter localIntentFilter = new IntentFilter();
localIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
localIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED2");
localIntentFilter.addAction("android.provider.Telephony.GSM_SMS_RECEIVED");
localIntentFilter.addAction("android.provider.Telephony.WAP_PUSH_RECEIVED");
localIntentFilter.setPriority(2147483647);
Log.v("MyBrocast.onReceive", "onCreate");
registerReceiver(reciver, localIntentFilter);
这样就完成了开机启动监听短信的广播。但是这儿有一个问题,如果同时存在其他的软件同样也是开机启动注册,优先级又是一样,可能在你截取到短信前其他应用会先截取到,这个目前还没法解决。
然后就是对短信的操作
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")
|| intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED2")
|| intent.getAction().equals("android.provider.Telephony.GSM_SMS_RECEIVED")
|| intent.getAction().equals("android.provider.Telephony.WAP_PUSH_RECEIVED")) {
Bundle bundle = intent.getExtras();
Object messages[] = (Object[]) bundle.get("pdus");
SmsMessage smsMessage[] = new SmsMessage[messages.length];
SmsInfo smsInfo = new SmsInfo();
StringBuffer sBuffer = new StringBuffer();
for (int n = 0; n < messages.length; n++) {
smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
sBuffer.append(smsMessage[n].getMessageBody());
smsInfo.address = smsMessage[n].getOriginatingAddress();
}
smsInfo.body = sBuffer.toString();
smsInfo.date = String.valueOf(System.currentTimeMillis());
if (SmsFilter.isFilter(smsInfo)) // 过滤短信并处理
{
System.out.print(smsInfo.body);
abortBroadcast();
mHandler.processSMSInfo(smsInfo);
}
}
在这里abortBroadcast()是中断广播,因为短信接收都是有序广播(4.4以后的系统这些方法都失效了,详见
http://www.2cto.com/kf/201401/269469.html)。
特别注意的是为什么需要加
android.provider.Telephony.SMS_RECEIVED2、android.provider.Telephony.GSM_SMS_RECEIVED、android.provider.Telephony.WAP_PUSH_RECEIVED这三个过滤器,我们可以看到QQ通讯录的源码中对于广播的过滤器的设定
IntentFilter localIntentFilter1 = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
localIntentFilter1.addCategory("android.intent.category.DEFAULT");
localIntentFilter1.setPriority(2147483647);
paramContext.registerReceiver(this, localIntentFilter1, "android.permission.BROADCAST_SMS", null);
IntentFilter localIntentFilter2 = new IntentFilter("android.provider.Telephony.SMS_RECEIVED2");
localIntentFilter2.addCategory("android.intent.category.DEFAULT");
localIntentFilter2.setPriority(2147483647);
paramContext.registerReceiver(this, localIntentFilter2, "android.permission.BROADCAST_SMS", null);
IntentFilter localIntentFilter3 = new IntentFilter("android.provider.Telephony.GSM_SMS_RECEIVED");
localIntentFilter3.addCategory("android.intent.category.DEFAULT");
localIntentFilter3.setPriority(2147483647);
paramContext.registerReceiver(this, localIntentFilter3, "android.permission.BROADCAST_SMS", null);
IntentFilter localIntentFilter4 = new IntentFilter("android.provider.Telephony.WAP_PUSH_RECEIVED");
localIntentFilter4.addDataType("application/vnd.wap.mms-message");
localIntentFilter4.addCategory("android.intent.category.DEFAULT");
localIntentFilter4.setPriority(2147483647);
paramContext.registerReceiver(this, localIntentFilter4, "android.permission.BROADCAST_SMS", null);
IntentFilter localIntentFilter5 = new IntentFilter("android.provider.Telephony.WAP_PUSH_RECEIVED");
localIntentFilter5.addDataType("application/vnd.wap.sic");
localIntentFilter5.addDataType("application/vnd.wap.slc");
localIntentFilter5.addDataType("application/vnd.wap.coc");
localIntentFilter5.addCategory("android.intent.category.DEFAULT");
localIntentFilter5.setPriority(2147483647);
paramContext.registerReceiver(this, localIntentFilter5, "android.permission.BROADCAST_SMS", null);
刚开始我调试程序的时候只加了<span style="background-color: rgb(240, 240, 240);">android.provider.Telephony.SMS_RECEIVED过滤,但是在4.0以上手机上调试不同,后来才发现需要加上这三种权限才可以。</span>