温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

在Android 中使用ContentObserver怎么获取短信验证码并实现自动填充

发布时间:2020-11-21 16:09:45 来源:亿速云 阅读:211 作者:Leah 栏目:移动开发

在Android 中使用ContentObserver怎么获取短信验证码并实现自动填充?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

步骤:

首先我使用了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})是得到一个连续的六位数字字母组合 
    // (&#63;<![a-zA-Z0-9])负向断言([0-9]{YZMLENGTH})前面不能有数字 
    // (&#63;![a-zA-Z0-9])断言([0-9]{YZMLENGTH})后面不能有数字出现 
    Pattern p = Pattern 
        .compile("(&#63;<![a-zA-Z0-9])([a-zA-Z0-9]{" + YZMLENGTH + "})(&#63;![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("(&#63;<![0-9])([0-9]{" + YZMLENGTH+ "})(&#63;![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" />

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI