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

作者:feiyangbahu1 时间:2023-07-31 16:20:48 

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);

}

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

标签:Android,ContentObserve,验证码
0
投稿

猜你喜欢

  • C#中ManualResetEvent实现线程的暂停与恢复

    2021-06-20 14:59:24
  • Android自定义ScrollView实现阻尼回弹

    2021-11-23 07:20:19
  • springboot+thymeleaf 文件上传功能的实现代码

    2023-11-25 05:08:59
  • C# 无边框窗体边框阴影效果的简单实现

    2021-12-06 23:41:43
  • C# DataTable中查询指定字段名称的数据

    2023-10-08 16:16:44
  • C#中的多播委托和泛型委托

    2022-03-23 19:17:28
  • C#适配器模式的使用

    2022-02-05 15:47:21
  • Spring JPA之find拓展方法示例详解

    2021-12-11 03:50:49
  • C#实现文件断点续传下载的方法

    2021-09-05 10:37:42
  • Java的RxJava库操作符的用法及实例讲解

    2021-12-14 22:31:41
  • TKmybatis的框架介绍和原理解析

    2022-08-28 21:35:42
  • 在Visual Studio上构建C++的GUI框架wxWidgets的开发环境

    2023-04-12 01:02:06
  • Spring框架的环境搭建和测试实现

    2023-10-27 17:57:57
  • Java Mybatis批量修改封装详解

    2021-12-29 22:41:52
  • 利用C#实现网络爬虫

    2022-03-26 18:40:25
  • Java使用BigDecimal进行高精度计算的示例代码

    2023-03-25 10:35:43
  • Java Map简介_动力节点Java学院整理

    2023-06-03 20:27:03
  • C# 对XML基本操作代码总结

    2022-08-21 16:09:09
  • MyBatisPlus 大数据量查询慢的问题解决

    2022-06-17 05:56:39
  • Java并发程序入门介绍

    2022-03-05 12:05:26
  • asp之家 软件编程 m.aspxhome.com