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

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

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. PAT---完美数列

    由于数值比较大,选用long型的 先用快速排序方法对数组进行排序,然后进行查找. 用一个问题是所要查找的数可能不在数组中,因此不能用现成的二叉查找法.试着对二叉查找法进行改进,单没调通. 在查找过程中 ...

  2. 【openstack N版】——创建云主机

    一.启动实例 1.1 已准备服务介绍 MySql:为各个服务提供数据存储. RabbitMQ:为各个服务之间通信提供交通枢纽. keystone:为各个服务之间通信提供认证和服务注册. Glance: ...

  3. iOS回顾笔记( 02 ) -- 由九宫格布局引发的一系列“惨案”

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  4. Canada Cup 2016 C. Hidden Word

    C. Hidden Word time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  5. 3997: [TJOI2015]组合数学

    3997: [TJOI2015]组合数学 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 247  Solved: 174[Submit][Status ...

  6. Spring+SpringMVC+MyBatis+easyUI整合基础篇(十一)SVN服务器进阶

    日常啰嗦 上一篇文章<Spring+SpringMVC+MyBatis+easyUI整合基础篇(十)SVN搭建>简单的讲了一下SVN服务器的搭建,并没有详细的介绍配置文件及一些复杂的功能, ...

  7. 记录Winform开发过程中遇到的情况

    前两天开发了个Winform操作Excel和数据库的一个小程序,把Winform的一些东西又给捡了起来,当中又学到了一些新的东西,特来写出来留作纪念. 一.CSKIN美化框架的使用 刚开始做的时候,发 ...

  8. TFS2017代码搜索功能

    当团队或者公司的研发中心的代码库扩展到了一定程度,在代码库中查找一些需要的代码会变的比较困难.比如敏捷模式下的项目小组希望能够找到并重用其他小组开发的一些基础性的功能代码,我们通常需要去找当事人去询问 ...

  9. 【SF】开源的.NET CORE 基础管理系统 - 安装篇

    [SF]开源的.NET CORE 基础管理系统 -系列导航 1.开发必备工具 IDE:VS2017 运行环境:netcoreapp1.1 数据库:SQL Server 2012+ 2.获取最新源代码 ...

  10. ArrayList去除重复元素(包括字符串和自定义对象)

    1.去除重复字符串 package com.online.msym; import java.util.ArrayList; import java.util.Iterator; @SuppressW ...