这个项目是什么

登录、注册、找回密码都要收短信验证码,用户来回切换应用看短信再手动输入,体验很割裂。AutoVerifyCode 把这段流程包成一个库:监听短信、按规则过滤出验证码,自动填进指定的 EditText。运行时权限申请也内置了,不用在每个页面再写一遍短信权限逻辑。

核心实现

库的配置集中在 AutoVerifyCodeConfig,用 Builder 构造,可配置的项包括:

  • 验证码长度
  • 验证码类型:大写字母、小写字母、大小写字母、数字、数字字母
  • 短信发送者号码,或发送者号码的前几位
  • 短信正文的开头文字
  • 短信正文包含的关键字

后两项用于区分场景。同一个应用里注册和重置密码的短信文案不同,发送号码也可能不同,用开头文字和包含文字过滤,能避免拿到不该拿的那条。比如验证码短信统一以「【守护APP】」开头,重置类短信正文含「重置」,两个条件一卡,基本不会误匹配。

除了自动填入,短信内容、发送者、解析出的验证码都通过 SmsCallBack 回调出来,可以自己做后续处理。权限走 PermissionCallBack,onFail() 返回 true 表示重试申请;README 的注释里也说明,可以自己手动去申请权限,申请完再返回 true。

使用方法

最简单的用法,适用于 4 到 6 位数字验证码:

AutoVerifyCode.getInstance()
        .with(MainActivity.this)
        .into((EditText) findViewById(R.id.et_code))
        .start();

需要精细控制时,先建配置再链式设置回调:

AutoVerifyCodeConfig config = new AutoVerifyCodeConfig.Builder()
        .codeLength(6)
        .smsCodeType(AutoVerifyCodeConfig.CODE_TYPE_NUMBER)
        .smsSenderStart("650")
        .smsSender("6505551212")
        .smsBodyStartWith("【守护APP】")
        .smsBodyContains("重置")
        .build();

AutoVerifyCode.getInstance()
        .with(MainActivity.this)
        .config(config)
        .smsCallback(new MessageCallBack())
        .permissionCallback(new PerCallBack())
        .inputCompleteCallback(new OnInputCompleteListener() {
            @Override
            public void onInputComplete(String text) {
                // 自动输入完毕,可以继续登录流程
            }
        })
        .into((EditText) findViewById(R.id.et_code))
        .start();

回调接口按 README 的写法实现即可:SmsCallBack 有 onGetCode、onGetMessage、onGetSender 三个方法,PermissionCallBack 有 onSuccess 和 onFail。

踩坑与思考

README 特意提了释放。这个库一般只用一次,所以页面销毁时要调用:

@Override
protected void onDestroy() {
    super.onDestroy();
    AutoVerifyCode.getInstance().release();
}

短信权限属于敏感权限,申请被拒后不建议在 onFail() 里无条件返回 true 死循环重试,给个提示、引导用户去设置页打开会更稳妥。

仓库地址:tpnet/AutoVerifyCode