驗證碼自動填充首先應該考慮的就是如何獲取短信,而後讀取短信內容來實現。java
我能想到的有兩種方式。android
一、ContentObserver——內容觀察者,目的是觀察(捕捉)特定Uri引發的數據庫的變化,繼而作一 些相應的處理,它相似於 數據庫技術中的觸發器(Trigger),當ContentObserver所觀察的Uri發生變化時,便會觸發它。數據庫
二、BroadcastReceiver——廣播。只要加入IntentFilter也能攔截部分本身想要作的事情。ide
下面我來一一介紹他們的實現:函數
ContentObserver:this
首先要定義一個ContentObserver的實現.net
import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Handler; import com.wumart.lib.common.DLog; import java.util.regex.Matcher; import java.util.regex.Pattern; public class SmsContent extends ContentObserver { public static final String SMS_URI_INBOX = "content://sms/inbox";//短信收信箱的URI public static final String SMS_ADDRESS = "電話號碼";//須要監聽的電話號碼 private Context mContext;//內容上下文 private SmsContentListener mSmsContentListener;//回調函數 public SmsContent(Context context,SmsContentListener smsContentListener) { super(new Handler()); this.mContext = context; this.mSmsContentListener=smsContentListener; } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Cursor cursor = null; try { cursor = mContext.getContentResolver().query(Uri.parse(SMS_URI_INBOX), new String[]{"_id", "address", "body", "read"}, "address like ? and read=?", new String[]{SMS_ADDRESS, "0"}, "date desc"); if (cursor != null) { cursor.moveToFirst(); if (cursor.moveToFirst()) { String smsbody = cursor.getString(cursor.getColumnIndex("body")); String smsContent = patternCode(smsbody); if (null != mSmsContentListener && !TextUtils.isEmpty(smsContent)) mSmsContentListener.onSmsContentBack(smsContent); } } } catch (Exception e) { e.printStackTrace(); } finally { if (null != cursor) cursor.close(); } } private String patternCode(String patternContent) { if(TextUtils.isEmpty(patternContent)) return null; Pattern p = Pattern.compile("(?<!\\d)\\d{6}(?!\\d)"); Matcher matcher = p.matcher(patternContent); if (matcher.find()) return matcher.group(); return null; } public interface SmsContentListener { void onSmsContentBack(String result); } }
固然還需在activity或者fragment中來調用它code
SmsContent mSmsContent=new SmsContent(this, this) this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, mSmsContent); 在onDestroy的時候仍是須要 getContentResolver().unregisterContentObserver(mSmsContent)
BroadcastReceiver:server
首先初始化廣播get
public static final String PHONE="電話號碼"; //短信驗證碼內容 驗證碼是6位數字的格式 private String strContent; private String patternCoder = "(?<!\\d)\\d{6}(?!\\d)"; private BroadcastReceiver smsReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Object[] objs = (Object[]) intent.getExtras().get("pdus"); for (Object obj : objs) { byte[] pdu = (byte[]) obj; SmsMessage sms = SmsMessage.createFromPdu(pdu); // 短信的內容 String message = sms.getMessageBody(); String from = sms.getOriginatingAddress(); if (!ScrmUtil.isEmpty(from) && from.startsWith(PHONE)) { String code = patternCode(message); if (!ScrmUtil.isEmpty(code)) { strContent = code; mHandler.sendEmptyMessage(1); } } } } }; //主要是更新UI private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (codeEdtv != null) { codeEdtv.setText(strContent); codeEdtv.setClearIconVisible(false); } try { unregisterReceiver(smsReceiver); } catch (Exception e) { e.printStackTrace(); } } }; /** * 匹配短信中間的6個數字(驗證碼等) */ private String patternCode(String patternContent) { if (ScrmUtil.isEmpty(patternContent)) return null; Pattern p = Pattern.compile(patternCoder); Matcher matcher = p.matcher(patternContent); if (matcher.find()) return matcher.group(); return null; }
而後在activity中和fragment中註冊廣播
public void addReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction("android.provider.Telephony.SMS_RECEIVED"); filter.setPriority(Integer.MAX_VALUE); registerReceiver(smsReceiver, filter); } 在onDestroy也仍是須要取消監聽,否則會出問題 unregisterReceiver(smsReceiver);
以上就是自動填充驗證碼的辦法了。寫得不是很好,但願你們指教