效果图:
大致原理:
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+"");
//第一次时直接return
if(uri.toString().equals("content://sms/raw")){
return;
}
//收件箱的uri
Uri 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;
//更新UI
sms.setText(code);
sms.setSelection(sms.length());
}
};
};</span>
撤销注册
<span style="font-size:18px;">@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
//撤销注册
getContentResolver().unregisterContentObserver(mObserver);
}</span>
源码下载地址:
http://download.csdn.net/detail/huiling815/9663326