关于拦截短信被其他软件如360先拦…

来源:互联网 发布:主流软件开发语言 编辑:程序博客网 时间:2024/05/24 04:04

http://www.eoeandroid.com/thread-196130-1-1.html

其实我在公司坐过这样的一个项目,就是需要登录短信验证,而领导想要做得炫一点,就是能够拦截短信然后自动填充到输入框,其实这一点对各位大侠来说,简直就soeasy!当然对于我来说更是小菜啦。但是大家有可能会出现这样的情况,就是如果大家先装了360这样的软件或者其他什么通讯录的话。那么你的短信拦截将有可能失效,为什么呢。因为如果有其他应用比你先装或者先发、注册广播的话,那么你将永远拦截不到,因为是有优先级的,系统提供个什么优先级设置的      filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);//设置优先级最大,根本就没什么鬼用的。呵呵。废话不说,说说我的思路把,当然啦,监听短信还是要有的,首先我们当然得注册个广播来监听短信。一有短信来了,我们就可以拦截和截取我们想要的短信内容。第二,我们可以用观察者模式来观察系统本身短信数据库的变化,一有新短信就会往数据库里面插入,当然android给我们提供了个内容提供者可操作短信的数据库。,如果有新短信的话,就会通知到观察者。这个类就可以查询到最新插入的一条未读状态的短信(条件可以自己加)。然后再截取短信内容,再返回到输入框,所以,这两个方法一般可对付那些软件了,我测试了下,基本可行,好,说了一堆前沿,开始上代码。然后把个主要的类上传。知识是要大家共享的




import java.text.SimpleDateFormat;
import java.util.Date;

import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.telephony.SmsMessage;
import android.util.Log;

public class SMSCodeBroadcast extends BroadcastReceiver {
       privateAfterReceive afterReceive;
       private  SmsContentObserversmsContentObserver;
       private  intindex = 0;
       privateContext context;

//如果读取成功的话就调用回调函数,同时取消观察者模式
    private Handler handler = newHandler(){
         @Override
          public voidhandleMessage(Message msg) {
               StringsmsContent = (String)msg.obj;
               index =index+1;
               if(index==1){
                    if(smsContent!=null&&!"尊敬的用户,您本次登录终端XXXX的验证码为:323250,20分钟内有效。请尽快验证!".equals(smsContent)){
                         afterReceive.autoFill(smsContent.substring(smsContent.indexOf(":")+1,smsContent.lastIndexOf(",")));
                          //this.abortBroadcast();
                          context.getContentResolver().unregisterContentObserver(smsContentObserver);
                    }else{
                          index=0;
                     }
                    
               }
               super.handleMessage(msg);
          }
    };
       
    publicSMSCodeBroadcast(){
          
    }
       publicSMSCodeBroadcast(Context context,AfterReceive afterReceive) {
            this.afterReceive = afterReceive;
            this.smsContentObserver = new SmsContentObserver(context, newHandler());
            this.context = context;

//注册观察者。观察短信数据库变化
            context.getContentResolver().registerContentObserver(
              Uri.parse("content://sms/"), true, smsContentObserver);
            
            
       }

//广播的回调函数,读取到短信内容将返回到我们要显示的输入框中
       publicinterface AfterReceive {
             voidautoFill(String code);
       }
       

