安卓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
最新文章
- 解决报错 ora-00704 ora-00604 ora-00942 启动不了数据库问题
- jquery工具方法swap
- grafana日志分析界面及导出的json文件
- ajax跳转传参
- Web前端开发十日谈
- Python读取Excel数据
- python_在windows下安装配置python开发环境及Ulipad开发工具
- CSS学习笔记之CSS的继承、层叠和特殊性
- mysql的并发处理机制_下篇
- Gitlab_服务器安装配置
- 外观模式facade
- Linux 下的 python 虚拟环境 + vim快捷方式
- 我的linux部署nginx步骤记录
- New Journey--工作五年所思所感小记
- [转]VUE优秀UI组件库合集
- SSH框架下载地址
- Django ImportError 模块路径正确,且将文件夹设置为Source Root
- nexus docker 私有镜像处理
- iOS开发调试技巧总结(持续更新中)
- Linux 创建Bridge