Android实现自动填充短信验证码功能

前言

短信验证码获取并自动填写现在已经成为一个人性化App的标配了,这篇文章将实现一个短信验证码获取并自动填写的demo。其实就是读取指定号码的短信并提取出验证码,然后赋值给EditText显示。

demo效果图:

读取短信

Android系统在接受到一条短信的时候会发出一条Action为android.provider.Telephony.SMS_RECEIVED的有序广播,因此我们读取短信的验证码只需要监听这个广播然后提取出短信中的验证码即可,如:

/**
* Created by 程龙 on 2018/9/27.
*/

public class SMSBroadcastReceiver extends BroadcastReceiver {

  private static final String TAG = "SMSBroadcastReceiver";
  private OnReceiveSMSListener mOnReceiveSMSListener;
  public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";

  @Override
  public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(SMS_RECEIVED_ACTION)) {
      Object[] pdus = (Object[]) intent.getExtras().get("pdus");
      for(Object pdu:pdus) {
        SmsMessage smsMessage = SmsMessage.createFromPdu((byte [])pdu);
        // 短信号码
        String sender = smsMessage.getDisplayOriginatingAddress();
        Log.d(TAG,sender+"");
        //短信内容
        String content = smsMessage.getDisplayMessageBody();
        // 筛选
        if ("短信发送方号码".equals(sender) && mOnReceiveSMSListener!= null) {
          Pattern pattern = Pattern.compile("\\d+");
          Matcher matcher = pattern.matcher(content);
          if(matcher.find()) {
            mOnReceiveSMSListener.onReceived(matcher.group());
          }
          abortBroadcast();
        }
      }
    }

  }

  /**
  * 回调接口
  */
  public interface OnReceiveSMSListener {
    void onReceived(String message);
  }

  public void setOnReceiveSMSListener(OnReceiveSMSListener onReceiveSMSListener) {
    mOnReceiveSMSListener = onReceiveSMSListener;
  }
}

代码注释比较清楚,通过SmsMessage对象可以得到短信的发送号码,短信内容及相关信息。当短信号码为你要读取的短信发送方号码时用正则表达式提取出短信内容的验证码,然后通过调用监听器的回调方法更新相应的UI。这里只需将短信验证发送方号码替换成相应的号码即可,如“106903561008710”为腾讯云注册发送的短信号码。

通常,我们只会在注册或登录页面读取短信验证码,所以,我们采用动态注册广播的方式注册这个广播,如:

// 注册广播
IntentFilter intentFilter = new IntentFilter(SMSBroadcastReceiver.SMS_RECEIVED_ACTION);
// 设置优先级
intentFilter.setPriority(Integer.MAX_VALUE);
registerReceiver(mSMSBroadcastReceiver,intentFilter);

取消注册

@Override
protected void onDestroy() {
  super.onDestroy();
  unregisterReceiver(mSMSBroadcastReceiver);
}

MainActivity.java的代码为:

public class MainActivity extends AppCompatActivity implements SMSBroadcastReceiver.OnReceiveSMSListener {

  private SMSBroadcastReceiver mSMSBroadcastReceiver = new SMSBroadcastReceiver();
  private EditText mEt_code;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mEt_code = (EditText) findViewById(R.id.et_code);
    mSMSBroadcastReceiver.setOnReceiveSMSListener(this);
    // 注册广播
    IntentFilter intentFilter = new IntentFilter(SMSBroadcastReceiver.SMS_RECEIVED_ACTION);
    // 设置优先级
    intentFilter.setPriority(Integer.MAX_VALUE);
    registerReceiver(mSMSBroadcastReceiver,intentFilter);
  }

  @Override
  public void onReceived(String message) {
    mEt_code.setText(message+"");
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(mSMSBroadcastReceiver);
  }
}

这个demo的代码实现比较简单,就是监听广播,读取收到的短信,然后过滤筛选出我们要的验证码短信,再用正则表达式提取到验证码设置给EditText显示即可。大家下载或者自己编写这个demo并更改发送方短信号码运行,然后可以找个注册网址或是模拟验证码短信进行测试。

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

(0)

