验证码自动填充首先应该考虑的就是如何获取短信,而后读取短信内容来实现。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);
以上就是自动填充验证码的办法了。写得不是很好,但愿你们指教