手机收到验证码短信后,程序自动识别验证码并填充验证码输入框。

思路是有了,实现的方式也有多种:

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自动读取短信验证码的更多相关文章

  1. Android自动读取短信验证码

    Android自动读取短信验证码  extends:http://www.cnblogs.com/jiayaguang/p/4366384.html,http://blog.csdn.net/yung ...

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

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

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

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

  4. android自动填写短信验证码

    广播类 package com.examp.azuoyoutong.listner; import java.util.regex.Matcher;import java.util.regex.Pat ...

  5. android自动填充短信验证码

    自动拦截短信实际上就是在系统注册一个BroadcastReceiver,然后通过设置拦截短信的: filter.addAction("android.provider.Telephony.S ...

  6. iOS开发——自动填充短信验证码

    苹果在iOS 12,改进了一个很人性化的小细节.在做短信验证码功能的时候,自动获取短信中的验证码,然后点击填充即可.不用再向之前那样麻烦,自己看到弹出的短信信息后,死记硬背,再一个个敲上去,害怕背错了 ...

  7. android中如何自动获取短信验证码

    package com.loaderman.smsbroadcastreceiver; import java.util.regex.Matcher; import java.util.regex.P ...

  8. android发送短信验证码并自动获取验证码填充文本框

    android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框. 一.接入短信平台 首先需要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com) ...

  9. <自动化测试>之<自动获取手机短信验证码>

    第一次写博,最近解决了做自动化测试短信验证码自动获取填入的方法减少了脚本的人工干预,并非拦截短信,所以不存在安全警报提醒,拿出来分享给大家,有感兴趣的大家可以加Q1856100 目前在职测试开发,,写 ...

随机推荐

  1. js中的面向对象入门

    什么是对象 我们先来看高程三中是如何对对象进行定义的 "无序属性的集合,其属性可以包括基本值.对象或者函数",对象是一组没有特定顺序的的值.对象的没个属性或方法都有一个俄名字,每个 ...

  2. 2017-3-2 C#基础 结构体

    1. 结构体:用户自定义类型定义位置:定义在Main函数的外面,类的里面 定义格式:struct 自定义名字{ public 数据类型 名字; public 数据类型 名字; ... ...} 声明实 ...

  3. 全文搜索 Contains 与like 的区别

    全文搜索:是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式. ...

  4. 【2017-02-23】switch...case...和for循环

    1.代码简化折叠: #region 标题 ... ... #endregion 一.switch...case... 1.格式 switch(变量){ case 值:代码段;break; case 值 ...

  5. NSTimer定时器进阶——详细介绍,循环引用分析与解决

    引言 定时器:A timer waits until a certain time interval has elapsed and then fires, sending a specified m ...

  6. JavaScript学习12 JS中定义对象的几种方式【转】

    avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...

  7. 当前最上层的视图控制器vc 和 当前最上层的导航控制器nav

    在处理 URL Router 跳转的时候,我们经常需要得到 当前最上层的视图控制器 和 当前最上层的导航控制器 来进行视图跳转或者方法调用.- (UIViewController *)currentV ...

  8. android国际化

    语言的国际化 为了提供不同语言的版本,只需要在res中新建几个values文件夹就行 不过文件夹有自己的命名规则 values-语言代码-r国家或者地区的代码 然后我们只需要将不同语言的string. ...

  9. django进阶-3

    先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin, 使界面更牛逼 数据库表结构: app01/models.py from django.db import models ...

  10. 完全关闭IIS日志,包括System32下的LogFile

    早上突然发现网站访问不了了,登陆服务器一看,是C盘满了. 查一看,是IIS产生了70多G的日志,但明明已关闭日志了,还是会产生. 产生的目录在:C:\Windows\System32\LogFiles ...