短信验证码自动填充
1、简述
不知道大家有没觉得,注册一个app的时候,还要手动输入短信验证码,挺烦的?反正我觉得是挺烦的!其实这也不是什么高深的技术,我们可以通过代码的形式,完成短信验证码的自动填充。
思路:
①、继承系统的ContentObserver类,当内容发生变化时,那么系统就会回调ContentObserver的onChange方法,观察者模式,这些都是系统帮我们完成的,我们需要做的就是写一个类继承ContentObserver即可;
public void onChange(boolean selfChange, Uri uri)
②、根据onChange方法回调的uri判断是否是接收短信的Uri,如果是,那么根据ContentResolver查询短信的内容,获取到短信验证码,并通过接口回调的形式返回给调用者;
2、代码示例
①、继承ContentObserver的SmsObserver类:
public class SmsObserver extends ContentObserver {
private Context mContext;
private IValidateCode iValidateCode;
public SmsObserver(Context context, Handler handler) {
super(handler);
mContext = context;
}
public SmsObserver(Context context, Handler handler, IValidateCode iValidateCode) {
super(handler);
mContext = context;
this.iValidateCode = iValidateCode;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
String code = "";
if (uri.toString().equals("content://sms/raw")) {
return;
}
Uri inboxUri = Uri.parse("content://sms/inbox");
//根据ContentResolver解析收信箱新的短信
Cursor c = mContext.getContentResolver().query(inboxUri, null, null, null,
"date desc");
if (c != null) {
if (c.moveToFirst()) {
String address = c.getString(c.getColumnIndex("address"));
String body = c.getString(c.getColumnIndex("body"));
if (!address.equals(AppConstant.validateCodeNum)) {
return;
}
Pattern pattern = Pattern.compile("(\\d{6})");
Matcher matcher = pattern.matcher(body);
if (matcher.find()) {
code = matcher.group(0);
//通过接口回调给调用者返回验证码
iValidateCode.getCode(code);
}
}
c.close();
}
}
}
②、回调接口
public interface IValidateCode {
void getCode(String code);
}
③、在需要的页面调用
private void initSmsObserver() {
if (timer != null) {
timer.cancel();
}
smsObserver = new SmsObserver(this, null, new IValidateCode() {
@Override
public void getCode(final String code) {
runOnUiThread(new Runnable() {
@Override
public void run() {
et_validate_code.setText(code);
}
});
}
});
getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, smsObserver);
}
当页面进入后台时,取消短信验证码的监听
@Override
protected void onPause() {
super.onPause();
if (smsObserver != null)
getContentResolver().unregisterContentObserver(smsObserver);
}