天天看點

短信驗證碼自動填充

短信驗證碼自動填充

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

繼續閱讀