zoukankan      html  css  js  c++  java
  • 团队项目——第一阶段冲刺4

    一、前言

    1.昨天完成了:
    验证码自动读取功能(仍有许多问题未解决)

    2.今天完成了:

    完善验证码读取功能

    3.遇到的困难

    因为对这些知识的不熟练导致花费大量时间寻找 Demo 

    二、设计思路

    • 产生问题的原因:通过短信广播监听短信,这种方式有它的缺陷,当手机安装了其他一些短信应用(例如QQ通讯录)或者手机本身限制了权限的情况下,这种方式有可能会不起作用,无法做到自动填写,而且就算把优先级设高,也不能保证不会被别的应用“抢先”。
    • 解决方法:可以通过监听短信数据库的方式实现。监听短信数据库主要是通过ContentObserver这个类来完成。ContentObserver主要是通过Uri来监测特定的Databases的表,当ContentObserver所观察的Uri发生变化时,便会触发它。

    三、逻辑代码

    在MainActivity中增加一个内部类SmsContent

      /**
      * 监听短信数据库
      */
      class SmsContent extends ContentObserver {
    
      private Cursor cursor = null;
    
      public SmsContent(Handler handler) {
       super(handler);
      }
    
      @Override
      public void onChange(boolean selfChange) {
    
       super.onChange(selfChange);
       //读取收件箱中指定号码的短信
       cursor = managedQuery(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "read", "body"},
         " address=? and read=?", new String[]{"1065811201", "0"}, "_id desc");//按id排序,如果按date排序的话,修改手机时间后,读取的短信就不准了
       MyLog.l("cursor.isBeforeFirst() " + cursor.isBeforeFirst() + " cursor.getCount() " + cursor.getCount());
       if (cursor != null && cursor.getCount() > 0) {
        ContentValues values = new ContentValues();
        values.put("read", "1");  //修改短信为已读模式
        cursor.moveToNext();
        int smsbodyColumn = cursor.getColumnIndex("body");
        String smsBody = cursor.getString(smsbodyColumn);
        MyLog.v("smsBody = " + smsBody);
    
        edtPassword.setText(MatchesUtil.getDynamicPassword(smsBody));
    
       }
    
       //在用managedQuery的时候,不能主动调用close()方法, 否则在Android 4.0+的系统上, 会发生崩溃
       if(Build.VERSION.SDK_INT < 14) {
        cursor.close();
       }
      }
     }
     

    在onCreate中注册短信变化监听

    SmsContent content = new SmsContent(new Handler());
      //注册短信变化监听
      this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content); 

    下发的验证码短信一般都是一个字符串,其中包含6位数字,需要把这6位数字提取出来,用正则表达式写一个静态方法

     /**
      * 从字符串中截取连续6位数字
      * 用于从短信中获取动态密码
      * @param str 短信内容
      * @return 截取得到的6位动态密码
      */
     public static String getDynamicPassword(String str) {
      Pattern continuousNumberPattern = Pattern.compile("[0-9\.]+");
      Matcher m = continuousNumberPattern.matcher(str);
      String dynamicPassword = "";
      while(m.find()){
       if(m.group().length() == 6) {
        System.out.print(m.group());
        dynamicPassword = m.group();
       }
      }
    
      return dynamicPassword;
     }
  • 相关阅读:
    Censored! POJ
    POJ
    HDU
    ionic中的生命周期函数
    ionic项目相关的操作命令
    数组的join()函数操作
    pop()实现逐个删除数组最后一位并输出
    CSS制作彩虹效果
    ionic2 页面加载时图片添加的问题
    升级ionic版本后,创建新项目报Error Initializing app错误解决
  • 原文地址:https://www.cnblogs.com/best-hym/p/12728488.html
Copyright © 2011-2022 走看看