安卓ContentObserver模式获取短信用正则自动填充验证码

最近做注册的时候看到很多app在手机接受到短信的时候直接填写验证码到界面省略用户自动输入,感觉这样确实蛮人性化的呵呵,于是自己也做了一个

步骤:

首先我使用了ContentObserver监听短信,(最好知道您的验证码从那个号码发过来)

然后从短信中用正则的分组去拿到验证码(当然验证码必须是什么格式)

贴出关键代码:

注册监听短信数据库的  

	
ContentObserver c=new ContentObserver(han) {
				@Override
				public void onChange(boolean selfChange) {
					// TODO Auto-generated method stub
					super.onChange(selfChange);
					han.sendEmptyMessage(0);
				}
			};
getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, c);


Handler han = new Handler() {
		@SuppressWarnings("deprecation")
		public void handleMessage(android.os.Message msg) {
			String codestr = null;
			try {
				codestr = Cus_UnitTools.getsmsyzm(Reg_ForgetPassword.this);
				code.setText(codestr);
				requestcode();
			} catch (Exception e) {
				Log.e("yung", "验证码提取失败:" + codestr);
			}
		};
	};	

	public static String getsmsyzm(Activity c) {
		Uri uri = Uri.parse("content://sms/inbox");
		String[] projection = new String[] { "address", "person", "body" };
		String selection = " address='" + JTPHONE + "' ";
		String[] selectionArgs = new String[] {};
		String sortOrder = "date desc";
		@SuppressWarnings("deprecation")
		Cursor cur = c.managedQuery(uri, projection, selection, selectionArgs,
				sortOrder);
		if(cur!=null&&cur.getCount()>0){
			cur.moveToFirst();
			String body = cur.getString(cur.getColumnIndex("body")).replaceAll(
					"\n", " ");
			cur.close();
			return getyzm(body, YZMLENGTH);
	}
		cur.close();
		return null;
	}


        /**
	 * 从短信字符窜提取验证码
	 * @param body 短信内容 
         * @param YZMLENGTH  验证码的长度 一般6位或者4位
	 * @return 接取出来的验证码
	 */
	public static String getyzm(String body, int YZMLENGTH) {
		// 首先([a-zA-Z0-9]{YZMLENGTH})是得到一个连续的六位数字字母组合
		// (?<![a-zA-Z0-9])负向断言([0-9]{YZMLENGTH})前面不能有数字
		// (?![a-zA-Z0-9])断言([0-9]{YZMLENGTH})后面不能有数字出现
		Pattern p = Pattern
 				.compile("(?<![a-zA-Z0-9])([a-zA-Z0-9]{" + YZMLENGTH + "})(?![a-zA-Z0-9])");
		Matcher m = p.matcher(body);
		if (m.find()) {
			System.out.println(m.group());
			return m.group(0);
		}
		return null;
	}


//有些验证码是纯数字的那么直接用这个就可以了
//Pattern p = Pattern.compile("(?<![0-9])([0-9]{" + YZMLENGTH+ "})(?![0-9])");
监听完成后记得getContentResolver().unregisterContentObserver(c);注销监听

这样子就可以监听到短信数据库的变化了记住还需要加入权限顺便列出短信权限

    <!-- 发送短信-->

   <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" />

 

 

demo就不写了呵呵这里很清楚也很简单..不喜勿喷,有错回帖,转载必备 尊重作者-yung7086

 

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
获取短信验证码可以通过使用 `android.provider.Telephony.Sms` API 来实现。以下是一个简单的 AutoJS 脚本示例: ```javascript // 设置需要匹配的短信内容 var smsContent = "【XXX】您的验证码是"; // 等待短信到达 var smsObserver = new SmsObserver(function(sms){ if (sms.body.indexOf(smsContent) > -1) { // 提取验证码 var code = sms.body.match(/\d{6}/)[0]; console.log("验证码是:" + code); // 停止观察 smsObserver.unregister(); } }); smsObserver.register(); // 定义短信观察器 function SmsObserver(callback){ var self = this; var contentResolver = context.getContentResolver(); var smsUri = "content://sms/inbox"; var smsCursor = contentResolver.query(android.net.Uri.parse(smsUri), null, null, null, "date desc"); this.register = function(){ contentResolver.registerContentObserver(android.net.Uri.parse(smsUri), true, self.contentObserver); }; this.unregister = function(){ contentResolver.unregisterContentObserver(self.contentObserver); }; this.contentObserver = new android.database.ContentObserver(new android.os.Handler()){ onChange: function(selfChange){ if (smsCursor.moveToFirst()) { var sms = { address: smsCursor.getString(smsCursor.getColumnIndex("address")), body: smsCursor.getString(smsCursor.getColumnIndex("body")), date: smsCursor.getLong(smsCursor.getColumnIndex("date")) }; callback(sms); } } }; } ``` 通过调用 `SmsObserver` 对象的 `register` 方法,可以开始观察收件箱短信的变化。当短信到达时,`SmsObserver` 对象的 `contentObserver` 会被调用,然后提取出短信内容并进行处理。最后,调用 `SmsObserver` 对象的 `unregister` 方法,停止观察收件箱短信的变化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值