zoukankan      html  css  js  c++  java
  • 短信验证码自动填写

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

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

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

    这里用到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倒计时是不是很酷,自定义的哦

  • 相关阅读:
    HDU2515_数学规律题
    HDU1086_You can Solve a Geometry Problem too_判断两线段相交
    HDU1115_Lifting the Stone_凹凸多边形重心_可作为模板
    HDU2036_改革春风照大地_点求多边形面积
    Codeforces Beta Round #92 (Div. 2 Only) _A题
    HDU2108_Shape of HDU_判断凹凸
    response.setContentType设置
    vue 文件下载实现
    iText5实现Java生成PDF文件完整版
    java使用IText将数据导出为pdf文件(数据为excel表格样式)
  • 原文地址:https://www.cnblogs.com/dubo-/p/7069555.html
Copyright © 2011-2022 走看看