短信验证码自动填写

项目中提高体验一般在短信验证的时候会自动填充验证码,接下来我们就实现一把

界面就是这样主要以实现逻辑为主

首先点击验证码发一个定时器

这里用到CountDownTimer这个类完成定时器

  点击发送验证码随机生成一个Radom数 Math.Radom()*9000+ 1000;

  在这里花费我大量时间,但是对知识的渴求还是摸爬滚打让我明白了问题,java和kotlit交互起来还是有问题嘛,表示踩坑很苦逼

/*thread { Runnable {
SystemClock.sleep(4000)
mCountDownTimer!!.ancleTimers()
} }.start()*/ 这里是调用的Kotlin的thread导致我想要的效果实现不了

Thread(Runnable {
SystemClock.sleep(4000)
mCountDownTimer!!.ancleTimers()
}).start()    

写到这里把倒计时的效果写出来了,然后们看自动填写短信内容是怎么回事,我们再梳理下逻辑

  1.写布局  

  2.用CountDownTImer做个定时器,里面两个方法一个onTick,一个 onFinish()我是用接口回调自己封装了当点击开始,返回,取消,销毁的操作,可以参考我写的

  3.真实项目时会用到网络请求,把Radom的随机数发到服务器,服务器做操作,最终发一个短信

  4.最后就是我们要操作的短信内容里的数字信息了

我们用到内容观察者来观察数据发生变化,用内容提供都读取信息填到TextView上

//自动获取验证码实现步骤
public class SmsContent extends ContentObserver {
public static final String SMS_URI_INBOX = "content://sms/inbox";
private Activity activity = null;
private String smsContent = "";
private EditText verifyText = null;
public SmsContent(Activity activity, Handler handler,EditText verifyText) {
super(handler);
this.activity = activity;
this.verifyText = verifyText;
}

@SuppressWarnings("deprecation")
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Cursor cursor = null;
// 读取收件箱中指定号码的未读短信 ,id排序,防止手机更改时间后读取短信混乱
cursor = activity.managedQuery(Uri.parse(SMS_URI_INBOX),
new String[] { "_id", "address", "body", "read" },
"address=? and read=?", new String[] { "10690278071714", "0" },
"_id desc");

if (cursor != null) {// 如果短信为未读模式
cursor.moveToFirst();
if (cursor.moveToFirst()) {
//将未读改为已读模式
ContentValues values = new ContentValues();
values.put("read", "1");
String smsbody = cursor.getString(cursor.getColumnIndex("body"));
System.out.println("smsbody=======================" + smsbody);
String regEx = "[^0-9]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(smsbody.toString());
//截取短信中的数字 个数为3
smsContent = m.replaceAll("").trim().toString().substring(0, 4);
verifyText.setText(smsContent);
}
}

}

在方法中调用刚写的

// 自动获取验证码,需要时调用下面两行
content = new SmsContent(this, new Handler(), verifyCodeEForget);
// 注册短信变化监听
this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content);

最后取消消毁内容提供者

@Override
protected void onDestroy() {
super.onDestroy();
this.getContentResolver().unregisterContentObserver(content);
}


记的加权限,必要时配置清单文件

<!--读取短信-->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>

类似文章参考

2.在上面的demo中有时候会出现点击第二次才响应倒计时,暂时用这个代替

3.helloword倒计时是不是很酷,自定义的哦

原文地址:https://www.cnblogs.com/dubo-/p/7069555.html