Android -- 短信验证就是那么简单

4,278 阅读11分钟

    又有半个月没更新文章了,最近工作比较忙,一时没时间写,今天趁着清闲,赶紧补上一篇。。。。。

    今天就说一下 Android集成短信验证功能的实现,最常见的短信验证界面我们都知道,两个输入框(输入手机号,输入验证码),两个按钮(获取验证码,提交),非常简单,唯一需要多写几行代码的地方就是那个获取验证码的按钮,为防止获取验证码的操作过于频繁,需要做出必要的限制,最常见的就是60s了,关于60s的问题,可以参见  Android -- 倒计时Button的几种实现  ,在这里我们重点说一下验证功能。

    首先今天我们要说的主角就是它了—— Mob,什么?黑手党??暴徒???惊恐 NO,NO,NO,绝壁没有那么diao, 它是 Mob移动开发者服务平台 ,绝对的良民 闭嘴

好了,不说废话了。开整。。。。

一、集成SDK

1、首先需要下载SDK

     我这里下的是基于AS开发平台的,也有eclipse的,不过现在基本上都在用Google亲儿子,eclipse已经被大多数android开发者抛弃了,现在想想还(曾)有(经)一(被)点(虐)小(千)怀(百)念(遍)。

2、解压下载的压缩文件

    主要用到里面的这几个jar包


3、将这四个玩意儿放到项目的libs目录下


4、在app目录下的build.gradle中加上如下图所示代码


好了,集成的工作就做好了,没错,就是这么简单,接下来就是代码了。

二、撸代码

首先初始化SDK
  1. package com.hbh.cl.smsvalidatedemo;  
  2.   
  3. import android.app.Application;  
  4.   
  5. import cn.smssdk.SMSSDK;  
  6.   
  7. /** 
  8.  * Created by hbh. 
  9.  */  
  10.   
  11. public class MyApplication extends Application {  
  12.     @Override  
  13.     public void onCreate() {  
  14.         super.onCreate();  
  15.         SMSSDK.initSDK(this"你的appkey""你的appsecret");  
  16.     }  
  17. }  
package com.hbh.cl.smsvalidatedemo;

import android.app.Application;

import cn.smssdk.SMSSDK;

/**
 * Created by hbh.
 */

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        SMSSDK.initSDK(this, "你的appkey", "你的appsecret");
    }
}

至于appkey和appsecret可以在注册用户后在个人中心查看,如下




