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

 更新时间:2016年11月09日 11:02:28   作者:湖广午王  
这篇文章主要为大家详细介绍了Android利用CursorLoader实现短信验证码自动填写的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

概述

Android上实现短信验证码自动填写,常用的有两种方式。一种是利用BroadCastReceiver,还有一种是监听手机上短信数据库的变化。利用BroadCastReceiver来实现会在一些情况下无效,最常见的就是手机上安装了具有垃圾短信拦截功能的软件的情况下,短信验证码自动填写无效。所以,现在一般会选用监听数据库内容变化的方式来实现短信验证码自动填写。
网上对于利用监听数据库内容变化来实现短信验证码自动填写的文章也很多,主要分为一下步骤:
1. 继承ContentObserver实现一个短信数据库的观察者,再onChange。
2. 在Activity中注册设个观察者。
3. 在AndroidManifast文件中添加相关权限。
4. 别忘了再Activity的onDestory方法中取消注册的观察者。
经过验证这种方式是可行的,而且比较好用。这种方法读取短信的Cursor来源与Activity的managedQuery方法,这个方法已经被标记为废弃,推荐用CursorLoader来代替。

CursorLoader的好处

首先,CursorLoader继承的是AsyncTaskLoader,采用异步的方式查询数据库,避免了同步查询阻塞UI线程的问题。它自己会监视数据源的变化并且会主动上报。而且,当发生配置上的变化,重新生成的loader会自动连接到变化前的cursor,在不使用查询到的资源时,可以自动将其释放。

短信验证码自动填写的实现类

一言不合就直接贴代码了:

package com.wuwang.demo;

import android.content.ContentValues;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.util.Log;

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

/**
 * <p>Author : Wuwang </p>
 * <p>Company : ZhiJiaKeJi</p>
 * <p>Date :2016-07-21 09:16</p>
 * <p>Description : 验证码自动填充</p>
 */
public class VerificationCodeAutoFill implements LoaderManager.LoaderCallbacks<Cursor> {

  private Context context;
  private OnNewMessageListener listener;
  private String msgRegular;

  public VerificationCodeAutoFill(Context context){
    this(context,null,null);
  }

  public VerificationCodeAutoFill(Context context,OnNewMessageListener listener){
    this(context,listener,null);
  }

  /**
   * @param context
   * @param listener 新短信监听
   * @param msgRegular 对新短信处理的正则表达式,如果为空,则不进行处理
   */
  public VerificationCodeAutoFill(Context context, OnNewMessageListener listener,String msgRegular){
    this.context=context;
    this.listener=listener;
    this.msgRegular=msgRegular;
  }

  public VerificationCodeAutoFill registerTo(int id,LoaderManager manager){
    manager.initLoader(id,null,this);
    return this;
  }

  @Override
  public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return new CursorLoader(context,Uri.parse("content://sms/inbox"),
        new String[] { "_id", "address", "read", "body" },
        " read=?",
        new String[] {"0" }, "_id desc");
  }

  @Override
  public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    // 按id排序,如果按date排序的话,修改手机时间后,读取的短信就不准了
    if (data != null && data.getCount() > 0) {
      ContentValues values = new ContentValues();
      values.put("read", "1"); // 修改短信为已读模式
      data.moveToNext();
      int smsbodyColumn = data.getColumnIndex("body");
      String smsBody = data.getString(smsbodyColumn);
      Log.e("wuwang",smsBody);
      if(listener!=null){
        listener.onNewMessage(getDynamicPassword(smsBody,msgRegular));
      }
    }
  }

  @Override
  public void onLoaderReset(Loader<Cursor> loader) {

  }

  public interface OnNewMessageListener {
    void onNewMessage(String msg);
  }

  private String getDynamicPassword(String str,String regular) {
    if(regular==null)return str;
    Pattern continuousNumberPattern = Pattern.compile(msgRegular);
    Matcher m = continuousNumberPattern.matcher(str);
    String dynamicPassword = "";
    while (m.find()) {
      System.out.print(m.group());
      dynamicPassword = m.group();
    }
    return dynamicPassword;
  }

}

使用方法

使用比较简单,直接再FragmengActivity中加上:

//匹配四位数字的短信验证码
new VerificationCodeAutoFill(this, new VerificationCodeAutoFill.OnNewMessageListener() {
      @Override
      public void onNewMessage(String msg) {
        //etMsg.setText(msg); //验证码填充
      }
    }, "\\d{4}").registerTo(1,getSupportLoaderManager());

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

相关文章

  • 详解Android启动第一帧

    详解Android启动第一帧

    这篇文章我们就来介绍Android启动第一帧,至于Android第一帧什么时候开始调度,具体内容我们就来看下面文章内容吧,感兴趣得小伙伴可以和小编一起来学习奥
    2021-10-10
  • Android自定义View实现颜色选取器

    Android自定义View实现颜色选取器

    这篇文章主要为大家详细介绍了Android自定义View实现颜色选取器 ,类似SeekBar的方式通过滑动选择颜色,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Android获取arrays.xml里的数组字段值实例详解

    Android获取arrays.xml里的数组字段值实例详解

    这篇文章主要介绍了Android获取arrays.xml里的数组字段值实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Android实现关机后数据不会丢失问题

    Android实现关机后数据不会丢失问题

    这篇文章主要介绍了Android实现关机后数据不会丢失问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • Android实现简易的闹钟功能

    Android实现简易的闹钟功能

    这篇文章主要为大家详细介绍了Android实现简易的闹钟功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Android实现整理PackageManager获取所有安装程序信息

    Android实现整理PackageManager获取所有安装程序信息

    这篇文章主要介绍了Android实现整理PackageManager获取所有安装程序信息的方法,实例分析了Android使用PackageManager获取安装程序信息的具体步骤与相关技巧,需要的朋友可以参考下
    2016-01-01
  • Flutter中嵌入Android 原生TextView实例教程

    Flutter中嵌入Android 原生TextView实例教程

    这篇文章主要给大家介绍了关于Flutter中嵌入Android 原生TextView的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Anroid四大组件service之本地服务的示例代码

    Anroid四大组件service之本地服务的示例代码

    本篇文章主要介绍了Anroid四大组件service之本地服务的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Android camera实时预览 实时处理,人脸识别示例

    Android camera实时预览 实时处理,人脸识别示例

    本篇文章主要介绍了Android camera实时预览 实时处理,面部认证示例,具有一定的参考价值,有兴趣的可以了解一下。
    2017-01-01
  • Android 实现扫雷小游戏实例代码

    Android 实现扫雷小游戏实例代码

    这篇文章主要介绍了Android 实现扫雷小游戏实例代码的相关资料,需要的朋友可以参考下
    2016-12-12

最新评论