Android拦截短信并通知栏提醒

gongzhiyao0 2012-12-30

实现Android拦截短信并通知栏提醒。

SMSReceiver.java

public class SMSReceiver extends BroadcastReceiver{
 
 public static int TEST_ID = 1;

 @Override
 public void onReceive(Context context, Intent intent) {
  // TODO Auto-generated method stub
  System.out.println("SMSReceiver, isOrderdeBroadcast()="+isOrderedBroadcast());
 
  Bundle bundle = intent.getExtras();
  Object messages[] = (Object[]) bundle.get("pdus");
  if (messages!=null && messages.length>0) {
   SmsMessage smsMessage[] = new SmsMessage[messages.length];
   for (int n = 0; n < smsMessage.length; n++) {
    smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
   }
   for (SmsMessage message : smsMessage) {
    String content = message.getMessageBody();//得到短信内容
    String sender = message.getOriginatingAddress();//得到发件人号码
    if (sender.equals("10086") && content.contains("000")) {
     this.abortBroadcast();
     System.out.println(sender+"已拦截,信息内容为:"+ content);
     
     NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
     Notification mNotification = new Notification(R.drawable.ic_launcher, "new message", System.currentTimeMillis());
     mNotification.flags = mNotification.FLAG_AUTO_CANCEL | mNotification.FALG_NO_CLEAR;//设置图标自动清除或不可清除 
     //绑定itent,点击图标时能够进入某activity
     Intent mIntent = new Intent(context,SMSIntercept.class);
     PendingIntent mPendingIntent = PendingIntent.getActivity(context, 0, mIntent, android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
     CharSequence contentTitle = "提醒标题";
     CharSequence contentText = "你有新消息提醒。";
     mNotification.setLatestEventInfo(context, contentTitle, contentText, mPendingIntent);
     //发送通知
     mNotificationManager.notify(TEST_ID, mNotification);//TEST_ID在清除通知栏图标的时候要用到。
    }
   }
  }
 }
}

清除通知栏图标:

NotificationManager mNotificationManager = (NotificationManager)this.getSystemService(NOTIFICATION_SERVICE);
        mNotificationManager.cancel(SMSReceiver.TEST_ID);

从上面可以看出,他是一个OrderedBroadcast,根据这一点我们可以对短信机制进行拦截。

AndroidManifest.xml文件中配置receiver:

注意其优先级是10000,设置为最大,因为OrderedBroadcast是根据优先级来传递消息的,优先级越高越先获取到消息。

<receiver android:name = ".SMSReceiver">
            <intent-filter android:priority="10000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>

此外还要在AndroidManifest.xml文件中加入短信权限:

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