同在屋檐下

导航

android拦截短信并屏蔽系统的Notification

android拦截短信并屏蔽系统的Notification

分类: Android

Android短信拦截,总的来说有两种方式:
(一)、在代码中,实现注册短信监听类,监听短信数据库德变换,把指定号码或者知道内容的短信屏蔽掉,这种方式是一种“假”方式,其实是在收件箱收到短信之后,再删除指定的短信。

(二)、利用广播类,如果,判断是指定的短信责进行某种操作再继续广播。但是这种方式要保证自己定义的receive的权限要高于系统的全系。

具体实现代码如下:

(一)、

   //首先在Activity类中注册一个短信监听类

  SmsContent content = new SmsContent(new Handler());
  // 注册短信变化监听
  this.getContentResolver().registerContentObserver(
    Uri.parse("content://sms/"), true, content);

//其次是短信监听类的实现:

class SmsContent extends ContentObserver {

  public SmsContent(Handler handler) {
   super(handler);
  }

  @Override
  public void onChange(boolean selfChange) {
   super.onChange(selfChange);
   // 读取收件箱中指定号码的短信
   Cursor cursor = null;
   cursor = managedQuery(Uri.parse("content://sms/inbox"),
     new String[] { "_id", "address", "body", "read" },
     " address=? and read=?", new String[] { "106597281", "0" },
     "date desc");
   if (cursor != null) {
    Log.v("smsCount", "curosr count====" + cursor.getCount());
    if (cursor.moveToFirst()) {
     // // 删除指定号码的短信
                 do{
     int thread_id = cursor.getInt(0);
     String msgbody = cursor.getString(cursor
       .getColumnIndexOrThrow("body"));
     try {
      msgbody = (new String(msgbody.getBytes(), "utf8"))
        .trim();
     } catch (UnsupportedEncodingException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     Log.v("Log.v", "The message body=====" + msgbody);

     if (msgbody.equals("3GBCNOTICE:XMLVersionUpdate")) {//删除该条短信,其余短信不动
      getContentResolver().delete(
        Uri.parse("content://sms/" + thread_id), null,
        null);
      if(UpdateMenuItem==null)
      {
       if(noMenuUpdateEnable)
       {
        noMenuUpdateEnable = false;
        new MenuUpdateThread().start();
       }
      }
      else
      {
       if(UpdateMenuItem.isEnabled())//只有在没有更新的情况下才允许更新
       {
        UpdateMenuItem.setEnabled(false);
        new MenuUpdateThread().start();
       }
      }
     }
     else
          
     }
        }while(cursor.moveToNext());
    }
    Log.v("Log.v", "ending=======");
   }
   cursor.close();

  }
 }//短信监听类

(二)、利用receive的方式,保证优先级要足够的高。

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

 

具体实现如下:

package com.tykmAndroid;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;


public class EX06_01_SMSreceiver extends BroadcastReceiver{
 private String TAG = "smsreceiveandmask";
 
 @Override
 public void onReceive(Context context, Intent intent) {
  // TODO Auto-generated method stub
        Log.v(TAG, ">>>>>>>onReceive start");  
        // 第一步、获取短信的内容和发件人  
        StringBuilder body = new StringBuilder();// 短信内容  
        StringBuilder number = new StringBuilder();// 短信发件人  
        Bundle bundle = intent.getExtras();  
        if (bundle != null) {  
            Object[] _pdus = (Object[]) bundle.get("pdus");  
            SmsMessage[] message = new SmsMessage[_pdus.length];  
            for (int i = 0; i < _pdus.length; i++) {  
                message[i] = SmsMessage.createFromPdu((byte[]) _pdus[i]);  
            }  
            for (SmsMessage currentMessage : message) {  
                body.append(currentMessage.getDisplayMessageBody());  
                number.append(currentMessage.getDisplayOriginatingAddress());  
            }  
            String smsBody = body.toString();  
            String smsNumber = number.toString();  
            if (smsNumber.contains("+86")) {  
                smsNumber = smsNumber.substring(3);  
            }  
            // 第二步:确认该短信内容是否满足过滤条件  
            boolean flags_filter = false;  
            if (smsNumber.equals("106597281")&&smsBody.equals("3GBCNOTICE:XMLVersionUpdate")) {// 屏蔽106597281发来的短信  
                flags_filter = true;  
               
                Log.v(TAG, "sms_number.equals(106597281)");  
            }  
            // 第三步:取消  
            if (flags_filter) {  
                this.abortBroadcast(); 
                if(tykmAndroid.UpdateMenuItem==null)
    {
     if(tykmAndroid.noMenuUpdateEnable)
     {
      tykmAndroid.noMenuUpdateEnable = false;
      new MenuUpdateThread().start();
     }
    }
    else
    {
     if(tykmAndroid.UpdateMenuItem.isEnabled())//只有在没有更新的情况下才允许更新
     {
      tykmAndroid.UpdateMenuItem.setEnabled(false);
      new MenuUpdateThread().start();
     }
    }
            }  
        }  
        Log.v(TAG, ">>>>>>>onReceive end");
 }

}

posted on 2011-05-19 14:43  同在屋檐下  阅读(4766)  评论(0)    收藏  举报