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(ListdeniedPermissions){
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("(?
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。