近期做注冊的时候看到非常多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模式获取短信用正则自己主动填充验证码的更多相关文章

  1. 内容观察者 ContentObserver 监听短信、通话记录数据库 挂断来电

    Activity public class MainActivity extends ListActivity {     private TextView tv_info;     private  ...

  2. android获取短信并自动填充

    package com.velo.quanquan.util; import java.util.regex.Matcher; import java.util.regex.Pattern; impo ...

  3. jQuery获取短信验证码+倒计时实现

    jQuery 短信验证码倒计时 <script type="text/javascript" charset="utf-8"> $(function ...

  4. 转载:Android自动化测试- 自动获取短信验证码

    前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码. 主要就是实时获取短信信息. android ...

  5. android自动获取短信验证码

    前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码.主要就是实时获取短信信息.android上获 ...

  6. 基于jquery的-获取短信验证码-倒计时

    在制作短信验证的时候,需要做一个获取短信按钮,点击后显示倒计时, html代码如下: <input class="gain" type="button" ...

  7. PHP获取短信验证码

    PHP如何获取短信验证码?以下是创蓝253短信平台下的PHP接口代码案例:   <?php header("Content-type:text/html; charset=UTF-8& ...

  8. iOS点击获取短信验证码按钮

    概述 iOS点击获取短信验证码按钮, 由于 Demo整体测试运行效果 , 整个修改密码界面都已展现, 并附送正则表达式及修改密码逻辑. 详细 代码下载:http://www.demodashi.com ...

  9. python+pymssql+selenium 获取短信验证码登录(实战练习)

    登录页面输入手机号, 获取短信验证码(验证码有10分钟有效期) 1 连接sql server数据库,获取10分钟之内的有效短信验证码 2 页面输入手机号,并获取验证码.若存在有效验证码则输入验证码,若 ...

随机推荐

  1. Js中遇到的坑点汇总

    一.Android 手机下输入框获取焦点时, 输入法挡住输入框的 bug 解决思路: 1.去掉overflow属性 2. Android 手机下, input 或 textarea 元素聚焦时, 主动 ...

  2. 字符串格式化输出、while循环、运算符、编码

    1.字符串格式化输出 %占位符: %s => 字符串 %d=>整数型 %%=>转义 普通的% %()不能多,不能少,一一对应 f"{}"大括号里的内容一般都放变量 ...

  3. 服务器搭建域控与SQL Server的AlwaysOn环境过程(三)配置故障转移

    0 引言 主要讲述如何搭建故障转移集群,因为AlwaysOn是基于Windows的故障转移集群的. 在讲解步骤之前需要了解一下故障转移集群仲裁配置 下面图片来自<Windows Server20 ...

  4. HDU-5025 Saving Tang Monk 广度搜索 状态压缩

    题目链接:https://cn.vjudge.net/problem/HDU-5025 题意 救唐僧,路上有m(<=9)把钥匙,最多5条蛇和一个唐僧. 目标是前往唐僧的地方,用全部钥匙打开全部的 ...

  5. 高并发web系统设计

    转载自:http://blog.csdn.net/qq_26562641/article/details/53170913 一.一般高并发web系统这里的一般指的是秒杀之类的电子商务系统,比如说小米抢 ...

  6. ajax前台传到后台乱码,显示问号的问题

    response.setContentType("text/html;charset=gbk"); response.setHeader("Cache-Control&q ...

  7. Qt之滚动字幕

    简述 滚动字幕,也就是传说中的跑马灯效果. ​简单地理解就是:每隔一段时间(一般几百毫秒效果较佳)显示的文字进行变化(即滚动效果). 简述 实现 效果 源码 实现 利用定时器QTimer,在固定的时间 ...

  8. hadoop-11-ambari-server安装

    hadoop-11-ambari-server安装 #ambari 安装yum install ambari-servercd mysql-5.7.18/cp mysql-connector-java ...

  9. [React] React.PureComponent

    React.PureComponent is similar to React.Component. The difference between them is that React.Compone ...

  10. 直接插入排序(Straight Insertion Sort)

    直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表. /* 对顺序表L作直接插入排序 */ void ...