广告
返回顶部
首页 > 资讯 > 移动开发 >Android采取ContentObserver方式自动获取验证码
  • 815
分享到

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

自动验证码Android 2022-06-06 07:06:57 815人浏览 八月长安
摘要

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

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

照旧先上ContentObserver代码



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;

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) {
 
  if (uri.toString().equals("content://sms/raw")) {
   return;
  }
  
  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();
  }
 }
 
 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 中使用ContentObserver模式获取短信用正则自动填充验证码详解Android开发中ContentObserver类的使用Android 使用ContentObserver监听数据库内容是否更改


--结束END--

本文标题: Android采取ContentObserver方式自动获取验证码

本文链接: https://www.lsjlt.com/news/24470.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作