登录页面

  1. package com.hbh.cl.smsvalidatedemo;  
  2.   
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.os.CountDownTimer;  
  6. import android.support.annotation.Nullable;  
  7. import android.support.v7.app.AppCompatActivity;  
  8. import android.view.View;  
  9. import android.widget.Button;  
  10. import android.widget.EditText;  
  11. import android.widget.Toast;  
  12.   
  13. import java.util.regex.Matcher;  
  14. import java.util.regex.Pattern;  
  15.   
  16. import cn.smssdk.EventHandler;  
  17. import cn.smssdk.SMSSDK;  
  18.   
  19. /** 
  20.  * Created by hbh 
  21.  */  
  22.   
  23. public class LoginActivity extends AppCompatActivity  implements View.OnClickListener {  
  24.   
  25.     private Button validateNum_btn;  
  26.     private Button landing_btn;  
  27.     private EditText userName;  
  28.     private EditText validateNum;  
  29.     public EventHandler eh; //事件接收器  
  30.     private TimeCount mTimeCount;//计时器  
  31.   
  32.     @Override  
  33.     protected void onCreate(@Nullable Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         setContentView(R.layout.activity_login);  
  36.         initEvent();  
  37.         init();  
  38.     }  
  39.   
  40.     private void initEvent(){  
  41.         userName = (EditText) findViewById(R.id.userName);  
  42.         validateNum = (EditText) findViewById(R.id.validateNum);  
  43.         validateNum_btn = (Button) findViewById(R.id.validateNum_btn);  
  44.         landing_btn = (Button) findViewById(R.id.landing_btn);  
  45.         validateNum_btn.setOnClickListener(this);  
  46.         landing_btn.setOnClickListener(this);  
  47.         mTimeCount = new TimeCount(600001000);  
  48.     }  
  49.   
  50.     /** 
  51.      * 初始化事件接收器 
  52.      */  
  53.     private void init(){  
  54.         eh = new EventHandler(){  
  55.             @Override  
  56.             public void afterEvent(int event,  int result, Object data) {  
  57.   
  58.                 if (result == SMSSDK.RESULT_COMPLETE) {  //回调完成  
  59.   
  60.                     if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {  //提交验证码成功  
  61.   
  62.                         startActivity(new Intent(LoginActivity. this, MainActivity.class)); //页面跳转  
  63.   
  64.                     }else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE){  //获取验证码成功  
  65.   
  66.                     }else if (event ==SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES){  //返回支持发送验证码的国家列表  
  67.   
  68.                     }  
  69.                 }else{  
  70.                     ((Throwable)data).printStackTrace();  
  71.                 }  
  72.             }  
  73.         };  
  74.         SMSSDK.registerEventHandler(eh); //注册短信回调  
  75.     }  
  76.   
  77.     @Override  
  78.     public void onClick(View view) {  
  79.         switch (view.getId()){  
  80.             case R.id.validateNum_btn:  
  81. //                SMSSDK.getSupportedCountries();//获取短信目前支持的国家列表  
  82.                 if(!userName.getText().toString().trim().equals("")){  
  83.                     if (checkTel(userName.getText().toString().trim())) {  
  84.                         SMSSDK.getVerificationCode("+86",userName.getText().toString()); //获取验证码  
  85.                         mTimeCount.start();  
  86.                     }else{  
  87.                         Toast.makeText(LoginActivity.this "请输入正确的手机号码", Toast.LENGTH_SHORT).show();  
  88.                     }  
  89.                 }else{  
  90.                     Toast.makeText(LoginActivity.this"请输入手机号码", Toast.LENGTH_SHORT).show();  
  91.                 }  
  92.                 break;  
  93.             case R.id.landing_btn:  
  94.                 if (!userName.getText().toString().trim().equals("")) {  
  95.                     if (checkTel(userName.getText().toString().trim())) {  
  96.                         if (!validateNum.getText().toString().trim().equals( "")) {  
  97.                             SMSSDK.submitVerificationCode("+86",userName.getText().toString().trim(),validateNum.getText().toString().trim()); //提交验证  
  98.                         }else{  
  99.                             Toast.makeText(LoginActivity.this "请输入验证码", Toast.LENGTH_SHORT).show();  
  100.                         }  
  101.                     }else{  
  102.                         Toast.makeText(LoginActivity.this "请输入正确的手机号码", Toast.LENGTH_SHORT).show();  
  103.                     }  
  104.                 }else{  
  105.                     Toast.makeText(LoginActivity.this"请输入手机号码", Toast.LENGTH_SHORT).show();  
  106.                 }  
  107.                 break;  
  108.         }  
  109.     }  
  110.   
  111.     /** 
  112.      * 正则匹配手机号码 
  113.      * @param tel 
  114.      * @return 
  115.      */  
  116.     public boolean checkTel(String tel){  
  117.         Pattern p = Pattern.compile("^[1][3,4,5,7,8][0-9]{9}$");  
  118.         Matcher matcher = p.matcher(tel);  
  119.         return matcher.matches();  
  120.     }  
  121.   
  122.     @Override  
  123.     protected void onDestroy() {  
  124.         super.onDestroy();  
  125.         SMSSDK.unregisterEventHandler(eh);  
  126.     }  
  127.   
  128.     /** 
  129.      * 计时器 
  130.      */  
  131.     class TimeCount extends CountDownTimer{  
  132.   
  133.         public TimeCount(long millisInFuture, long countDownInterval) {  
  134.             super(millisInFuture, countDownInterval);  
  135.         }  
  136.   
  137.         @Override  
  138.         public void onTick(long l) {  
  139.             validateNum_btn.setClickable(false);  
  140.             validateNum_btn.setText(l/1000 + "秒后重新获取");  
  141.         }  
  142.   
  143.         @Override  
  144.         public void onFinish() {  
  145.             validateNum_btn.setClickable(true);  
  146.             validateNum_btn.setText("获取验证码");  
  147.         }  
  148.     }  
  149.   
  150. }  
