安卓学习笔记——关于短信的屏蔽

</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>

     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值