Android采取ContentObserver方式自动获取验证码

Android 自动获取验证码的两种方式分别是BroadcastReceiver及ContentObserver,两种方式都需要进行注册、取消注册两个步骤
记得添加权限,本文介绍ContentObserver方式。

照旧先上ContentObserver代码

/**
 * Created by weifeiyang on 2016/7/29 0029.
 */

import android.app.Activity;
import android.content.SharedPreferences;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.text.TextUtils;
import android.widget.EditText;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 读取短信验证码,并设置验证码
 * Created by cool on 2016/1/4.
 */
public class ReadSmsContent extends ContentObserver {
 private Cursor cursor = null;
 private Activity mActivity;
 private EditText mEditText;

 public ReadSmsContent(Handler handler, Activity activity, EditText editText) {
  super(handler);
  this.mActivity = activity;
  this.mEditText = editText;
 }

 @Override
 public void onChange(boolean selfChange, Uri uri) {

 /*
  第一次回调 不是我们想要的 直接返回
  目前发现每次收到新短信都会走好几次onChange(),
  可以通过这个方法来使得onChange中的方法只走一次
 */
  if (uri.toString().equals("content://sms/raw")) {
   return;
  }

  /*
   读取收件箱中的短信

   address 发件人手机号码:
   body 信息内容:
   read 是否查看:
   date 发送时间:
   */
  cursor = mActivity.getContentResolver().query(Uri.parse("content://sms/inbox"),
    new String[]{"_id", "address", "body", "read"}, null, null, "_id desc");//按降序排列

//  指定号码
//  mActivity.managedQuery(Uri.parse("content://sms/inbox"),
//    new String[]{"_id", "address", "body", "read"}, "address=? and read=?", new String[]{"10086", "0"}, "_id desc");

  if (null != cursor && cursor.getCount() > 0) {
   cursor.moveToNext();//指向首位
   int smsbodyColumn = cursor.getColumnIndex("body");//body位置
   String smsBody = cursor.getString(smsbodyColumn);//获取内容
   String verifyCode = getDynamicPassword(smsBody);
   if (TextUtils.isEmpty(verifyCode)) {
    return;
   }
   if (mEditText == null) {
    throw new RuntimeException("你传的EditText为空");
   }
   if (verifyCode.contains("你从服务器上获取到的验证码"))) {
    mEditText.setText(verifyCode);
    //EditText获取焦点,3个属性必须同时设置
    mEditText.setFocusable(true);
    mEditText.setFocusableInTouchMode(true);
    mEditText.requestFocus();
    mEditText.setSelection(verifyCode.length());//设置光标位置
   }

  }
  if (!cursor.isClosed()) {
   cursor.close();
  }
 }

 /**
  * 从字符串中截取连续4位数字
  * 用于从短信中获取动态密码
  *
  * @param str 短信内容
  * @return 截取得到的4位动态密码
  */
 public static String getDynamicPassword(String str) {
  Pattern continuousNumberPattern = Pattern.compile("[0-9\\.]+");
  Matcher m = continuousNumberPattern.matcher(str);
  String dynamicPassword = "";
  while (m.find()) {
   if (m.group().length() == 4) {
    dynamicPassword = m.group();
   }
  }

  return dynamicPassword;
 }
}

观察者有了后就可以使用了,在activity或者fragment的onCreate方法中调用initSmSContentObserver()进行注册,在onDestroy()中通过
//注销内容监听者
this.getContentResolver().unregisterContentObserver(readSmsContent);
取消注册

 /**
  * 初始化短信监听数据库
  */
 private void initSmSContentObserver() {
  readSmsContent = new ReadSmsContent(new Handler(), this, seCodeEditText);
  //注册短信内容监听
  this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, readSmsContent);

 }

