Android采取ContentObserver方式自动获取验证码
Android自动获取验证码的两种方式分别是BroadcastReceiver及ContentObserver,两种方式都需要进行注册、取消注册两个步骤
记得添加权限,本文介绍ContentObserver方式。
照旧先上ContentObserver代码
/**
*Createdbyweifeiyangon2016/7/290029.
*/
importandroid.app.Activity;
importandroid.content.SharedPreferences;
importandroid.database.ContentObserver;
importandroid.database.Cursor;
importandroid.net.Uri;
importandroid.os.Handler;
importandroid.text.TextUtils;
importandroid.widget.EditText;
importjava.util.regex.Matcher;
importjava.util.regex.Pattern;
/**
*读取短信验证码,并设置验证码
*Createdbycoolon2016/1/4.
*/
publicclassReadSmsContentextendsContentObserver{
privateCursorcursor=null;
privateActivitymActivity;
privateEditTextmEditText;
publicReadSmsContent(Handlerhandler,Activityactivity,EditTexteditText){
super(handler);
this.mActivity=activity;
this.mEditText=editText;
}
@Override
publicvoidonChange(booleanselfChange,Uriuri){
/*
第一次回调不是我们想要的直接返回
目前发现每次收到新短信都会走好几次onChange(),
可以通过这个方法来使得onChange中的方法只走一次
*/
if(uri.toString().equals("content://sms/raw")){
return;
}
/*
读取收件箱中的短信
address发件人手机号码:
body信息内容:
read是否查看:
date发送时间:
*/
cursor=mActivity.getContentResolver().query(Uri.parse("content://sms/inbox"),
newString[]{"_id","address","body","read"},null,null,"_iddesc");//按降序排列
//指定号码
//mActivity.managedQuery(Uri.parse("content://sms/inbox"),
//newString[]{"_id","address","body","read"},"address=?andread=?",newString[]{"10086","0"},"_iddesc");
if(null!=cursor&&cursor.getCount()>0){
cursor.moveToNext();//指向首位
intsmsbodyColumn=cursor.getColumnIndex("body");//body位置
StringsmsBody=cursor.getString(smsbodyColumn);//获取内容
StringverifyCode=getDynamicPassword(smsBody);
if(TextUtils.isEmpty(verifyCode)){
return;
}
if(mEditText==null){
thrownewRuntimeException("你传的EditText为空");
}
if(verifyCode.contains("你从服务器上获取到的验证码"))){
mEditText.setText(verifyCode);
//EditText获取焦点,3个属性必须同时设置
mEditText.setFocusable(true);
mEditText.setFocusableInTouchMode(true);
mEditText.requestFocus();
mEditText.setSelection(verifyCode.length());//设置光标位置
}
}
if(!cursor.isClosed()){
cursor.close();
}
}
/**
*从字符串中截取连续4位数字
*用于从短信中获取动态密码
*
*@paramstr短信内容
*@return截取得到的4位动态密码
*/
publicstaticStringgetDynamicPassword(Stringstr){
PatterncontinuousNumberPattern=Pattern.compile("[0-9\\.]+");
Matcherm=continuousNumberPattern.matcher(str);
StringdynamicPassword="";
while(m.find()){
if(m.group().length()==4){
dynamicPassword=m.group();
}
}
returndynamicPassword;
}
}
观察者有了后就可以使用了,在activity或者fragment的onCreate方法中调用initSmSContentObserver()进行注册,在onDestroy()中通过
//注销内容监听者
this.getContentResolver().unregisterContentObserver(readSmsContent);
取消注册
/**
*初始化短信监听数据库
*/
privatevoidinitSmSContentObserver(){
readSmsContent=newReadSmsContent(newHandler(),this,seCodeEditText);
//注册短信内容监听
this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"),true,readSmsContent);
}
上述两种方式获取到短信后,目前由于短信平台来源账号不固定,因此是通过验证码进行校验。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。