先说一句: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 (List deniedPermissions) { 如果(和权限。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; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。