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 目前在职测试开发,,写 ...
随机推荐
- JavaScript定时器及相关面试题
在单线程JavaScript这篇文章中,在介绍JavaScript单线程的同时,也介绍了setTimeout是如何工作的.但是对于定时器的一些内容,并没有做深入的讨论.这篇文章,会详细说说JS的两种定 ...
- 同一环境下新建Standby RAC库
需求:在同一个环境下新建Standby RAC库,即和Primary RAC在相同的磁盘组. 说明:生产环境一般不建议这样配置DG,因为存储层面是相同磁盘组,灾备的实际意义不大.我这里是用作读写分离. ...
- ES6新属性笔记
一.destructuring--解构赋值 1.数组解构赋值 (1)完全解构 let [a,b,c] = [1,2,3];//普通 console.log(a+":"+b+&quo ...
- 微信小程序之提高应用速度小技巧
作者:vicyao, 腾讯web前端开发 高级工程师商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/294.htm ...
- 软件测试之fault、error和failure的理解
(1) Identify the fault : The first element of the array is not looped. "for(int i=x.length-1;i ...
- 初写Python
#!/usr/bin/env python (指定用什么解释器运行脚本以及解释器所在的位置) # -*- coding:utf-8 -*- (用来指定文件编码为utf-8的) # 无效的内容,只做 ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(十)SVN搭建
日常啰嗦 前面一篇文章讲了一下版本控制,但其实这一篇并没有打算讲细节的,感觉应该自己去动手弄一下,后来考虑了一下,版本控制真的挺重要的,如果自己实在搭建不好反而不去使用的话,真的有点可惜,当然这些话是 ...
- 不懂这些分布式架构、分布式系统的数据一致性解决方案,你如何能找到高新互联网工作呢?强势解析eBay BASE模式、去哪儿及蘑菇街分布式架构
互联网行业是大势所趋,从招聘工资水平即可看出,那么如何提升自我技能,满足互联网行业技能要求?需要以目标为导向,进行技能提升,本文主要针对招聘中高频提及的分布式系统设计.架构(数据一致性)做了分析,祝各 ...
- gitoschina使用入门
1 下载git sudo apt-get install git 2 添加公钥:terminal: ssh-keygen -t rsa -C "git.oschina.net" ...
- lnmp pathinfo问题
location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php/$1 ...