Android短信验证码监听解决onChange多次调用的方法
先说一句:MIUI请放弃治疗!这里给个传送门:
MIUI通知类短信权限的坑
识别短信验证码并提取还是挺常见的一个需求。所要解决的问题主要有:
1、如何监听
2、如何提取短信中的验证码
3、监听多次调用问题
直接看下面代码吧,很明了。需要注意的点有就是onChange会多次调用。其实打Log就看的出了,收到一条短信会调用两次onChange,Log结果如下:
mUri===content://sms/raw/20 mUri===content://sms/inbox/20
安卓7.0以上系统,点击标记为已读,也会调用一次
mUri===content://sms
收到一条短信都是uri后面都会有确定的一个数字,对应数据库的_id,比如上面的20
publicstaticclassSMSCodeObserverextendsContentObserver{ privateActivitymActivity; privatestaticfinalStringTAG="SMSCodeObserver"; privateSMSCodeListenermSMSCodeListener; privateUrimUri; publicvoidsetSMSCodeListener(SMSCodeListenerSMSCodeListener){ mSMSCodeListener=SMSCodeListener; } publicinterfaceSMSCodeListener{ voidonResult(Stringcode); } publicSMSCodeObserver(Handlerhandler,Activityactivity){ super(handler); mActivity=activity; } publicvoidregister(){ mActivity.getContentResolver().registerContentObserver( Uri.parse("content://sms/"),true,this); } publicvoidunRegister(){ mActivity.getContentResolver().unregisterContentObserver(this); } @Override publicvoidonChange(booleanselfChange,Uriuri){ super.onChange(selfChange,uri); if(uri==null){ mUri=Uri.parse("content://sms/inbox"); }else{ mUri=uri; } if(mUri.toString().contains("content://sms/raw")||mUri.toString().equals("content://sms")){ return; } LogUtils.d(TAG,"mUri==="+mUri.toString()); AndPermission.with(mActivity) .permission(Manifest.permission.READ_SMS) .requestCode(100) .callback(this) .rationale(newRationaleListener(){ @Override publicvoidshowRequestPermissionRationale(intrequestCode,Rationalerationale){ AndPermission.rationaleDialog(mActivity,rationale) .show(); } }) .start(); } @PermissionYes(100) @SuppressWarnings("unused") privatevoidgetPermissionYes(ListgrantedPermissions){ handleSMS(); } @PermissionNo(100) @SuppressWarnings("unused") privatevoidgetPermissionNo(List deniedPermissions){ if(AndPermission.hasPermission(mActivity,Manifest.permission.READ_SMS)){ handleSMS(); }else{ AndPermission.defaultSettingDialog(mActivity) .show(); } } privatevoidhandleSMS(){ /*按照日期倒序排序*/ Cursorcursor=mActivity.getContentResolver().query(mUri,null,null,null,"datedesc"); if(cursor!=null){ if(cursor.moveToFirst()){//游标移动到first位置 /*发件人的号码*/ Stringaddress=cursor.getString(cursor.getColumnIndex("address")); /*短信内容*/ Stringbody=cursor.getString(cursor.getColumnIndex("body")); LogUtils.d(TAG,"address:"+address+",body:"+body); if(!body.contains("验证码")){ return; } /*利用正则提取验证码(根据实际情况修改)*/ Stringcode=getSMSCode(body); if(code!=null){ if(mSMSCodeListener!=null){ mSMSCodeListener.onResult(code); } LogUtils.d(TAG,"code:"+code); } } cursor.close(); } } privatestaticStringgetSMSCode(Stringmsg){ /*提取正则表达式,需按需修改*/ Patternp=Pattern.compile("(? 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。