Andorid自动读取短信验证码
手机收到验证码短信后,程序自动识别验证码并填充验证码输入框。
思路是有了,实现的方式也有多种:
1、开启一个线程,隔一段时间就去查询收件箱是否有变化,有变化再读取出来做处理。
2、注册一个短信变化的广播,收到广播后再去读取出来做处理。
3、通过ContentObserver(内容观察者)来捕获特定Uri的变化。
方案1,显然不可以取,太耗资源。
方案2,实际应用起来是会有问题的,因为短信的广播是有序广播,假如有其他应用先捕获广播并终止传递,那么我们就永远也收不到这条短信变化的广播了。
所以,综合比较起来,方案3比较可取。经过笔者实践也是没有问题的。
先来点介绍性文字吧。
“ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。”
下面给出方案3的关键性代码:
public class SmsObserver extends ContentObserver{ private Context mContext;
private Handler mHandler; public SmsObserver(Context context,Handler handler) {
super(handler);
this.mContext = context;
this.mHandler = handler;
} @Override
public void onChange(boolean selfChange) {
super.onChange(selfChange); String code = ""; Uri inBoxUri = Uri.parse("content://sms/inbox");
Cursor c = mContext.getContentResolver().query(inBoxUri,null,null,null,"date desc"); if(c != null){
if(c.moveToFirst()){
String address = c.getString(c.getColumnIndex("address"));
String body = c.getString(c.getColumnIndex("body"));
Log.i("TAG","发件人为: " + address + "\n" + "短信内容: " + body); //这里可以写某个电话
// if(!address.equals("+8615210091283")){
// return;
// } Pattern pattern = Pattern.compile("\\d{6}");
Matcher matcher = pattern.matcher(body); if(matcher.find()){
code = matcher.group(0);
mHandler.obtainMessage(MainActivity.MSG_RECEIVED_CODE,code).sendToTarget();
}
}
c.close();
}
}
}
public class MainActivity extends Activity { private SmsObserver mObserver;
private EditText mEtReceive;
public static final int MSG_RECEIVED_CODE = 1; private Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what == MSG_RECEIVED_CODE){
String code = (String)msg.obj;
mEtReceive.setText(code);
}
};
};
private Uri uri; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mEtReceive = (EditText)findViewById(R.id.et_receive); mObserver = new SmsObserver(MainActivity.this,mHandler);
uri = Uri.parse("content://sms");
getContentResolver().registerContentObserver(uri,true,mObserver);
} @Override
protected void onPause() {
super.onPause();
getContentResolver().unregisterContentObserver(mObserver);
} @Override
protected void onResume() {
super.onResume();
getContentResolver().registerContentObserver(uri,true,mObserver);
}
}
Andorid自动读取短信验证码的更多相关文章
- Android自动读取短信验证码
Android自动读取短信验证码 extends:http://www.cnblogs.com/jiayaguang/p/4366384.html,http://blog.csdn.net/yung ...
- 转载:Android自动化测试- 自动获取短信验证码
前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码. 主要就是实时获取短信信息. 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 ...
- iOS开发——自动填充短信验证码
苹果在iOS 12,改进了一个很人性化的小细节.在做短信验证码功能的时候,自动获取短信中的验证码,然后点击填充即可.不用再向之前那样麻烦,自己看到弹出的短信信息后,死记硬背,再一个个敲上去,害怕背错了 ...
- android中如何自动获取短信验证码
package com.loaderman.smsbroadcastreceiver; import java.util.regex.Matcher; import java.util.regex.P ...
- android发送短信验证码并自动获取验证码填充文本框
android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框. 一.接入短信平台 首先需要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com) ...
- <自动化测试>之<自动获取手机短信验证码>
第一次写博,最近解决了做自动化测试短信验证码自动获取填入的方法减少了脚本的人工干预,并非拦截短信,所以不存在安全警报提醒,拿出来分享给大家,有感兴趣的大家可以加Q1856100 目前在职测试开发,,写 ...
随机推荐
- mac环境下mentohust锐捷登录配置
今天测试react native嵌入原生项目,账号流量恰好用完,想换同学账号却不会更改配置,以至于被网络弄得头疼了一中午.于是,好好研究了一下这个mentohust 一.需要下载的文件 我已经全部整理 ...
- 学习接水系统(java+thread线程)
(一)项目框架分析 对于学生并发接水项目,根据面向对象的思想,需要创建两个对象,即学生和水龙头. 接下来主要讲解不排队接水和排队接水两张情况. 项目的目录文件如下: (二)不排队接水 假设有四个学生小 ...
- web前端的发展态势 浅识
以前 作为一个java程序员写的代码主要还是后台的代码,虽然开始的时候前后端都写,但是也是用别人造好的轮子来用,学学html,css,js,jquery,再找一个前端ui框架学学,上手之后我们就可以写 ...
- Kubernetes运维生态-Heapster分析
Heapster在Kubernetes的运维生态中如下:集群的容器的监控数据收敛汇聚层 heapster1.0版本后内部分为event和metric两个进程,可制作为两个docker镜像部署为两个独立 ...
- Hibernate一对一外键映射
Hibernate 一对一外键映射 ------------------------------ ----- ...
- asp.net 将ppt,word转化为pdf实现在线浏览详解
1.首先添加应用:COM里面的Micsosoft Office 12.0 Object Library(VS2013基本都有14.0或者15.0 有的话一样的添加,因为我的没有只有12.0) : 2. ...
- Docker存储驱动之OverlayFS简介
简介 OverlayFS是一种和AUFS很类似的文件系统,与AUFS相比,OverlayFS有以下特性: 1) 更简单地设计: 2) 从3.18开始,就进入了Linux内核主线: 3) 可能更快一些. ...
- observe.js 源码 学习笔记
/** * observejs --- By dnt http://kmdjs.github.io/ * Github: https://github.com/kmdjs/observejs * MI ...
- ThinkPhp模板转Flask模板
Template Converter 网上的PHP资源很多,项目要用Python,所以想起做一个模板转换器,从ThinkPhp转成Flask的Jinja模板. 直接指定两个目录,将目录下的模板文件转换 ...
- APUE学习心得
APUE学习心得 Chapter 3 IO 3.2 文件描述符 文件描述符是一个非负整数.当打开 一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符.0 标准输入,1 标准输出, 2 标准错 ...