安卓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就不写了呵呵这里非常清楚也非常easy..不喜勿喷。有错回帖。转载必备 尊重作者-yung7086
安卓ContentObserver模式获取短信用正则自己主动填充验证码的更多相关文章
- 内容观察者 ContentObserver 监听短信、通话记录数据库 挂断来电
		
Activity public class MainActivity extends ListActivity { private TextView tv_info; private ...
 - android获取短信并自动填充
		
package com.velo.quanquan.util; import java.util.regex.Matcher; import java.util.regex.Pattern; impo ...
 - jQuery获取短信验证码+倒计时实现
		
jQuery 短信验证码倒计时 <script type="text/javascript" charset="utf-8"> $(function ...
 - 转载:Android自动化测试- 自动获取短信验证码
		
前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码. 主要就是实时获取短信信息. android ...
 - android自动获取短信验证码
		
前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码.主要就是实时获取短信信息.android上获 ...
 - 基于jquery的-获取短信验证码-倒计时
		
在制作短信验证的时候,需要做一个获取短信按钮,点击后显示倒计时, html代码如下: <input class="gain" type="button" ...
 - PHP获取短信验证码
		
PHP如何获取短信验证码?以下是创蓝253短信平台下的PHP接口代码案例: <?php header("Content-type:text/html; charset=UTF-8& ...
 - iOS点击获取短信验证码按钮
		
概述 iOS点击获取短信验证码按钮, 由于 Demo整体测试运行效果 , 整个修改密码界面都已展现, 并附送正则表达式及修改密码逻辑. 详细 代码下载:http://www.demodashi.com ...
 - python+pymssql+selenium 获取短信验证码登录(实战练习)
		
登录页面输入手机号, 获取短信验证码(验证码有10分钟有效期) 1 连接sql server数据库,获取10分钟之内的有效短信验证码 2 页面输入手机号,并获取验证码.若存在有效验证码则输入验证码,若 ...
 
随机推荐
- 在网页html中嵌入特殊字体
			
1.字体格式 .EOT,适用于Internet Explorer 4.0+ .TTF或.OTF,适用于Firefox 3.5.Safari.Opera .SVG,适用于Chrome.IPhone 最常 ...
 - css文字超出变省略号...
			
<style>.text1 { width:200px; overflow:hidden; text-overflow:ellipsis; -o-text-over ...
 - ActiveMQ学习笔记(15)----Message Dispatch高级特性(一)
			
1. Message Cursors 1.1 概述 ActiveMQ发送持久化消息的典型的厝里方式是:当消息的消费者准备就绪时,消息发送系统把存储的消息按批次发送给消费者,在发送完一个批次的消息后,指 ...
 - camke 参数
			
cmake -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32 \ -DMYSQL_DATADIR=/application/mysql-5.5.32 ...
 - Visual Studio 2013 无法创建MVC项目,系统找不到指定的文件.(Exception from HRESULT:08x0070002)
			
在Visual Studio 2013中创建新MVC项目,(PS:现在创建个MVC项目,差点都找不到在哪,汗!-) 确定后提示,系统找不到指定的文件.(Exception from HRESULT:0 ...
 - Qt之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)
			
简述 QBoxLayout可以在水平方向或垂直方向上排列控件,由QHBoxLayout.QVBoxLayout所继承. QHBoxLayout:水平布局,在水平方向上排列控件,即:左右排列. QVBo ...
 - scratchIDE使用说明
			
scratchIDE使用说明
 - Struts2标签库整理【完整】
			
转自:https://blog.csdn.net/chen_zw/article/details/8161230 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,str ...
 - 机器学习(一) K-means聚类
			
聚类算法K-means是硬聚类算法,是目标函数聚类算法的代表.K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小.算法采用误差平方和准则函数作为聚 ...
 - UVa 12661 Funny Car Racing【 dijkstra 】
			
题意:给出n个点,m条路,每条路用5个整数表示u,v,a,b,t u表示这条路的起点,v表示终点,a表示打开时间,b表示关闭时间,t表示通过这条道路需要的时间 看的紫书,因为边权不再仅仅是路上的时间, ...