热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

这篇文章主要为大家详细介绍了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;

/**
 * 

Author : Wuwang

*

Company : ZhiJiaKeJi

*

Date :2016-07-21 09:16

*

Description : 验证码自动填充

*/ public class VerificationCodeAutoFill implements LoaderManager.LoaderCallbacks { 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 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 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 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());

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


推荐阅读
  • 今天在家乡的一个it专栏上看到一位程序员写他自己面试前端的过程,一个水果忍者项目和一个电商平台项目,期望工资是20K,已经有三年工作经验了 ... [详细]
  • CGPathAddArc & CGPathAddArcToPoint
    CGPathAddArc&CGPathAddArcToPoint参考:http:blog.csdn.netxcysuccess3articledetails24001571CGPa ... [详细]
  • Java入门程序开发
    Java入门程序开发作者:尹正杰版权声明:原创作品,谢绝转载!否则将 ... [详细]
  • 作为第一个正式项目,感触颇多,系统刚做完没多久,写点笔记记录下来吧。本系统主要功能是进行数据统计,比如统计学院的进馆次数,平均次数,进馆排行,图书馆年报等等在接到这个商用项目时,听 ... [详细]
  • 分享一下最近写的ReactNative的SSHSFTP组件,iOS端封装了NMSSH,Android端封装了JSch。支持SSH执行命令、实时Shell ... [详细]
  • DW的div布局
    如果你想尝试一下不用表格来排版网页,而是用CSS来排版你的网页,也就是常听的用DIV来编排你的网页结构,又或者说你想学习网页标准设计,再或者说你的上司要你改变传统的表格排版方式,提 ... [详细]
  • **实验3.4*使用上题的矩形类,编程统计若干块土地的相关信息*由用户输入每块儿土地的长与宽,程序将相关结果输出**importjava.util.*;publicclassa ... [详细]
  • #B.BalancedBreakdown#####1.题目大意:给定一个n,从n中不断分离回文数(翻转后大小相同的数字)问最少需要多少步,输出最少步数以及一种方案(方案不唯一)## ... [详细]
  • 深入研究虚幻4反射系统实现原理(一)
    上一篇翻译的文章里面提到了UE4反射系统的基本原理与应用,这次我们通过代码来深入研究一下UE4的反射系统,因为反射系统在UE4中牵扯的东西较多,所以我打算分几篇文章分析。我这里假定 ... [详细]
  • 水陆草木之花,可爱者甚蕃。晋陶渊明独爱菊。自李唐来,世人盛爱牡丹。予独爱莲之出淤泥而不染,濯清涟而不妖,中通外直,不蔓不枝,香远益清,亭亭净植,可远观而不可亵玩焉。予谓菊,花之隐逸 ... [详细]
  • zabbix监控服务日志关键字触发报警
    zabbix监控服 ... [详细]
  • Win7操作系统建立无线虚拟wifi
    网络适配器中的microsoftvirtualwifiminiportadapter是windows7的隐藏功能,虚拟wifi。正确的运用这个功能,就可以把电脑当做路由器了。注 ... [详细]
  • 参考官方:https:docs.autofac.orgenlatestintegrationaspnetcore.html#startup-class有一些变动,现在暂时还没用ne ... [详细]
  • Centos 使用yum安装MongoDB 4.2
    1.配置MongoDB的yum源创建yum源文件:#cdetcyum.repos.d#vimmongodb-org-4.0.repo添加以下内容:(我们这里使用阿里云的源)[mng ... [详细]
  • Java IO流学习总结(2)
    写在前面:本文章基本覆盖了javaIO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面。照旧,文章依 ... [详细]
author-avatar
zevbin_187
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有