Android利用CursorLoader实现短信验证码自动填写
概述
Android上实现短信验证码自动填写,常用的有两种方式。一种是利用BroadCastReceiver,还有一种是监听手机上短信数据库的变化。利用BroadCastReceiver来实现会在一些情况下无效,最常见的就是手机上安装了具有垃圾短信拦截功能的软件的情况下,短信验证码自动填写无效。所以,现在一般会选用监听数据库内容变化的方式来实现短信验证码自动填写。
网上对于利用监听数据库内容变化来实现短信验证码自动填写的文章也很多,主要分为一下步骤:
1.继承ContentObserver实现一个短信数据库的观察者,再onChange。
2.在Activity中注册设个观察者。
3.在AndroidManifast文件中添加相关权限。
4.别忘了再Activity的onDestory方法中取消注册的观察者。
经过验证这种方式是可行的,而且比较好用。这种方法读取短信的Cursor来源与Activity的managedQuery方法,这个方法已经被标记为废弃,推荐用CursorLoader来代替。
CursorLoader的好处
首先,CursorLoader继承的是AsyncTaskLoader,采用异步的方式查询数据库,避免了同步查询阻塞UI线程的问题。它自己会监视数据源的变化并且会主动上报。而且,当发生配置上的变化,重新生成的loader会自动连接到变化前的cursor,在不使用查询到的资源时,可以自动将其释放。
短信验证码自动填写的实现类
一言不合就直接贴代码了:
packagecom.wuwang.demo;
importandroid.content.ContentValues;
importandroid.content.Context;
importandroid.database.ContentObserver;
importandroid.database.Cursor;
importandroid.net.Uri;
importandroid.os.Bundle;
importandroid.support.v4.app.LoaderManager;
importandroid.support.v4.content.CursorLoader;
importandroid.support.v4.content.Loader;
importandroid.util.Log;
importjava.util.regex.Matcher;
importjava.util.regex.Pattern;
/**
*<p>Author:Wuwang</p>
*<p>Company:ZhiJiaKeJi</p>
*<p>Date:2016-07-2109:16</p>
*<p>Description:验证码自动填充</p>
*/
publicclassVerificationCodeAutoFillimplementsLoaderManager.LoaderCallbacks<Cursor>{
privateContextcontext;
privateOnNewMessageListenerlistener;
privateStringmsgRegular;
publicVerificationCodeAutoFill(Contextcontext){
this(context,null,null);
}
publicVerificationCodeAutoFill(Contextcontext,OnNewMessageListenerlistener){
this(context,listener,null);
}
/**
*@paramcontext
*@paramlistener新短信监听
*@parammsgRegular对新短信处理的正则表达式,如果为空,则不进行处理
*/
publicVerificationCodeAutoFill(Contextcontext,OnNewMessageListenerlistener,StringmsgRegular){
this.context=context;
this.listener=listener;
this.msgRegular=msgRegular;
}
publicVerificationCodeAutoFillregisterTo(intid,LoaderManagermanager){
manager.initLoader(id,null,this);
returnthis;
}
@Override
publicLoader<Cursor>onCreateLoader(intid,Bundleargs){
returnnewCursorLoader(context,Uri.parse("content://sms/inbox"),
newString[]{"_id","address","read","body"},
"read=?",
newString[]{"0"},"_iddesc");
}
@Override
publicvoidonLoadFinished(Loader<Cursor>loader,Cursordata){
//按id排序,如果按date排序的话,修改手机时间后,读取的短信就不准了
if(data!=null&&data.getCount()>0){
ContentValuesvalues=newContentValues();
values.put("read","1");//修改短信为已读模式
data.moveToNext();
intsmsbodyColumn=data.getColumnIndex("body");
StringsmsBody=data.getString(smsbodyColumn);
Log.e("wuwang",smsBody);
if(listener!=null){
listener.onNewMessage(getDynamicPassword(smsBody,msgRegular));
}
}
}
@Override
publicvoidonLoaderReset(Loader<Cursor>loader){
}
publicinterfaceOnNewMessageListener{
voidonNewMessage(Stringmsg);
}
privateStringgetDynamicPassword(Stringstr,Stringregular){
if(regular==null)returnstr;
PatterncontinuousNumberPattern=Pattern.compile(msgRegular);
Matcherm=continuousNumberPattern.matcher(str);
StringdynamicPassword="";
while(m.find()){
System.out.print(m.group());
dynamicPassword=m.group();
}
returndynamicPassword;
}
}
使用方法
使用比较简单,直接再FragmengActivity中加上:
//匹配四位数字的短信验证码
newVerificationCodeAutoFill(this,newVerificationCodeAutoFill.OnNewMessageListener(){
@Override
publicvoidonNewMessage(Stringmsg){
//etMsg.setText(msg);//验证码填充
}
},"\\d{4}").registerTo(1,getSupportLoaderManager());
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。