android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框。

一.接入短信平台

首先需要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com),

两分钟申请测试账号,赠送了100条测试短信。

android使用java的jar包即可开发

jar下载: http://smsow.zhenzikj.com/doc/sdk.html

API文档:http://smsow.zhenzikj.com/doc/java_sdk_doc.html

使用测试账号登录管理后台获取appId、appSecret, 地址: http://sms.zhenzikj.com/zhenzisms_user

在"我的应用"->"详情"中打开:

1.安装

下载后的SDK只包含一个jar文件,并且不依赖任何其他jar包或文件,直接导入到工程中即可使用。

2.用法

使用事先申请的AppId、AppSecret初始化ZhenziSmsClient:

ZhenziSmsClient client = new ZhenziSmsClient(appId, appSecret);

AppId、AppSecret是短信平台分配的

1)发送短信

String result = client.send("15811111111", "您的验证码为4534,有效时间为5分钟");

send方法用于单条发送短信

参数1:接收者手机号码,参数2:短信内容

返回结果是json格式的字符串, code: 发送状态,0为成功。非0为发送失败,可从data中查看错误信息

			{
    "code":0,
    "data":"发送成功"
}

二. 自动获取验证码

大致思路

需要做以下几步:

  1. 获取短信内容

  2. 判断短信中是否含有验证码,如果有则提取出来,如果没有就告知用户没有匹配出短信验证码

  3. 将匹配出的短信验证码填充到文本框中

开始制作

1.)申请短信权限

<uses-permission android:name="android.permission.RECEIVE_SMS" /> <!-- 接收短信权限 -->
<uses-permission android:name="android.permission.READ_SMS" />    <!-- 读取短信权限 -->

注意!!! 
由于Google在Android6.0引入了运行时权限,使得只要API版本大于23的都需要进行权限的申请,在这里推荐使用一个非常简单快速的第三方库来进行运行时权限的申请,Android 6.0运行时权限第三方库的使用—–RxPermissions

2.)注册短信接收者

我们知道,每当系统接收到一条短信便会发出一条广播,

为此,我们首先需要做的就是配置一个广播接收者来响应这条广播

AndroidManifest.xml文件中配置短信接受者:

<receiver android:name=".SMSReceiver">
      <intent-filter android:priority="1000">
           <action android:name="android.provider.Telephony.SMS_RECEIVED" />
      </intent-filter>
</receiver>

注意设置此广播接收者的级别为最高(1000)

SMSReceiver.java

public class SMSReceiver extends BroadcastReceiver {

    private static final String TAG = "SMSReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        //进行获取短信的操作
        getMsg(context, intent);     }
}

3.)接下来进行短信内容的获取

private void getMsg(Context context, Intent intent) {
        //pdus短信单位pdu
        //解析短信内容
        Object[] pdus = (Object[]) intent.getExtras().get("pdus");
        assert pdus != null;
        for (Object pdu : pdus) {
            //封装短信参数的对象
            SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);
            String number = sms.getOriginatingAddress();
            String body = sms.getMessageBody();
            //写自己的处理逻辑
            //获取短信验证码
            getCode(context, body);
        }
    }

通过SmsMessage对象可以得到短信的发送号码,短信内容及相关信息。

匹配出验证码并复制到剪贴板

这里我们就把验证码放到剪切板了,当然你也可以直接把它填充到文本框中

private void getCode(Context context, String body) {
        //获取剪贴板管理器:
        ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);         Pattern pattern1 = Pattern.compile("(\\d{6})");//提取六位数字
        Matcher matcher1 = pattern1.matcher(body);//进行匹配         Pattern pattern2 = Pattern.compile("(\\d{4})");//提取四位数字
        Matcher matcher2 = pattern2.matcher(body);//进行匹配         if (matcher1.find()) {//匹配成功
            String code = matcher1.group(0);
            // 创建普通字符型ClipData
            ClipData mClipData = ClipData.newPlainText("Label", code);
            // 将ClipData内容放到系统剪贴板里。
            cm.setPrimaryClip(mClipData);
            Toast.makeText(context, "验证码复制成功", Toast.LENGTH_SHORT).show();
            Log.d(TAG, "onReceive: " + code);
        } else if (matcher2.find()) {
            String code = matcher2.group(0);
            // 创建普通字符型ClipData
            ClipData mClipData = ClipData.newPlainText("Label", code);
            // 将ClipData内容放到系统剪贴板里。
            cm.setPrimaryClip(mClipData);
            Toast.makeText(context, "验证码复制成功", Toast.LENGTH_SHORT).show();
            Log.d(TAG, "onReceive: " + code);
        } else {
            Toast.makeText(context, "未检测到验证码", Toast.LENGTH_SHORT).show();
            Log.d(TAG, "onReceive: " + "未检测到验证码");
        }
    }

