Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android 中使用ContentObserver模式获取短信用正则自动填充验证码大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

最近做注册的时候看到很多app在手机接受到短信的时候直接填写验证码到界面省略用户自动输入,感觉这样确实蛮人性化的呵呵,于是自己也做了一个

步骤:

首先我使用了ContentObserver监听短信,(最好知道您的验证码从那个号码发过来)

然后从短信中用正则的分组去拿到验证码(当然验证码必须是什么格式)

贴出关键代码

注册监听短信数据库的 

ContentObserver c=new ContentObserver(han) { 
        @Override 
        public void onChange(Boolean selfChangE) {           // TODO Auto-generated method stub 
          super.onChange(selfChangE); 
          han.sendEmptymessage(0); 
        } 
      }; 
getContentResolver().registerContentObserver(Uri.parse("content://sms"),true,c); 
Handler han = new Handler() { 
    @SuppressWarnings("deprecation") 
    public void handlemessage(android.os.message msg) { 
      String codestr = null; 
      try { 
        codestr = Cus_UnitTools.getsmsyzm(Reg_Forgetpassword.this); 
        code.setText(codestr); 
        requestcode(); 
      } catch (Exception E) { 
        Log.e("yung","验证码提取失败:" + codestr); 
      } 
    }; 
  };  
  public static String getsmsyzm(Activity C) { 
    Uri uri = Uri.parse("content://sms/inBox"); 
    String[] projection = new String[] { "address","person","body" }; 
    String selection = " address='" + JTPHONE + "' "; 
    String[] SELEctionArgs = new String[] {}; 
    String sortOrder = "date desc"; 
    @SuppressWarnings("deprecation") 
    cursor cur = c.managedQuery(uri,projection,SELEction,SELEctionArgs,sortOrder); 
    if(cur!=null&&cur.getCount()>0){ 
      cur.moveToFirst(); 
      String body = cur.getString(cur.getcolumnIndex("body")).replaceAll( 
          "\n"," "); 
      cur.close(); 
      return getyzm(body,YZMLENGTH); 
  } 
    cur.close(); 
    return null; 
  } 
    /** 
   * 从短信字符窜提取验证码 
   * @param body 短信内容 
     * @param YZMLENGTH 验证码的长度 一般6位或者4位 
   * @return 接取出来的验证码 
   */ 
  public static String getyzm(String body,int YZMLENGTH) { 
    // 首先([a-zA-Z0-9]{YZMLENGTH})是得到一个连续的六位数字字母组合 
    // (?<![a-zA-Z0-9])负向断言([0-9]{YZMLENGTH})前面不能有数字 
    // (?![a-zA-Z0-9])断言([0-9]{YZMLENGTH})后面不能有数字出现 
    Pattern p = Pattern 
        .compile("(?<![a-zA-Z0-9])([a-zA-Z0-9]{" + YZMLENGTH + "})(?![a-zA-Z0-9])"); 
    Matcher m = p.matcher(body); 
    if (m.find()) { 
      System.out.println(m.group()); 
      return m.group(0); 
    } 
    return null; 
  } 
//有些验证码是纯数字的那么直接用这个就可以了
//Pattern p = Pattern.compile("(?<![0-9])([0-9]{" + YZMLENGTH+ "})(?![0-9])");

监听完成后记得getContentResolver().unregisterContentObserver(c);注销监听

这样子就可以监听到短信数据库的变化了记住还需要加入权限顺便列出短信权限

 <!-- 发送短信-->
  <uses-permission Android:name="android.permission.SEND_SMS" />
  <!-- 阅读消息 -->
  <uses-permission android:name="android.permission.READ_SMS" />
  <!-- 写入消息 -->
  <uses-permission android:name="android.permission.WRITE_SMS" />
  <!-- 接收消息 -->
  <uses-permission android:name="android.permission.RECEIVE_SMS" />

 以上所述是小编给大家介绍的Android 中使用COntentObserver模式获取短信用正则自动填充验证码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持

大佬总结

以上是大佬教程为你收集整理的Android 中使用ContentObserver模式获取短信用正则自动填充验证码全部内容,希望文章能够帮你解决Android 中使用ContentObserver模式获取短信用正则自动填充验证码所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。