上述两种方式获取到短信后,目前由于短信平台来源账号不固定,因此是通过验证码进行校验。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 中使用ContentObserver模式获取短信用正则自动填充验证码

    最近做注册的时候看到很多app在手机接受到短信的时候直接填写验证码到界面省略用户自动输入,感觉这样确实蛮人性化的呵呵,于是自己也做了一个 步骤: 首先我使用了ContentObserver监听短信,(最好知道您的验证码从那个号码发过来) 然后从短信中用正则的分组去拿到验证码(当然验证码必须是什么格式) 贴出关键代码: 注册监听短信数据库的  ContentObserver c=new ContentObserver(han) { @Override public void onChange(bo

  • Android 使用ContentObserver监听数据库内容是否更改

    Android 使用ContentObserver监听数据库内容是否更改 ContentObserver--内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它.触发器分为表触发器.行触发器,相应地ContentObserver也分为"表"ContentObserver."行"ContentObserver,当然这是与它所

  • 详解Android开发中ContentObserver类的使用

    ContentObserver--内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于 数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它.触发器分为表触发器.行触发器, 相应地ContentObserver也分为"表"ContentObserver."行"ContentObserver,当然这是与它所监听的Uri MIME Type有关的. 熟悉Content Prov

  • Android采取ContentObserver方式自动获取验证码

    Android 自动获取验证码的两种方式分别是BroadcastReceiver及ContentObserver,两种方式都需要进行注册.取消注册两个步骤 记得添加权限,本文介绍ContentObserver方式. 照旧先上ContentObserver代码 /** * Created by weifeiyang on 2016/7/29 0029. */ import android.app.Activity; import android.content.SharedPreferences;

  • Android采取BroadcastReceiver方式自动获取验证码

    Android 自动获取验证码的两种方式分别是BroadcastReceiver及ContentObserver,两种方式都需要进行注册.取消注册两个步骤 记得添加权限,本文先介绍其中一种. <uses-permission android:name="android.permission.RECEIVE_SMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORA

  • Android手机注册登录时获取验证码之后倒计时功能(知识点总结)

    app注册界面经常会遇到一个场景:手机注册,点击获取验证码,验证码发送成功之后,开始倒计时 具体代码如下所示: private TimerTask timerTask; private Timer timer; private int time = 5000;//五秒 private int timess; /** * 开始倒计时 */ private void startTimer() { timess = time/1000; tvTime.setText(timess+"S");

  • Android如何通过手机自动获取短信验证码

    本文实例为大家分享了Android实现手机自动获取短信验证码功能,供大家参考,具体内容如下 1.短信监听广播 2.读取短信内容 3.截取短信内容[可以 reg截取] 4.填写至相应控件 PS:DevStore测试没有获取到验证码 源码片段 public class MainActivity extends Activity { private BroadcastReceiver smsReceiver; private IntentFilter filter2; private Handler

  • Android注册登录实时自动获取短信验证码

    android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码. 主要就是实时获取短信信息. android上获取短信信息主要有BroadcastReceiver方式与数据库方式,要实时的话就BroadcastReceiver比较方便,分享一篇文章大家可以查看一下,点击. public class SMSReceiver extends BroadcastReceiver{ private String ver

  • Android自动获取短信验证码功能

    先给大家展示下效果图,如果大家感觉不错,请参考实现代码. 1.自定义监听类 /** * 短信监听器,用于自动填充验证码 */ public class SMSContentObserver extends ContentObserver { public final String SMS_URI_INBOX = "content://sms/inbox";//收信箱 private Activity activity = null; private String smsContent

  • Android自动获取输入短信验证码库AutoVerifyCode详解

    一.简介 Android的短信验证码自动输入库,内嵌自动申请权限,兼容性高,支持多项配置. 短信验证码长度 验证码类型(大写字母.小写字母.大小写字母.数字.数字字母) 短信内容过滤 发送者号码过滤 短信权限回调,失败重新操作等等 消息回调,可自行处理 Github地址: https://github.com/tpnet/AutoVerifyCode 二.使用 2.1 最简单的使用 适用在验证码为数字,而且验证码为4-6位. AutoVerifyCode.getInstance() .with(

  • Android利用CursorLoader实现短信验证码自动填写

    概述 Android上实现短信验证码自动填写,常用的有两种方式.一种是利用BroadCastReceiver,还有一种是监听手机上短信数据库的变化.利用BroadCastReceiver来实现会在一些情况下无效,最常见的就是手机上安装了具有垃圾短信拦截功能的软件的情况下,短信验证码自动填写无效.所以,现在一般会选用监听数据库内容变化的方式来实现短信验证码自动填写. 网上对于利用监听数据库内容变化来实现短信验证码自动填写的文章也很多,主要分为一下步骤: 1. 继承ContentObserver实现

  • Android获取验证码倒计时显示效果

    前面为大家讲过计时器的顺时针的两种方法,在录制视频等操作中颇有使用,今天就给大家带来倒计时实现的两种方式. 虽然最近写的都比较简单和基础,不过简单不代表熟悉,基础不代表就会,大牛绕过,哈,中牛小牛也可以绕过,这个是写给初学者的. 先搞个效果图. 代码实现方式也超级简单啦,这里首推第一种实现方式,而且也是比较适合大家的,就是通过直接继承CountDownTimer来实现. 对于CountDownTimer这个类很简单,继承它的时候必须重写构造方法和实现其虚拟方法. 构造方法的两个参数分别是(倒计时

随机推荐