在这里通过正则表达式匹配出短信内容中的验证码,因为验证码大多数为4位或者6位,所以在这里为了简化就直接进行了4位验证码和6位验证码的判断

ok,大功告成.

 

android发送短信验证码并自动获取验证码填充文本框的更多相关文章

  1. android 发送短信的两种方式,以及接收报告和发送报告

               android发送短信,以及接收报告和发送报告          android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下:    一.调起系统发短信功能    ...

  2. android 发送短信 怎样做到一条一条的发送,仅仅有在上一条发送成功之后才发送下一条短信

    android发送短信截获上一条发送是否成功,然后再来发送下一条短信 1.问题:在项目中遇到例如以下要求:待发短信有N条,实现一条一条的发送并在上一条短信发送成功之后再来发送下一条. for(int ...

  3. 关于Android发送短信获取送达报告的问题

    最近公司开发一个项目,要求app能够发送短信并获取送达报告.这本不是一个什么难题,实现这一功能的代码一搜一大把,那么这么简单的一个问题,为什么我要在这里提出来呢?那是因为我在写代码的时候掉入了一个坑, ...

  4. 【Android】Android 发送短信和打电话的方法

    发送短信的方法 有两种方法可以实现发送短信,其一是使用intent-startActivity,URI数据格式为"smsto:num",调用的action为Intent.ACTIO ...

  5. Android 发送短信总结

    SMS涉及的主要类SmsManager 实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员. 公有方法: ArrayList< ...

  6. android发送短信样例

    Android应用开发中我们经常须要发送手机短信.这对于android平台来说,是最简单只是的功能了,无需太多代码,也无需自己定义代码,仅仅须要调用android提供的消息管理类SmsManager就 ...

  7. Android发送短信核心代码

    核心代码:(1)SmsManager manager = SmsManager.getDefault(); //获得默认的消息管理器(2)ArrayList<String> list = ...

  8. Android发送短信

    // 发送短信 public void sendMsg(){ String content = edtSend.getText().toString(); SmsManager smsManager ...

  9. jquery 发送短信60后重新获取

    先需要form表单,获取短信的按钮做成两个相同的,一个显示,一个隐藏. <div class="item">                    <p clas ...

随机推荐

  1. Filebeat+ELK部署文档

    在日常运维工作中,对于系统和业务日志的处理尤为重要.今天,在这里分享一下自己部署的Filebeat+ELK开源实时日志分析平台的记录过程,有不对的地方还望指出. 简单介绍: 日志主要包括系统日志.应用 ...

  2. FM(Factorization Machines)

    摘自 https://www.jianshu.com/p/1687f8964a32 https://blog.csdn.net/google19890102/article/details/45532 ...

  3. windows 下 bat 计划任务删除保留时间内文件

    date  windows 打印时间戳  年:echo %date:~,% 月:echo %date:~,% 日:echo %date:~,% 星期:echo %date:~,% 小时:echo %t ...

  4. Leetcode#88. Merge Sorted Array(合并两个有序数组)

    题目描述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...

  5. CAD版本知识

  6. .Net三层架构

    .Net三层架构   希望朋友们留下自己对三层架构的理解... 三层体系结构的概念 用户界面表示层(USL) 业务逻辑层(BLL) 数据访问层(DAL) BLL将USL与DAL隔开了,并且加入了业务规 ...

  7. 小程序 模态对话框自定义组件(modal)

    1. 概述 1.1 说明 小程序中使用wx.showModal(Object object)打开一个模态对话框,但是目前小程序所提供的modal中的内容显示比较死板,不能够完全满足工作中所遇到的功能信 ...

  8. Flask开发微电影网站(六)

    1. 后台管理登录功能实现 1.1 后台管理页面登录表单LoginForm 在app的admin目录下创建forms.py文件,用来保存admin蓝图中需要使用到的表单 from flask_wtf ...

  9. sass—使用自定义function和@each实现栅格布局

    /*使用自定义function和@each实现栅格布局*/ @function buildLayout($num: 5){ $map: (defaultValue: 0); //不能直接生成col,需 ...

  10. sklearn标准化-【老鱼学sklearn】

    在前面的一篇博文中关于计算房价中我们也大致提到了标准化的概念,也就是比如对于影响房价的参数中有面积和户型,面积的取值范围可以很广,它可以从0-500平米,而户型一般也就1-5. 标准化就是要把这两种参 ...