自动填充短信验证码(使用ContentObserver)

为了减少用户的操作步骤,在获得短信验证码的时候,我们可以监听特殊手机号码的短信,截取信息当中的短信验证码(其实有很多应用都监听短信例如360短信,一些信用卡或者是记账类的应用)。

原理:可以使用一个自定义的BroadcastReceiver来监听短信,在监听结果当中过滤手机号,在需要回填的activity当中实现实例化广播并且实现其回调接口,在接口当中进行回填验证码,在销毁activity时销毁链接。但是这样操作会出现一些问题,由于一些其他的应用也会使用广播监听手机例如QQ通讯录或者是360通讯录等有的时候会被其拦截,即使你修改优先级也会出现不能进行回填的问题。所有这里可以采用另外一种的解决方法:使用ContentProvider来监听短信数据库的变化,在自定义的ContentObserver当中实现onChange的方法进行监听特定手机号的短信,然后进行信息截取在填充到需要填充的位置。

1,在AndroidManifest当中需要的权限:

    <!-- 发送短信-->
   <uses-permission android:name="android.permission.SEND_SMS" />
    <!-- 阅读消息 -->
    <uses-permission android:name="android.permission.READ_SMS" />
    <!-- 写入消息 -->
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <!-- 接收消息 -->
    <uses-permission android:name="android.permission.RECEIVE_SMS" />

2,在oncreate()方法中注册短信库的监听:

         content = new SmsContent(new Handler());
        //注册短信变化监听
        this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content);

3,SmsContent自定义的ContentObserver:

         /*
	 * 监听短信数据库
	 */
	class SmsContent extends ContentObserver {
		private Cursor cursor = null;

		public SmsContent(Handler handler) {
			super(handler);
			// TODO Auto-generated constructor stub
		}

		@SuppressWarnings("deprecation")
		@Override
		public void onChange(boolean selfChange) {
			// TODO Auto-generated method stub
			super.onChange(selfChange);
			// 读取收件箱中指定号码的短信
			cursor = managedQuery(Uri.parse("content://sms/inbox"),
					new String[] { "_id", "address", "read", "body" },
					" address=? and read=?",
					new String[] { "监听的号码", "0" }, "_id desc");
			// 按id排序,如果按date排序的话,修改手机时间后,读取的短信就不准了
			if (cursor != null && cursor.getCount() > 0) {
				ContentValues values = new ContentValues();
				values.put("read", "1"); // 修改短信为已读模式
				cursor.moveToNext();
				int smsbodyColumn = cursor.getColumnIndex("body");
				String smsBody = cursor.getString(smsbodyColumn);
				edit1.setText(getDynamicPassword(smsBody));

			}
			// 在用managedQuery的时候,不能主动调用close()方法, 否则在Android 4.0+的系统上, 会发生崩溃
			if (Build.VERSION.SDK_INT < 14) {
				cursor.close();
			}
		}

	}

4,getDynamicPassword(smsBody)截取短信中六位数字验证码的方法

/**
	 * 从字符串中截取连续6位数字组合 ([0-9]{" + 6 + "})截取六位数字 进行前后断言不能出现数字 用于从短信中获取动态密码
	 *
	 * @param str
	 *            短信内容
	 * @return 截取得到的6位动态密码
	 */
	public static String getDynamicPassword(String str) {
		// 6是验证码的位数一般为六位
		Pattern continuousNumberPattern = Pattern.compile("(?<![0-9])([0-9]{"
				+ 6 + "})(?![0-9])");
		Matcher m = continuousNumberPattern.matcher(str);
		String dynamicPassword = "";
		while (m.find()) {
			System.out.print(m.group());
			dynamicPassword = m.group();
		}

		return dynamicPassword;
	}

如果验证码的位数变化只要将6修改为想要的位数,过验证不只为数字直接修改正则为想要的内容即可。

5,在Activity销毁的时候要记得关闭数据库监听:

@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		this.getContentResolver().unregisterContentObserver(content);
	}

这样既可以实现短信监听自动回填,在回填的位置一般使用EditText不要使用TextView,因为android手机用户可能会禁止应用访问短信的权限应该支持手动填写。

自动填充短信验证码(使用ContentObserver),布布扣,bubuko.com

时间: 2024-11-02 23:34:50

自动填充短信验证码(使用ContentObserver)的相关文章

Android自动填充短信验证码

自动拦截短信实际上就是在系统注册一个BroadcastReceiver,然后通过设置拦截短信的: filter.addAction("android.provider.Telephony.SMS_RECEIVED"); filter.setPriority(Integer.MAX_VALUE); 即可拦截你所需要的短信了,拦截短信可能需要设置下最新的时间,这个问题我也考虑到了,下一步是重写onrecever方法: smsReceiver = new BroadcastReceiver(

自动获取短信验证码并填充以及倒计时_Android源码

自动获取短信验证码并填充以及倒计时 自动获取短信验证码并填充以及倒计时 下载地址:http://www.devstore.cn/code/info/827.html 运行截图:

Android自动读取短信验证码

Android自动读取短信验证码 extends:http://www.cnblogs.com/jiayaguang/p/4366384.html 实现自动获取手机的短信验证码,原理通过监听短信数据库的变化来解析短信,获取验证码. 直接附上代码: 1.建立一个监听数据库的类 import java.util.regex.Matcher; import java.util.regex.Pattern; import android.app.Activity; import android.data

Android自动获取短信验证码

前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码. 主要就是实时获取短信信息. android上获取短信信息主要有BroadcastReceiver方式与数据库方式,要实时的话就BroadcastReceiver比较方便 public class SMSReceiver extends BroadcastReceiver{    private String verifyCode="&quo

自动获取短信验证码

1.自定义监听类 /** * 短信监听器,用于自动填充验证码 */ public class SMSContentObserver extends ContentObserver { public final String SMS_URI_INBOX = "content://sms/inbox";//收信箱 private Activity activity = null; private String smsContent = "";//验证码 private 

安卓通过广播自动回填短信验证码

每次我们注册一个什么软件的账号时一般都是需要输入 验证码的,然后验证码需要通过短信的接收才可以看得到 那么问题来了.短信接收到,我们可以直接将验证码填入 需要填入的输入框里面去. 接下来贴代码时刻 声明部分 private BroadcastReceiver smsReceiver;// 定义一个广播接收器 private IntentFilter filter2;// private EditText editCaptcha;// 短信自动填入框 private String strConte

android自动填写短信验证码

广播类 package com.examp.azuoyoutong.listner; import java.util.regex.Matcher;import java.util.regex.Pattern; import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.telephony.SmsMessage;import

android发送短信验证码并自动获取验证码填充文本框

android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框. 一.接入短信平台 首先需要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com), 两分钟申请测试账号,赠送了100条测试短信. android使用java的jar包即可开发 jar下载: http://smsow.zhenzikj.com/doc/sdk.html API文档:http://smsow.zhenzikj.com/doc/java_sdk_doc.html 使用

安卓观察者ContentObserver模式用正则获取短信验证码

/*-------------------------包含头文件------------------------------------*/ #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> int count=0; /*-------------------------结构体定义部分------------------------------*/ typed