在进行手机验证码验证时,为了提升用户体验,实现自动截取验证填充的行式,实现这个功能有两种方法,分别是利用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

转载于:https://blog.51cto.com/kunyali/1660893

android 截取验证码的两种实现方式相关推荐

  1. Android 圆形头像的两种实现方式

    Android 圆形头像的两种实现方式 前言 这篇博客只是为了做一个记录而已,方便而后查询,核心代码都是直接采用鸿洋博客里面的代码的. 圆形头像在实际开发中实际很常见,一般来说,主要有两种实现方式: ...

  2. android旋转动画的两种实现方式

    在android开发,我们会常常使用到旋转动画,普通情况下旋转动画有两种实现方式,一种是直接通过java代码去实现,第二种是通过配置文件实现动画.以下是两种动画的基本是用法: 纯Java代码实现: / ...

  3. android中资源文件的两种访问方式,Android_Android学习笔记-保存文件(Saving Files),Android设备有两种文件存储区域 - phpStudy...

    Android学习笔记-保存文件(Saving Files) Android设备有两种文件存储区域: 内部存储和外部存储 ("internal" and "externa ...

  4. android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...

    在android开发中进行数据存储与访问的多种方式介绍 更新时间:2013年06月07日 16:24:23   作者: 很多时候我们的软件需要对处理后的数据进行存储或再次访问,Android为数据存储 ...

  5. android编程fragment,详解Android中Fragment的两种创建方式

    onCreate():在创建fragment时系统会调用此方法.在实现代码中,你可以初始化想要在fragment中保持的那些必要组件,当fragment处于暂停或者停止状态之后可重新启用它们. onC ...

  6. Android 图片旋转动画两种实现方式

    说明: 让图片旋转两种方法,使用xml和代码 xml加载: xml布局:anim_rotate.xml <?xml version="1.0" encoding=" ...

  7. 图形验证码的两种实现方式

    情形一:图形验证码跟短信验证码一起,只需要将后台提供的动态链接填到(id="img")的src中即可生成动态验证码. 然后,在需要请求接口的地方,只需把(id="imgC ...

  8. Android service的两种使用方式bindService和startService使用方式

    服务与多线程的区别: 服务仍然是运行在主线程中,而Thread则是真正的开启了一个新的线程来执行先关操作. 那为什么要用服务呢,初步理解是服务是为了更好地管理线程.试想,当我们在某一个activity ...

  9. android项目两种构建方式的整合(Eclipse/idea和Android Studio)

    android的两种构建方式 目前android主要有两种构建方式,一种基于ant(传统的),另一种是13年Google/IO上新推出基于Gralde的构建(Android Studio).从sdk的 ...

最新文章

  1. Sublime Text 3中文乱码解决方法以及安装包管理器方法
  2. 2017 《Java技术预备作业》
  3. c#调用带有自定义表结构的存储过程
  4. numpy在折线图上添加取值_见识matplotlib:不常见的一面,折线图
  5. GDCM:gdcm::UUIDGenerator的测试程序
  6. JS实现一个简单的计算器
  7. 实惠星扫地机器人不能开机_扫地机器人不能承受的重量,14kg法斗坐在上面,它旋转后死机...
  8. TortoiseSVN搭建本地版本库及简单操作使用
  9. easyui datagrid 列中的checkbox 动态绑定
  10. 2020家用千兆路由器哪款好_家用路由器哪个牌子好穿墙2020
  11. 地图制图领域使用计算机优点在于哪些方面,电子地图制图的运用与发展
  12. 开放数据库:中医古方数据库
  13. 区块链相关的关键概念
  14. 餐饮行业的营销策略是什么?
  15. 更省APP省钱密令,更省省钱密令
  16. Retrying connect to server: xxx.xxx.xxx.xxx:8032. Already tried 0 time(s)
  17. axios的post请求
  18. 【物联网】三大厂家NB-IOT卡对比
  19. 为什么要使用高彩模式
  20. 手机php网站开发工具,4款好用的网站开发工具推荐

热门文章

  1. 别让拖延毁掉你自己 | 《拖延心理学》全书解读
  2. Python之解决tkinter.PhotoImage不显示图片的问题 Python3
  3. matlab pca 主元 贡献,主元分析(PCA)原理
  4. Linux:inode与block,软硬链接,使用xfs相关命令备份与恢复文件和日志文件介绍
  5. flex 随机数产生方法
  6. 《Python之禅》的翻译和解释
  7. python math模块
  8. python 之 arrow
  9. 谁买了方舟正版火影服务器,《方舟》火影服再次被玩家恶搞!漩涡鸣人:我不要面子的吗!...
  10. Botler.ai为美国和加拿大推出性骚扰检测机器人