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); }
上述两种方式获取到短信后,目前由于短信平台来源账号不固定,因此是通过验证码进行校验。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。