Android自动读取短信验证码
Android自动读取短信验证码
实现自动获取手机的短信验证码,原理通过监听短信数据库的变化来解析短信,获取验证码。
直接附上代码:
1.建立一个监听数据库的类
import java.util.regex.Matcher;
import java.util.regex.Pattern; import android.app.Activity;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.widget.EditText; /**
* 监听短信数据库,自动获取短信验证码
*
* @author 贾亚光
* @date 2015-3-25
*
*/
public class AutoGetCode extends ContentObserver {
private Cursor cursor = null;
private Activity activity; private String smsContent = "";
private EditText editText = null; public AutoGetCode(Activity activity, Handler handler, EditText edittext) {
super(handler);
this.activity = activity;
this.editText = edittext;
} @Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// 读取收件箱中指定号码的短信
cursor = activity.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) {
cursor.moveToFirst();
if (cursor.moveToFirst()) {
String smsbody = cursor
.getString(cursor.getColumnIndex("body"));
String regEx = "(?<![0-9])([0-9]{" + 6 + "})(?![0-9])";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(smsbody.toString());
while (m.find()) {
smsContent = m.group();
editText.setText(smsContent);
}
}
}
}
/**
* 从短信字符窜提取验证码
* @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;
}
}
2.在使用的时候在activity中注册
AutoGetCode autoGetCode = new AutoGetCode(RegistCode.this, new Handler(),
regist_code);//regist_code 要显示验证码的EditText
// 注册短信变化监听
this.getContentResolver().registerContentObserver(
Uri.parse("content://sms/"), true, autoGetCode);
3.在合适的地方取消注册
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
this.getContentResolver().unregisterContentObserver(autoGetCode);
}
4.最后别忘记了添加权限
<!-- 读写短信的权限 -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
这样就可以了。
参考资料:
http://blog.sina.com.cn/s/blog_87dc03ea0101dvus.html
http://www.it165.net/pro/html/201406/15300.html
Android自动读取短信验证码的更多相关文章
- android自动获取短信验证码
前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码.主要就是实时获取短信信息.android上获 ...
- android自动填写短信验证码
广播类 package com.examp.azuoyoutong.listner; import java.util.regex.Matcher;import java.util.regex.Pat ...
- android自动填充短信验证码
自动拦截短信实际上就是在系统注册一个BroadcastReceiver,然后通过设置拦截短信的: filter.addAction("android.provider.Telephony.S ...
- Andorid自动读取短信验证码
手机收到验证码短信后,程序自动识别验证码并填充验证码输入框. 思路是有了,实现的方式也有多种: 1.开启一个线程,隔一段时间就去查询收件箱是否有变化,有变化再读取出来做处理. 2.注册一个短信变化的广 ...
- Android开发之短信验证码示例
在说Android中的短信验证码这个知识点前,我们首先来了解下聚合数据 聚合数据介绍 聚合数据是一家国内最大的基础数据API提供商,专业从事互联网数据服务.免费提供从天气查询.空气质量.地图坐标到金融 ...
- 转载:Android自动化测试- 自动获取短信验证码
前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码. 主要就是实时获取短信信息. android ...
- iOS开发——自动填充短信验证码
苹果在iOS 12,改进了一个很人性化的小细节.在做短信验证码功能的时候,自动获取短信中的验证码,然后点击填充即可.不用再向之前那样麻烦,自己看到弹出的短信信息后,死记硬背,再一个个敲上去,害怕背错了 ...
- Android蓝牙读取短信调研
对“直接通过蓝牙来获取连接手机的短信信息”这个需求做了一些技术调研,如下是调研过程中的一些记录. 1.无法得到BluetoothMasClient类 在文章https://blog.csdn.net/ ...
- android中如何自动获取短信验证码
package com.loaderman.smsbroadcastreceiver; import java.util.regex.Matcher; import java.util.regex.P ...
随机推荐
- java基础复习二——面向对象一
面向对象三大特性:封装,继承,多态 类:对象的蓝图,生成对象的模板,是对一类事物的描述,是抽象的概念上的定义 对象:是实际存在的该类事物的每个个体,也称为实例 类之间三种关系:依赖关系(uses-a) ...
- [mysql] 随机查询 效率比较
select primary_count as primaryCount, primary_score as primaryScore, junior_count as juniorCount, ju ...
- c++中的前向声明
整理于: http://blog.csdn.net/heyutao007/article/details/6649741 http://blog.sina.com.cn/s/blog_68d90fdb ...
- 【转】C# 调用WebService的方法
很少用C#动态的去调用Web Service,一般都是通过添加引用的方式,这样的话是自动成了代理,那么动态代理调用就是我们通过代码去调用这个WSDL,然后自己去生成客户端代理.更多的内容可以看下面的两 ...
- Json---Windows下使用Jsoncpp
上述Json解析使用的是Jsoncpp,要使用Jsoncpp,得做如下几步的配置: 1. 首先从http://sourceforge.net/projects/jsoncpp/下载,压缩包大约105k ...
- C++ 数据封装
C++ 数据封装所有的 C++ 程序都有以下两个基本要素: 程序语句(代码):这是程序中执行动作的部分,它们被称为函数.程序数据:数据是程序的信息,会受到程序函数的影响.封装是面向对象编程中的把数据和 ...
- dm8127前段采集和抓拍
高清监控(944275216) 2014-1-17 9:36:24自主研发高清网络摄像机,720P.960P.1080P系列产品,经济型.低照型.宽动态型等各种机型可选,支持onvif.P2 ...
- linux -- Ubuntu Server 安装图形界面
1.连接网络,你一定要确保网络通畅,如果你和我一样使用Wireless,那先找根网线插上,因为下面的安装都要通过网络下载组件的. 2.进入图形界面的命令是startX,敲击后会有安装xinit的提示. ...
- 使用GitHub和Eclipse进行javaEE开发步骤
下载Git客户端:链接:http://pan.baidu.com/s/1jIueUEy 密码:7gef; 下载Eclipse javaee客户端:http://www.eclipse.org/down ...
- 【python】通过代理安装包
1.安装setuptools 支持 pip install 或easy_install 2.在终端执行 set HTTP_PROXY=http://your.proxy.com:yourPort se ...