//獲取驗證碼廣播 public class SmsObserver extends ContentObserver { public SmsObserver(Handler handler, EditText et_name, Status status, Context context) { super(handler); this.et_name = et_name; this.status = status; this.context = context; this.et_vpw = et_name; } public SmsObserver(Handler handler, EditText et_vpw, Status status) { super(handler); this.et_vpw = et_vpw; this.status = status; } Context context = null; private Uri uri; private String patternCoder = "(?<!\\d)\\d{6}(?!\\d)";//匹配6位數字的驗證碼 private String strContent; public Status status; private Builder builder; private Map<String, String> map; public void setStatus(Status status) { this.status = status; } private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: SmsInfo smsInfo = getSmsInfo(); String content = smsInfo.getSmsbody(); Log.e("TAG", "=============" + content); if (content == null) { Message mMessage = handler.obtainMessage(); mMessage.what = 1; handler.sendMessageDelayed(mMessage, 1000); return; } String code = patternCode(content); break; } }; }; @Override public void onChange(boolean selfChange) { Message mMessage = handler.obtainMessage(); mMessage.what = 1; handler.sendMessageDelayed(mMessage, 1000); // super.onChange(selfChange); } public SmsInfo getSmsInfo() { SmsInfo smsinfo = new SmsInfo(); Uri uri = Uri.parse("content://sms/inbox");// 收件箱查詢地址 String[] projection = new String[] { "_id", "address", "person", "body", "date", "type" }; // Cursor cusor = ((Activity) context).managedQuery(uri, projection, // null, null, "date desc"); ContentResolver cr = context.getContentResolver(); Cursor cusor = cr.query(uri, projection, "type=1 AND date>" + (System.currentTimeMillis() - 30 * 1000), null, "date desc"); try { if (cusor != null) { Log.v("a", "==========cusor==========" + cusor.getCount()); if (cusor.getCount() > 0) { cusor.moveToFirst(); int nameColumn = cusor.getColumnIndex("person"); int phoneNumberColumn = cusor.getColumnIndex("address"); int smsbodyColumn = cusor.getColumnIndex("body"); int dateColumn = cusor.getColumnIndex("date"); int typeColumn = cusor.getColumnIndex("type"); smsinfo.setName(cusor.getString(nameColumn)); smsinfo.setDate(cusor.getString(dateColumn)); smsinfo.setPhoneNumber(cusor.getString(phoneNumberColumn)); smsinfo.setSmsbody(cusor.getString(smsbodyColumn)); smsinfo.setType(cusor.getString(typeColumn)); } } } catch (Exception e) { } finally { if (cusor != null) { cusor.close(); } if (cr != null) { cr.unregisterContentObserver(this); } } return smsinfo; } /** * 匹配短信中間的6個數字(驗證碼等) * * @param patternContent * @return */ private String patternCode(String patternContent) { if (TextUtils.isEmpty(patternContent)) { return null; } Pattern p = Pattern.compile(patternCoder); Matcher matcher = p.matcher(patternContent); if (matcher.find()) { return matcher.group(); } return null; } /** * 密碼 驗證碼標示 * * @author zhoufeng */ public enum Status { PWD, VPW } }
利用廣播來獲取短信驗證碼java
getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true,new SmsObserver (new Handler(), et_fg_pw, SmsObserver.Status.VPW, context));