相关推荐

  • Android Usb设备的监听(Dev)外设端口的判定以及耳机的插拔

    最近在公司用到外设,需要判断接入的外设的VendorId和ProductId,然后给大家说一下自己的学习成果把 ,首先我门可以通过android.hardware.usb.action.USB_STATE监听自己的Usb连接的设备,只针对Usb设备.而想要监听外部设备的时候却需要另外的两个广播进行监听"android.hardware.usb.action.USB_DEVICE_ATTACHED"和"android.hardware.usb.action.USB_DEVICE

  • Android通过代码控制ListView上下滚动的方法

    本文将介绍一种通过代码控制ListView上下滚动的方法. 先上图: 按下按钮会触发ListView滚动或停止. 实现该功能并不难,下面给出主要代码MainActivity.java package cn.guet.levide; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View;

  • Android开发手机无线调试的方法

    是不是还在为了手机usb被占用而不能链接编译器而难过?是不是感觉无线调试遥不可及? 读完下面的几步 让你轻松掌握无线调试. 1. 首先将你的手机连接到无线网 2. 将你的手机链接到电脑上 3. Window 配置好adb Linux 安装好adb 4. 确认手机链接到无线网络需要和你的电脑在同一个无线网络内 5. 在命令端输入 $ adb tcpip 5555 (5555为端口号,可以自由指定) 然后在输如下命令 $ adb tcpip 此时你可以查看到 自己手机的ip地址 大概如下所示 10.

  • Android使用AsyncTask加载图片的操作流程

    加载图片基本操作 一.创建AsyncTask子类 将ImageView的弱引用设置为成员变量,创建构造函数传入ImageView对象. 调用指定大小解析Bitmap方法. 因为是弱引用,所以必须判断引用是否被回收.如果异步任务完成前,用户离开Activity或者设置发生改变,ImageView也可能不存在. class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { private final WeakReference&

  • Android自定义View实现饼状图带动画效果

    一个简单的自定义view饼状图,加入了动画效果 先看一下效果 下面就直接上代码了 public class Yidong2 extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new PointView(this)); } public class PointView

  • Android仿淘宝订单页面效果

    一般电商项目会涉及到的订单管理模块,类似淘宝样式的订单 主要是讲一下订单页面的实现.当然实现的方法有很多,我知道的有两种方法:一种是采用listview嵌套listview的方式,这种方式需要重写listview中onMearsure方法:还有一种是采用接口回调的方式,这种方式主要对后台返回的数据有依赖: 今天主要说下第二种方法: 实现的思想:首先Tab下面的布局还是用一个listview实现,然后将listview中的item分为上中下三部分内容: 创建三个xml文件,分别实现三个布局:第一部

  • 关于Touch Panel AA区要做外扩的原因解析

    Touch Panel即是触摸屏的面板,面板在设计的时候就会有一定的规范. 如上两幅图所示: AA  :   Active  Area的英文缩写,表示触摸屏的动作区,也就是我们手可以触摸面板,能够被检测到的区域. VA  :  View Area的英文缩写,表示屏体可视区域. OD :   Outside  Dimensional的英文缩写,表示触摸屏体外形尺寸. Sensor:装饰玻璃下有触摸功能的部件,通常就是一些ITO组成的电极,由各种各样的图案构成发射通道和感应通道,这些ITO图案一般式

  • Android底部导航栏的动态替换方案

    Android底部导航栏的动态替换方案,供大家参考,具体内容如下 1.通常来说,一般情况下,我们的app的BottomTab会有下面几种实现方式. 1).自定义view,然后自己写逻辑去实现互斥. 2).使用RadioGroup+RadioButton去实现底部的Tab. 自由度比极高,如果想实现搞复杂度的话可以重写 RadioButton. 3).使用google design包里面的 TabLayout去实现. 可上.可下.可以滑动 偷懒的话可以根据已有api来设置一些资源,也可以 setC

  • Android通过ExifInterface判断Camera图片方向的方法

    Android的Camera相关应用开发中,有一个必须搞清楚的知识点,就是Camera的预览方向和拍照方向 图像的Sensor方向:手机Camera的图像数据都是来自于摄像头硬件的图像传感器(Image Sensor),这个Sensor被固定到手机之后是有一个默认的取景方向的,这个方向如下图所示,坐标原点位于手机横放时的左上角: android应用里使用相机图片时必须要考虑的一个问题就是图片朝向,只有判断对朝向才能调整图片从而更好的展现.本文将介绍一种通过ExifInterface判断图片朝向的

  • Android自定义view制作抽奖转盘

    本文实例为大家分享了Android自定义view制作抽奖转盘的具体代码,供大家参考,具体内容如下 效果图 TurntableActivity package com.bawei.myapplication.turntable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; im

随机推荐