自动获取短信验证码并填写到编辑框中

来源:互联网 发布:c书籍推荐知乎 编辑:程序博客网 时间:2024/05/21 22:40

效果图:


大致原理:

1 监听收件箱是否发生变化

2 获取短信内容

3 正则匹配出短信验证码

4 更新UI

5 撤销注册


设计知识点: ContentObserver


具体代码段:

给短信Uri注册观察者模式

<span style="font-size:18px;">getContentResolver().registerContentObserver(uri, true, mObserver);</span>


在观察者模式中重写onChange()方法
<span style="font-size:18px;">public void onChange(boolean selfChange, Uri uri) {super.onChange(selfChange, uri);Log.e("是否变化", selfChange+"");Log.e("uri", uri+"");//第一次时直接returnif(uri.toString().equals("content://sms/raw")){return;}//收件箱的uriUri inboxUri=Uri.parse("content://sms/inbox");//最后一个代表排序方式Cursor cursor=mContext.getContentResolver().query(inboxUri, null, null, null, "date desc");if(cursor!=null){//将游标移动到第一条if(cursor.moveToFirst()){//获取发件人和短信内容,次数可以根据发件人来限制要显示的验证码来源String address=cursor.getString(cursor.getColumnIndex("address"));String body=cursor.getString(cursor.getColumnIndex("body"));Log.e("短信内容:", "短信来自:"+address+",,短信内容是:"+body);//提取验证码//正则表达式提取连续六位的数字Pattern pattern=Pattern.compile("(\\d{6})");Matcher matcher=pattern.matcher(body);if(matcher.find()){String code = matcher.group(0);handler.obtainMessage(MainActivity.CODE,code).sendToTarget();}}//关闭游标cursor.close();}}</span>


通过Handler在非UI线程中更新UI
<span style="font-size:18px;"><pre name="code" class="java">private Handler handler=new Handler(){public void handleMessage(Message msg) {if(msg.what==CODE){String code=(String) msg.obj;//更新UIsms.setText(code);sms.setSelection(sms.length());}};};</span>


撤销注册
<span style="font-size:18px;">@Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();//撤销注册getContentResolver().unregisterContentObserver(mObserver);}</span>


源码下载地址:

http://download.csdn.net/detail/huiling815/9663326

1 0
原创粉丝点击