短信验证码自动填写
项目中提高体验一般在短信验证的时候会自动填充验证码,接下来我们就实现一把
界面就是这样主要以实现逻辑为主
首先点击验证码发一个定时器
这里用到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倒计时是不是很酷,自定义的哦