Android短信验证码监听解决onChange多次调用的方法

  

先说一句:MIUI请放弃治疗!这里给个传送门:

  

MIUI通知类短信权限的坑

  

识别短信验证码并提取还是挺常见的一个需求。所要解决的问题主要有:

  

1,如何监听

  

2,如何提取短信中的验证码

  

3,监听多次调用问题

  

直接看下面代码吧,很明了。需要注意的点有就是onChange会多次调用。其实打日志就看的出了,收到一条短信会调用两次onChange,日志结果如下:

        mUri===内容://短信/生/20   mUri===内容://短信/收件箱/20      

安卓7.0以上系统,点击标记为已读,也会调用一次

        mUri===内容://sms      

收到一条短信都是uri后面都会有确定的一个数字,对应数据库的_id,比如上面的20

        公共静态类SMSCodeObserver延伸ContentObserver {   mActivity私人活动;   私有静态最终字符串标签=癝MSCodeObserver”;   私人SMSCodeListener mSMSCodeListener;   私人带来过度Uri负载;      公共空间setSMSCodeListener (SMSCodeListener SMSCodeListener) {   mSMSCodeListener=SMSCodeListener;   }      公共接口SMSCodeListener {   voidunused”)   私人空间getPermissionYes (ListgrantedPermissions) {   handleSMS ();   }      @PermissionNo (100)   @SuppressWarnings(未使用)   私人空间getPermissionNo (ListdeniedPermissions) {   如果(和权限。hasPermission (mActivity Manifest.permission.READ_SMS)) {   handleSMS ();   其他}{   AndPermission.defaultSettingDialog (mActivity)   ,告诉();   }   }      私人空间handleSMS () {/*按照日期倒序排序*/鼠标光标=mActivity.getContentResolver ()。查询带来过度的负载,空,空,空,日期desc);   如果(光标!=null) {   如果(cursor.moveToFirst()){//游标移动到第一位置/*发件人的号码*/字符串地址=cursor.getString (cursor.getColumnIndex(“地址”));/*短信内容*/字符串的身体=cursor.getString (cursor.getColumnIndex(“身体”));   LogUtils。d(标签”,地址:“+地址+”,身体:“+身体);   如果(! body.contains(“验证码”)){   返回;   }/*利用正则提取验证码(根据实际情况修改)*/字符串代码=getSMSCode(身体);   如果(代码!=null) {   如果(mSMSCodeListener !=null) {   mSMSCodeListener.onResult(代码);   }   LogUtils。d(标签,“代码:”+代码);   }   }   cursor.close ();   }   }      私有静态字符串getSMSCode(字符串味精){/*提取正则表达式,需按需修改*/p=Pattern.compile模式(“(& # 63;& lt; ! [0 - 9]) ([0 - 9] {6}) (& # 63; ! [0 - 9])”);   匹配器m=p.matcher(味精);   如果(m.find ()) {   LogUtils。d(标签,m.group ());   返回m.group (0);   }   返回null;   }   }      

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

Android短信验证码监听解决onChange多次调用的方法