package com.hbh.cl.smsvalidatedemo;

import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;

/**
 * Created by hbh
 */

public class LoginActivity extends AppCompatActivity implements View.OnClickListener {

    private Button validateNum_btn;
    private Button landing_btn;
    private EditText userName;
    private EditText validateNum;
    public EventHandler eh; //事件接收器
    private TimeCount mTimeCount;//计时器

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        initEvent();
        init();
    }

    private void initEvent(){
        userName = (EditText) findViewById(R.id.userName);
        validateNum = (EditText) findViewById(R.id.validateNum);
        validateNum_btn = (Button) findViewById(R.id.validateNum_btn);
        landing_btn = (Button) findViewById(R.id.landing_btn);
        validateNum_btn.setOnClickListener(this);
        landing_btn.setOnClickListener(this);
        mTimeCount = new TimeCount(60000, 1000);
    }

    /**
     * 初始化事件接收器
     */
    private void init(){
        eh = new EventHandler(){
            @Override
            public void afterEvent(int event, int result, Object data) {

                if (result == SMSSDK.RESULT_COMPLETE) { //回调完成

                    if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { //提交验证码成功

                        startActivity(new Intent(LoginActivity.this, MainActivity.class)); //页面跳转

                    }else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE){ //获取验证码成功

                    }else if (event ==SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES){ //返回支持发送验证码的国家列表

                    }
                }else{
                    ((Throwable)data).printStackTrace();
                }
            }
        };
        SMSSDK.registerEventHandler(eh); //注册短信回调
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.validateNum_btn:
//                SMSSDK.getSupportedCountries();//获取短信目前支持的国家列表
                if(!userName.getText().toString().trim().equals("")){
                    if (checkTel(userName.getText().toString().trim())) {
                        SMSSDK.getVerificationCode("+86",userName.getText().toString());//获取验证码
                        mTimeCount.start();
                    }else{
                        Toast.makeText(LoginActivity.this, "请输入正确的手机号码", Toast.LENGTH_SHORT).show();
                    }
                }else{
                    Toast.makeText(LoginActivity.this, "请输入手机号码", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.landing_btn:
                if (!userName.getText().toString().trim().equals("")) {
                    if (checkTel(userName.getText().toString().trim())) {
                        if (!validateNum.getText().toString().trim().equals("")) {
                            SMSSDK.submitVerificationCode("+86",userName.getText().toString().trim(),validateNum.getText().toString().trim());//提交验证
                        }else{
                            Toast.makeText(LoginActivity.this, "请输入验证码", Toast.LENGTH_SHORT).show();
                        }
                    }else{
                        Toast.makeText(LoginActivity.this, "请输入正确的手机号码", Toast.LENGTH_SHORT).show();
                    }
                }else{
                    Toast.makeText(LoginActivity.this, "请输入手机号码", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

    /**
     * 正则匹配手机号码
     * @param tel
     * @return
     */
    public boolean checkTel(String tel){
        Pattern p = Pattern.compile("^[1][3,4,5,7,8][0-9]{9}$");
        Matcher matcher = p.matcher(tel);
        return matcher.matches();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        SMSSDK.unregisterEventHandler(eh);
    }

    /**
     * 计时器
     */
    class TimeCount extends CountDownTimer{

        public TimeCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        @Override
        public void onTick(long l) {
            validateNum_btn.setClickable(false);
            validateNum_btn.setText(l/1000 + "秒后重新获取");
        }

        @Override
        public void onFinish() {
            validateNum_btn.setClickable(true);
            validateNum_btn.setText("获取验证码");
        }
    }

}

对应的xml文件

  1. <?xml version="1.0" encoding= "utf-8"?>  
  2. <LinearLayout  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:layout_marginLeft="30dp"  
  7.     android:layout_marginRight="30dp"  
  8.     android:gravity="center"  
  9.     android:orientation="vertical">  
  10.   
  11.     <EditText  
  12.         android:id="@+id/userName"  
  13.         android:layout_width="match_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:padding="10dp"  
  16.         android:background="@drawable/shape_style"  
  17.         android:hint="@string/tel"  
  18.         android:textColorHint="@color/gray"  
  19.         android:layout_gravity="center_vertical"  
  20.         android:singleLine="true"  
  21.         android:textSize="16sp" />  
  22.   
  23.     <LinearLayout  
  24.         android:layout_width="match_parent"  
  25.         android:layout_height="wrap_content"  
  26.         android:orientation="horizontal"  
  27.         android:layout_marginTop="20dp">  
  28.         <EditText  
  29.             android:id="@+id/validateNum"  
  30.             android:layout_width="0dp"  
  31.             android:layout_height="wrap_content"  
  32.             android:layout_weight="2"  
  33.             android:padding="10dp"  
  34.             android:background="@drawable/shape_style"  
  35.             android:hint="@string/validate"  
  36.             android:textColorHint="@color/gray"  
  37.             android:layout_gravity="center_vertical"  
  38.             android:layout_marginRight="10dp"  
  39.             android:singleLine="true"  
  40.             android:textSize="16sp" />  
  41.         <Button  
  42.             android:id="@+id/validateNum_btn"  
  43.             android:layout_width="0dp"  
  44.             android:layout_height="match_parent"  
  45.             android:layout_weight="1"  
  46.             android:text="@string/validateNum"/>  
  47.     </LinearLayout>  
  48.   
  49.     <Button  
  50.         android:id="@+id/landing_btn"  
  51.         android:layout_width="match_parent"  
  52.         android:layout_height="wrap_content"  
  53.         android:layout_marginTop="20dp"  
  54.         android:text="@string/landing"/>  
  55.   
  56. </LinearLayout>  
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="30dp"
    android:layout_marginRight="30dp"
    android:gravity="center"
    android:orientation="vertical">

    <EditText
        android:id="@+id/userName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:background="@drawable/shape_style"
        android:hint="@string/tel"
        android:textColorHint="@color/gray"
        android:layout_gravity="center_vertical"
        android:singleLine="true"
        android:textSize="16sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="20dp">
        <EditText
            android:id="@+id/validateNum"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:padding="10dp"
            android:background="@drawable/shape_style"
            android:hint="@string/validate"
            android:textColorHint="@color/gray"
            android:layout_gravity="center_vertical"
            android:layout_marginRight="10dp"
            android:singleLine="true"
            android:textSize="16sp" />
        <Button
            android:id="@+id/validateNum_btn"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="@string/validateNum"/>
    </LinearLayout>

    <Button
        android:id="@+id/landing_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="@string/landing"/>

</LinearLayout>

最后在AndroidManifest.xml中增加权限

  1. <uses-permission android:name="android.permission.READ_CONTACTS"  />  
  2. <uses-permission android:name="android.permission.READ_PHONE_STATE"  />  
  3. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"  />  
  4. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"  />  
  5. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"  />  
  6. <uses-permission android:name="android.permission.INTERNET"  />  
  7. <uses-permission android:name="android.permission.RECEIVE_SMS"  />  
  8. <uses-permission android:name="android.permission.READ_SMS"  />  
  9. <uses-permission android:name="android.permission.GET_TASKS"  />  
  10. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"  />  
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

 好了,IT'S  ALL OVER. 就是那么简单,代码基本上全都贴上了,样子就是这个样子,demo丑了点难过

还有一些其他的相关功能大家可以自己去看Mob的官方文档
筒子们,再见再见