Andorid自動讀取短信驗證碼

手機收到驗證碼短信後,程序自動識別驗證碼並填充驗證碼輸入框。android

思路是有了,實現的方式也有多種:數據庫

一、開啓一個線程,隔一段時間就去查詢收件箱是否有變化,有變化再讀取出來作處理。ide

二、註冊一個短信變化的廣播,收到廣播後再去讀取出來作處理。this

三、經過ContentObserver(內容觀察者)來捕獲特定Uri的變化。spa

方案1,顯然不能夠取,太耗資源。線程

方案2,實際應用起來是會有問題的,由於短信的廣播是有序廣播,假若有其餘應用先捕獲廣播並終止傳遞,那麼咱們就永遠也收不到這條短信變化的廣播了。code

因此,綜合比較起來,方案3比較可取。通過筆者實踐也是沒有問題的。server

先來點介紹性文字吧。blog

「ContentObserver——內容觀察者,目的是觀察(捕捉)特定Uri引發的數據庫的變化,繼而作一些相應的處理,它相似於數據庫技術中的觸發器(Trigger),當ContentObserver所觀察的Uri發生變化時,便會觸發它。觸發器分爲表觸發器、行觸發器,相應地ContentObserver也分爲「表「ContentObserver、「行」ContentObserver,固然這是與它所監聽的Uri MIME Type有關的。」資源

下面給出方案3的關鍵性代碼:

 

 1 public class SmsObserver extends ContentObserver{  2 
 3     private Context mContext;  4     private Handler mHandler;  5     
 6     public SmsObserver(Context context,Handler handler) {  7         super(handler);  8         this.mContext = context;  9         this.mHandler = handler; 10  } 11     
12  @Override 13     public void onChange(boolean selfChange) { 14         super.onChange(selfChange); 15         
16         String code = ""; 17         
18         Uri inBoxUri = Uri.parse("content://sms/inbox"); 19         Cursor c = mContext.getContentResolver().query(inBoxUri,null,null,null,"date desc"); 20         
21         if(c != null){ 22             if(c.moveToFirst()){ 23                 String address = c.getString(c.getColumnIndex("address")); 24                 String body = c.getString(c.getColumnIndex("body")); 25                 Log.i("TAG","發件人爲: " + address + "\n" + "短信內容: " + body); 26                 
27                 //這裏能夠寫某個電話 28 // if(!address.equals("+8615210091283")){ 29 // return; 30 // }
31                 
32                 Pattern pattern = Pattern.compile("\\d{6}"); 33                 Matcher matcher = pattern.matcher(body); 34                 
35                 if(matcher.find()){ 36                     code = matcher.group(0); 37  mHandler.obtainMessage(MainActivity.MSG_RECEIVED_CODE,code).sendToTarget(); 38  } 39  } 40  c.close(); 41  } 42  } 43 }

 

 1 public class MainActivity extends Activity {  2 
 3     private SmsObserver mObserver;  4     private EditText mEtReceive;  5     public static final int MSG_RECEIVED_CODE = 1;  6     
 7     private Handler mHandler = new Handler(){  8         public void handleMessage(android.os.Message msg) {  9             if(msg.what == MSG_RECEIVED_CODE){ 10                 String code = (String)msg.obj; 11  mEtReceive.setText(code); 12  } 13  }; 14  }; 15     private Uri uri; 16     
17     
18 
19  @Override 20     protected void onCreate(Bundle savedInstanceState) { 21         super.onCreate(savedInstanceState); 22  setContentView(R.layout.activity_main); 23         
24         mEtReceive = (EditText)findViewById(R.id.et_receive); 25         
26         mObserver = new SmsObserver(MainActivity.this,mHandler); 27         uri = Uri.parse("content://sms"); 28         getContentResolver().registerContentObserver(uri,true,mObserver); 29  } 30     
31  @Override 32     protected void onPause() { 33         super.onPause(); 34  getContentResolver().unregisterContentObserver(mObserver); 35  } 36     
37  @Override 38     protected void onResume() { 39         super.onResume(); 40         getContentResolver().registerContentObserver(uri,true,mObserver); 41  } 42 }
相關文章
相關標籤/搜索