当前位置: 开源爱好者 » 编程教程 » Java教程 » 正文

Java监听短信验证码并用正则提取验证码

 本Java源码主要演示监听 短信中的验证码,并对验证码进行处理,得到应用,将验证码经过正则表达式过滤,提取并传值到下一个环节,本代码来自于Java,代码如下:

package com.lzy.automaticinputmsgcode.db.observer;
//www.srcfans.com
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.lzy.automaticinputmsgcode.common.Constant;
import android.annotation.SuppressLint;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.util.Log;
public class SmsObserver extends ContentObserver {
	private Context mContext;
	private Handler mHandler;
	/**
	 * 构造方法:用于传值
	 *
	 * @param context
	 * @param handler
	 */
	public SmsObserver(Context context, Handler handler) {
		super(handler);
		this.mHandler = handler;
		this.mContext = context;
	}
	@SuppressLint("NewApi")
	@Override
	public void onChange(boolean selfChange, Uri uri) {
		super.onChange(selfChange, uri);
		String code = "";
		Log.e("SMS has changed!!", uri.toString());
		/**
		 * 当我们第一次监听到短信变化时,短信还没有写入到数据库,所以在此不应该做任何的操作,直接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) {
			/**
			 * 判断收件箱是不是为空,即是利用cursor.moveToFirst()
			 */
			if (cursor.moveToFirst()) {
				// 读取到发件人
				String address = cursor.getString(cursor
						.getColumnIndex("address"));
				// 读取到短信的内容
				String body = cursor.getString(cursor.getColumnIndex("body"));
				Log.e("", "发件人为:" + address + "发信内容为:" + body);
				/**
				 * 当然我们还可以对这个程序做些修改,比如我只想接收10086发来的短信验证或者我只想接收“点融网”发来的短信
				 */
				// if (!address.equals("10086")) {
				// return;
				// }
				/**
				 * "点融网"的短信发送号码
				 */
				// if (!address.equals("10690570000334")) {
				//         return;
				// }
				/**
				 * 这个正则表达式的含义为:提取短信中连续6个数字的内容(这是因为验证 码一般为6位,当然这个是可以根据项目变化的)
				 */
				Pattern pattern = Pattern.compile("[0-9]{6}");
				Matcher matcher = pattern.matcher(body);
				/**
				 * 如果这条正则表达式能够成功匹配,就提取短信验证码
				 */
				if (matcher.find()) {
					// 为什么是0呢?因为这是第一个matcher中的内容
					code = matcher.group(0);
					// 在日志中打印
					Log.e("提取到的验证码", "提取到的验证码为:" + code);
					// 用Handler发送消息:在非UI线程更新UI
					mHandler.obtainMessage(Constant.MSG_RECEIVED_CODE, code)
							.sendToTarget();
				}
			}
			cursor.close();
		}
	}
}
相关内容:

CopyRight 2015© 开源爱好者 All Rights Reserved 豫ICP备16030607号 隐私声明 网站地图