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

效果图:


大致原理:

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值