       @Override
       public voidonReceive(Context context, Intent intent) {
             // TODOAuto-generated method stub
             Bundlebundle = intent.getExtras();
            
             Objectmessages[] = (Object[]) bundle.get("pdus");
             SmsMessagesmsMessage[] = new SmsMessage[messages.length];

//这里面主要是截取我们想要的短信内容,
             for (int n= 0; n < messages.length; n++) {
                 smsMessage[n] = SmsMessage.createFromPdu((byte[])messages[n]);
                  Stringsender = smsMessage[n].getOriginatingAddress();
                  if((sender.equals("106575550014")||sender.equals("106573400007"))&&smsMessage[n].getMessageBody().contains("ESOP")){
                       StringsmsContent = smsMessage[n].getMessageBody();
                       Messagemessage = new Message();
                       message.obj =smsContent;
                       handler.sendMessage(message);
                       
                       
                  }
                 System.out.println(smsMessage[n].getMessageBody());
             }
       }

//观察者
        public classSmsContentObserver extends ContentObserver {

          privateContext context;
          publicSmsContentObserver(Context context,Handler handler) {
               
            super(handler);
            this.context  =context;
          }
          
         @Override
          public voidonChange(boolean selfChange) {
            super.onChange(selfChange);
             //读取收件箱中指定号码的短信
            
               
               Messagemessage = new Message();
                  message.obj= getSmsInPhone();
                 handler.sendMessage(message);
               
             }
          

//获取短信中最新的一条未读短信,大家可以去查查,一些字段
          publicString getSmsInPhone()   
           
             finalString SMS_URI_ALL   ="content://sms/";    
             finalString SMS_URI_INBOX = "content://sms/inbox";  
             finalString SMS_URI_SEND  ="content://sms/sent";   
             finalString SMS_URI_DRAFT = "content://sms/draft";  
              
            StringBuilder smsBuilder = new StringBuilder();  
              
            try{   
               ContentResolvercr = context.getContentResolver();  
               String[]projection = new String[]{"_id", "address","person",   
                     "body","date", "type"};   
               Uri uri =Uri.parse(SMS_URI_ALL);   
               Cursor cur =cr.query(uri, projection, "read = ?", new String[]{"0"}, "datedesc");   
           
               if(cur.moveToFirst()) {   
                  Stringname;   
                  StringphoneNumber;        
                  Stringsmsbody;   
                  Stringdate;   
                  Stringtype;   
                  
                  intnameColumn = cur.getColumnIndex("person");  
                  intphoneNumberColumn =cur.getColumnIndex("address");  
                  intsmsbodyColumn = cur.getColumnIndex("body");  
                  intdateColumn = cur.getColumnIndex("date");  
                  inttypeColumn = cur.getColumnIndex("type");  
                  
                 do{   
                     name =cur.getString(nameColumn);           
                     phoneNumber= cur.getString(phoneNumberColumn);  
                     smsbody =cur.getString(smsbodyColumn);  
                      
                    SimpleDateFormat dateFormat = newSimpleDateFormat(   
                          "yyyy-MM-ddhh:mm:ss");   
                     Date d =newDate(Long.parseLong(cur.getString(dateColumn)));  
                     date =dateFormat.format(d);   
                      
                     int typeId= cur.getInt(typeColumn);  
                     if(typeId== 1){   
                       type ="接收";   
                     } elseif(typeId == 2){   
                       type ="发送";   
                     } else{   
                       type ="";   
                      
                    smsBuilder.append(smsbody);  
                    
                     if(smsbody== null) smsbody = "";    
                    break;
                 }while(cur.moveToNext());  
               } else{   
                 smsBuilder.append("noresult!");   
                
                  
             }catch(SQLiteException ex) {  
               Log.d("SQLiteExceptionin getSmsInPhone", ex.getMessage());  
              
             returnsmsBuilder.toString();   
          }
        
       }
}


在我们想要显示的Activity中
       
       private voidregisterSMSReceiver() {
            IntentFilter filter = newIntentFilter("android.provider.Telephony.SMS_RECEIVED");
            filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);//设置优先级最大
             mReceiver =new SMSCodeBroadcast(this,new AfterReceive() {
                  
                 @Override
                  public voidautoFill(String code) {
                       // TODOAuto-generated method stub
                       unRegisterSMSReceiver();
                       mSmsCodeEt.setText(code);  //输入框
                       mGetSMSCode=true;
                  }
             });
            registerReceiver(mReceiver, filter);
            
       }
       
       
       private voidunRegisterSMSReceiver() {
             if(mReceiver != null) {
                  IntentFilterfilter = newIntentFilter("android.provider.Telephony.SMS_RECEIVED");
                 filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);//设置优先级最大
                 registerReceiver(mReceiver,filter);  //PS。有可能短信会延迟,然后点多几次下发短信时候,
当已经有短信后,会注销掉广播,但是同时的短信下发会产生注销多次。会出现unregisterReceiver(mReceiver)这个地方报错,所以重新注册,再注销。还希望高手能够简化
                 unregisterReceiver(mReceiver);
             }
       }

当然啦,配置文件也要加响应的权限如读取短信<uses-permissionandroid:name="android.permission.READ_SMS"/>

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

等等,大概就这样,希望对大家有用哈,有什么不明白可以留言,我会尽可能帮大家解决

0 0
原创粉丝点击