Android获取短信验证码并自动填充的两种方式「建议收藏」

Android获取短信验证码并自动填充的两种方式「建议收藏」有些项目为了方便客户操作,减去客户输入短信验证码的时间,会要求安卓app能够获取收到的短信验证码并自动填充到输入框。所以,我整理了安卓获取短信验证码并自动填充输入框的两种方法,而且正式在项目中使用并无bug。      一:监听短信库的变化,获取收到的短信内容,并通过正则表达式取出数字验证码填充到输入框中。代码如下:      publicclassObtainSmsVerifyC

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

       有些项目为了方便客户操作,减去客户输入短信验证码的时间,会要求安卓app能够获取收到的短信验证码并自动填充到输入框。所以,我整理了安卓获取短信验证码并自动填充输入框的两种方法,而且正式在项目中使用并无bug。

       一:监听短信库的变化,获取收到的短信内容,并通过正则表达式取出数字验证码填充到输入框中。代码如下:

       public class ObtainSmsVerifyCode {

 private Uri SMS_INBOX = Uri.parse(“content://sms/”);
 private Context context = null;
 private Handler handler = new Handler();
 private SmsObserver smsObserver;
 private SmsCodeReceivedListener listener = null;
 private String patternCoder = “(?<!\\d)\\d{6}(?!\\d)”;
 private ApplicationContext application = new ApplicationContext();

 /**
  * @Description: 获取到短信验证码监听
  */
 public interface SmsCodeReceivedListener {

  public void onSmsCodeReceived(String code);
 }

 public ObtainSmsVerifyCode(Context context) {

  this.context = context;
  ContentResolver cr = context.getContentResolver();
  smsObserver = new SmsObserver(handler);
  cr.registerContentObserver(SMS_INBOX, true, smsObserver);
 }

 public void setOnSmsCodeReceivedListener(SmsCodeReceivedListener lis) {

  listener = lis;
 }

 public void unRegisterContentObserver() {

  ContentResolver cr = context.getContentResolver();
  cr.unregisterContentObserver(smsObserver);
 }

 /**
  * @Description: 获取验证码
  */
 private void getVerifyCodeFromSms() {

  ContentResolver cr = context.getContentResolver();
  /**
   * address:发件人手机号码
   * date:发件日期
   * read:是否阅读
   * status:状态,-1接受
   * body:短信内容
   */
  String[] projection = new String[] { “address”, “body”, “date”, “type”,
    “read” };
  Cursor cursor;
  try {

   cursor = cr
     .query(SMS_INBOX, projection, null, null, “date desc”);
   if (cursor != null) {

    if (cursor.moveToFirst()) {

     SimpleDateFormat dateFormat = new SimpleDateFormat(
       “yyyy-MM-dd hh:mm:ss”);
     Date d = new Date(cursor.getLong(cursor.getColumnIndex(“date”)));
     String date = dateFormat.format(d);
     StringBuilder sb = new StringBuilder();
     sb.append(
       “发件人手机号码:”
         + cursor.getString(cursor
           .getColumnIndex(“address”)))
       .append(“信息内容:”
         + cursor.getString(cursor
           .getColumnIndex(“body”)))
       .append(“是否查看:”
         + cursor.getString(cursor
           .getColumnIndex(“read”)))
       .append(“类型:”
         + cursor.getInt(cursor.getColumnIndex(“type”)))
       .append(date);
     LogUtil.i(“sb=======” + sb);
     if (listener != null) {

      if (SmsServiceUtils.smsPhoneNum(application.getSegmentId())
        .contains(
          cursor.getString(cursor
            .getColumnIndex(“address”)))) {

       LogUtil.i(“here is it=====”
         + cursor.getString(cursor
           .getColumnIndex(“address”)));
       if (hasSixNumOrNot(cursor.getString(cursor
         .getColumnIndex(“body”)))
         && cursor
           .getString(
             cursor.getColumnIndex(“body”))
           .contains(
             “BOC Online Electronic Services”)) {

        listener.onSmsCodeReceived(patternCode(cursor
          .getString(cursor.getColumnIndex(“body”))));
       }
      }
     }

    }
    cursor.close();
   }
  } catch (Exception e) {

   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 /**
  * 匹配短信中间的6个数字(验证码等)
  *
  * @param patternContent
  * @return
  */
 private String patternCode(String patternContent) {

  if (TextUtils.isEmpty(patternContent)) {

   return “”;
  }
  Pattern p = Pattern.compile(patternCoder);
  Matcher matcher = p.matcher(patternContent);
  if (matcher.find()) {

   return matcher.group();
  }
  return “”;
 }
 /**
  * 判断短信中间是否包含6位数字(验证码等)
  * true:包含;false:不包含
  * @param patternContent
  * @return
  */
 private boolean hasSixNumOrNot(String patternContent) {

  if (TextUtils.isEmpty(patternContent)) {

   return false;
  }
  Pattern p = Pattern.compile(patternCoder);
  Matcher matcher = p.matcher(patternContent);
  if (matcher.find()) {

   return true;
  }
  return false;
 }

 /**
  * @Description: 监听短信数据
  */
 class SmsObserver extends ContentObserver {

  public SmsObserver(Handler handler) {

   super(handler);
  }

  @Override
  public void onChange(boolean selfChange) {

   super.onChange(selfChange);
   LogUtil.i(“selfChange===” + selfChange);
   getVerifyCodeFromSms();
  }
 }
}

     其中,SmsObserver是监听短信库变化的类,当短信库发生变化的时候会走OnChange的回调,此时遍历短信库,取出最近一条信息,信息包含的内容已经标记在代码的文档注释中,通过限制条件判断收到短信是否是工程所需发件人发过来的信息,同时根据正则表达式取出数字验证码,并通过SmsCodeReceivedListener接口,对外暴露所取出的短信验证码,在外面输入框就可以接收短信验证码。在关闭页面的时候,要调用unRegisterContentObserver()方法,取消对短信库的监听,以防内存泄露。

       二:通过自定义广播接收器,接收短信发过来的广播内容。代码如下

       public class SMSReceiver extends BroadcastReceiver {

 public static final String SMS_RECEIVED_ACTION = “android.provider.Telephony.SMS_RECEIVED”;
 private Context context;
 private EditText editText;
 private String patternCoder = “(?<!\\d)\\d{4}(?!\\d)”;

 public SMSReceiver(Context context, EditText editText) {

  super();
  this.context = context;
  this.editText = editText;
 }

 @Override
 public void onReceive(Context context, Intent intent) {

  if (intent.getAction().equals(SMS_RECEIVED_ACTION)) {

   SmsMessage[] messages = getMessagesFromIntent(intent);
   for (SmsMessage message : messages) {

    LogUtil.i(message.getOriginatingAddress() + ” : “
      + message.getDisplayOriginatingAddress() + ” : “
      + message.getDisplayMessageBody() + ” : “
      + message.getTimestampMillis());
    String smsContent = message.getDisplayMessageBody();
    LogUtil.i(smsContent);
    editText.setText(patternCode(smsContent));
   }
  }
 }

 public final SmsMessage[] getMessagesFromIntent(Intent intent) {

  Object[] messages = (Object[]) intent.getSerializableExtra(“pdus”);
  byte[][] pduObjs = new byte[messages.length][];
  for (int i = 0; i < messages.length; i++) {

   pduObjs[i] = (byte[]) messages[i];
  }
  byte[][] pdus = new byte[pduObjs.length][];
  int pduCount = pdus.length;
  SmsMessage[] msgs = new SmsMessage[pduCount];
  for (int i = 0; i < pduCount; i++) {

   pdus[i] = pduObjs[i];
   msgs[i] = SmsMessage.createFromPdu(pdus[i]);
  }
  return msgs;
 }

 /**
  * 匹配短信中间的4个数字(验证码等)
  *
  * @param patternContent
  * @return
  */
 private String patternCode(String patternContent) {

  if (TextUtils.isEmpty(patternContent)) {

   return null;
  }
  Pattern p = Pattern.compile(patternCoder);
  Matcher matcher = p.matcher(patternContent);
  if (matcher.find()) {

   return matcher.group();
  }
  return null;
 }

}

       SmsMessage的详细用法可以参考API或者网上搜索一下具体用法。至于广播的注册和解绑都是基本知识,也不再赘述。

       其他还要注意在清单配置文件中加上短信读写和接收权限

<uses-permission android:name=”android.permission.READ_SMS” />
   <uses-permission android:name=”android.permission.RECEIVE_SMS” />
   <uses-permission android:name=”android.permission.WRITE_SMS” />

另外,所谓的短信获取并自动填充,是在发送的短信格式是合法格式的前提下才成立,测试在短信平台发送的不合法的短信模板应该是不可能完全限制并拦截的。比如交易短信只包含6位数字,那合法短信本身就应该只会包含六位连续数字,不会在短信中出现几个连续六位数字,这是不合理的。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160022.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 嵌入式学习网站

    嵌入式学习网站创客智造:https://www.ncnynl.com/中国电子网:http://www.21ic.com/中国单片机公共实验室:http://www.bol-system.com/驱动开发网:http://www.driverdevelop.com/first.phpQT中文论坛:http://www.qtcn.org/bbs/i.php水木清华研究中心:http://w…

    2022年5月9日
  • 加多宝首度披露"换头手术"的详细内幕

    加多宝首度披露"换头手术"的详细内幕12月下旬,加多宝与王老吉的“改名案”和“怕上火案”判决结果先后出台,两大凉茶巨头之间的官司纠纷再起波澜。而加多宝集团品牌管理部负责人王月贵,在出席活动时首度披露了加多宝“换头手术”的详细内幕——由此,加多宝打赢凉茶之战的始末得以首次公开。以下为发言及访谈摘要:  快速出击,跟时间赛跑  在2012年,就在我们红罐凉茶迅速成长的时候,加多宝突然遭遇品牌地震,我们被迫放弃了使用和推广了17

    2022年10月29日
  • idea在mac版怎么配置svn_IntelliJ Idea 集成svn 和使用

    idea在mac版怎么配置svn_IntelliJ Idea 集成svn 和使用最近公司的很多同事开始使用IntelliJIdea,便尝试了一下,虽然快捷键与eclipse有些不同,但是强大的搜索功能与“漂亮的界面”(个人认为没有eclipse好看),还是值得我们去使用的。刚开始使用的idea要去集成svn,下载公司的项目。我是用的是TortoiseSVN(小乌龟),下载后安装,然后记住安装路径,我安装的是64位的。TortoiseSVN的下载地址:htt…

    2022年10月17日
  • 访问ftp服务器的方法_ftp服务器如何设置访问用户

    访问ftp服务器的方法_ftp服务器如何设置访问用户ftp://127.0.0.1”或“ftp://192.168.0.2”1、DOS下的登录格式。如“ftpftp.bbc.com”。2、浏览器中的登录格式。如“ftp://ftp.bbc.com”。3、FTP客户端应用软件的设置。比如在CuteFTP中 如果使用IE直接登陆FTP,则直接用IE浏览器访问“ftp://主机名@IP地址”,然后在弹出的窗口输入

    2022年9月3日
  • 深度学习与图像处理之:人像背景虚化

    深度学习与图像处理之:人像背景虚化

    2021年6月13日
  • eclipse中通过svn检出项目代码

    eclipse中通过svn检出项目代码eclipse中通过svn检出项目代码

    2022年4月24日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号