温馨提示×

温馨提示×

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

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

android 截取验证码的两种实现方式

发布时间:2020-07-19 12:40:44 来源:网络 阅读:4690 作者:manlianman 栏目:移动开发

在进行手机验证码验证时,为了提升用户体验,实现自动截取验证填充的行式,实现这个功能有两种方法,分别是利用android的广播机制和android的ContentObserver 实现。

    第一种的实现方法如下: 

/**
  * 监听返回的验证码信息,并自动补充如验证码输入框中 [一级方法]
  */
 public BroadcastReceiver getMessageReceive = new BroadcastReceiver() {
  String address;

  @Override
  public void onReceive(Context context, Intent intent) {
   Log.v(TAG+"--BroadcastReceiver --", "进入onReceive");
   String msgCode = null;
   if (intent.getAction().equals(
     "android.provider.Telephony.SMS_RECEIVED")) {
    Bundle bundle = intent.getExtras();
    if (bundle != null) {
     Object[] pdus = (Object[]) intent.getExtras().get("pdus");
     for (Object pdu : pdus) {
      SmsMessage message = SmsMessage
        .createFromPdu((byte[]) pdu);
      // 获取短信的正文内容
      content = message.getMessageBody().trim();
      // 获取短信的发送者
      address = message.getOriginatingAddress();
     }
     Log.v(TAG+"BroadcastReceiver address", "手机号=="
       + address);
     if (address != null && address.equals("10658464")) {
      String regex = "\\d*";
      Pattern p = Pattern.compile(regex);
      Matcher m = p.matcher(content);
      while (m.find()) {
       if (m.group().length() == 6) {
        msgCode = m.group();
       }
      }
      Log.v(TAG+" BroadcastReceiver msgCode",
        "验证码==" + msgCode);
      metVerify.setText(msgCode);
     }
    }
   }
  }

 }; 

在activity 中的oncreate方法中,需要注册这个广播:

 filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 
  getApplicationContext().registerReceiver(getMessageReceive, filter);

这样,在接收到短信后,会发送广播,然后进行截取,但这个方法在android4.4后,部分手机就无法正常截取,因此推荐使用第二个方法。

  第二个方法实现如下:

/**
     * 监听短信数据库
     */
    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[]{"10658464", "0"}, "_id desc");//按id排序,如果按date排序的话,修改手机时间后,读取的短信就不准了
            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);
                ed_mmscode.setText(getDynamicPassword(smsBody));

            }

            //在用managedQuery的时候,不能主动调用close()方法, 否则在Android 4.0+的系统上, 会发生崩溃
            if(Build.VERSION.SDK_INT < 14) {
                cursor.close();
            }
        }
    }

种用内容观查者,在接收到短信后,发生变化时,触发onChange 方法。这种方法在测试的手机上均可拦截,故推荐大家使用这种方法,附demo 下载 :https://github.com/maliankun/intercept/archive/master.zip

向AI问一下细节

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

AI