短信验证码自动填充

来源:互联网 发布:淘宝店铺贷款利息多少 编辑:程序博客网 时间:2024/06/10 20:16

短信验证码自动填充

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);    }

0 0