【mob】Android短信驗證+源碼

在不少的應用當中,都涉及到了短信驗證的功能,好比在註冊或者找回密碼的時候,那麼咱們如何經過第三方的平臺來完成這個功能呢?java

本面博文就實現短信驗證,來作一個小的栗子。android

第一步-下載開發包

首先你要在第三方平臺mob擁有一個開發者帳號,這樣你才能使用其提供的短信驗證服務。git


這裏寫圖片描述


而後點擊下載相應開發平臺的版本,我這裏使用的是AS。github


這裏寫圖片描述


下載完畢後咱們獲得的是一個壓縮包,解壓縮,打開SMSSDK這個文件夾。網絡


這裏寫圖片描述


建議你們能夠先看看HowToUse裏面的內容:app


這裏寫圖片描述


第二步-將SDK導入到項目當中

官方的文檔說明,2.0.1開始使用aar文件集成。更方便快捷。因此這裏建議各位將本身的AS升級到2.0.1的版本之上,這樣AS才能識別.aar後綴的文件。ide

把SMSSDK中的文件放在Module所在的Libs裏面,如圖。 
這裏寫圖片描述佈局

而後子啊該Module的build.gradle(上圖高亮的build.gradle,不是整個項目的build.gradle)當中添加依賴。gradle

這裏寫圖片描述

這樣一來,前期的準備工做就都結束了。接下來的工做就是去調用開發包中的各類方法。ui

第三步-啓動SDK

要想使用SDK提供的各類功能,首先就必需要啓動SDk。

首先咱們要進入到剛纔註冊過的mob官網,而後點擊【進入後臺】


這裏寫圖片描述


裏面有mob的四個主要服務,【ShareSDK】、【SecurityCodeSDK】、【ShareREC】、【MobAPI】,咱們要使用的【SecurityCodeSDK】。


這裏寫圖片描述


接着,咱們要建立一個應用。名稱就填寫咱們剛纔在AS中建立的項目名稱便可。


這裏寫圖片描述


最關鍵的內容,就是你的App Key和App secret


這裏寫圖片描述


把它們複製下來,放到AS當中。

這裏寫圖片描述

接下來就能夠啓動短信驗證的SDK了。

// 啓動短信驗證sdk SMSSDK.initSDK(this, appKey, appSecret);

 

第四部-註冊短信回調

這裏爲何要註冊短信回調呢?個人理解是,這裏的工做原理和廣播很是類似,咱們在使用廣播的時候須要註冊一個廣播接收器,以便對不一樣的消息作出反義。

註冊的方法以下: 
(1)定義一個EventHandler

private EventHandler eh;

 

(2)編寫EventHandler的事件處理 
EventHandler即爲操做回調。它包括4個方法,分別爲:

public void onRegister(); public void beforeEvent(int event, Object data); public void afterEvent(int event, int result, Object data); public void onUnregister();

 

其中onRegister在回調對象註冊的時候被觸發。beforeEvent在操做執行前被觸發,其參數event表示操做的類型,data是從外部傳入的數據。afterEvent在操做結束時被觸發,一樣具有event和data參數,可是data是事件操做結果,其具體取值根據參數result而定。result是操做結果,爲SMSSDK.RESULT_COMPLETE表示操做成功,爲SMSSDK.RESULT_ERROR表示操做失敗。

更多詳細的內容,你們能夠去看一下官網的這篇文章——Android 短信SDK操做回調

根據官方文檔提供的幾個Result值,咱們對afterEvent中的收到的幾種消息作出處理,代碼以下:

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) { //提交驗證碼成功 Message msg = new Message(); msg.arg1 = 0; msg.obj = data; handler.sendMessage(msg); Log.d(TAG, "提交驗證碼成功"); } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { Message msg = new Message(); //獲取驗證碼成功 msg.arg1 = 1; msg.obj = "獲取驗證碼成功"; handler.sendMessage(msg); Log.d(TAG, "獲取驗證碼成功"); } else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) { Message msg = new Message(); //返回支持發送驗證碼的國家列表 msg.arg1 = 2; msg.obj = "返回支持發送驗證碼的國家列表"; handler.sendMessage(msg); Log.d(TAG, "返回支持發送驗證碼的國家列表"); } } else { Message msg = new Message(); //返回支持發送驗證碼的國家列表 msg.arg1 = 3; msg.obj = "驗證失敗"; handler.sendMessage(msg); Log.d(TAG, "驗證失敗"); ((Throwable) data).printStackTrace(); } } };

 

因爲EventHandler開啓了線程,因此不能直接在afterEvent中更新UI,因此還須要在MainActivity當中定義一個Handler來接受EventHandler發送過來的消息。

private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.arg1) { case 0: //客戶端驗證成功,能夠進行註冊,返回校驗的手機和國家代碼phone/country Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show(); break; case 1: //獲取驗證碼成功 Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show(); break; case 2: //返回支持發送驗證碼的國家列表 Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show(); break; } } };

完成上述操做以後,註冊短信回調

SMSSDK.registerEventHandler(eh); //註冊短信回調
  • 1
  • 1

第五部-完善UI

主界面佈局以下

<?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:orientation="vertical"> <EditText android:id="@+id/et_phone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="請輸入手機號" /> <Button android:id="@+id/bt_getCode" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="獲取驗證碼" /> <EditText android:id="@+id/et_code" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="輸入驗證碼"/> <Button android:id="@+id/bt_verify" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="驗證"/> </LinearLayout>

 

很是簡單,et_phone用於輸入手機號,bt_getCode獲取驗證碼,et_code用於輸入手機收到的驗證碼,bt_vertify對驗證碼進行驗證。

Java部分的代碼重點講下爲按鈕bt_getCode和bt_vertify設置監聽事件。

bt_getCode.setClickable(false); bt_getCode.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //獲取驗證碼操做 phone=((EditText)findViewById(R.id.et_phone)).getText().toString(); if(phone.equals("")){ Toast.makeText(MainActivity.this,"手機號不能爲空",Toast.LENGTH_SHORT).show(); }else{ //填寫了手機號碼,isMobileNO(phone)判斷號碼格式 if(isMobileNO(phone)){ //若是手機號碼無誤,則發送驗證請求 bt_getCode.setClickable(true); //讓按鈕的樣式變成60S倒計時 changeBtnGetCode(); //SMSSDK中自帶的2個方法 getSupportedCountries(); getVerificationCode("86", phone); }else{ //手機號格式有誤 Toast.makeText(MainActivity.this,"手機號格式錯誤,請檢查",Toast.LENGTH_SHORT).show(); } } } });

 

其中 changeBtnGetCode();的代碼爲:

/* * 改變按鈕樣式 * */ private void changeBtnGetCode() { Thread thread = new Thread() { @Override public void run() { if (tag) { while (i > 0) { i--; //若是活動爲空 if (MainActivity.this == null) { break; } MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { bt_getCode.setText("獲取驗證碼(" + i + ")"); bt_getCode.setClickable(false); } }); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } tag = false; } i = 60; tag = true; if (MainActivity.this != null) { MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { bt_getCode.setText("獲取驗證碼"); bt_getCode.setClickable(true); } }); } } }; thread.start(); }

isMobileNO()的代碼爲:

private boolean isMobileNO(String phone) { /* 移動:13四、13五、13六、13七、13八、13九、150、15一、157(TD)、15八、15九、18七、188 聯通:130、13一、13二、15二、15五、15六、18五、186 電信:13三、15三、180、18九、(1349衛通) 總結起來就是第一位一定爲1,第二位一定爲3或5或8,其餘位置的能夠爲0-9 */ String telRegex = "[1][358]\\d{9}";//"[1]"表明第1位爲數字1,"[358]"表明第二位能夠爲三、五、8中的一個,"\\d{9}"表明後面是能夠是0~9的數字,有9位。 if (TextUtils.isEmpty(phone)) return false; else return phone.matches(telRegex); } }

 

而後是 bt_vertify的監聽時間,比較簡單

bt_vertify.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //驗證操做 code=((EditText)findViewById(R.id.et_code)).getText().toString(); if (code.equals("")){ Toast.makeText(MainActivity.this,"驗證碼不能爲空",Toast.LENGTH_SHORT).show(); }else{ //填寫了驗證碼,進行驗證,SMSSDK自帶的方法 submitVerificationCode("86", phone, code); } } });

 

最後別忘記在AndroidManifest.xml中添加網絡訪問的權限

<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

附錄

效果圖

這裏寫圖片描述

完整JAVA代碼

import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import cn.smssdk.EventHandler; import cn.smssdk.SMSSDK; import static cn.smssdk.SMSSDK.getSupportedCountries; import static cn.smssdk.SMSSDK.getVerificationCode; import static cn.smssdk.SMSSDK.submitVerificationCode; public class MainActivity extends AppCompatActivity { private final String TAG="--MainActivity--"; //app key和app secret 須要填本身應用的對應的!這裏只是我本身建立的應用。 private final String appKey="1549a02f213cb"; private final String appSecret="5753971a3b122dd9caf36a23a59ba5d9"; private EventHandler eh; private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.arg1) { case 0: //客戶端驗證成功,能夠進行註冊,返回校驗的手機和國家代碼phone/country Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show(); break; case 1: //獲取驗證碼成功 Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show(); break; case 2: //返回支持發送驗證碼的國家列表 Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show(); break; } } }; //View控件 private Button bt_getCode; private Button bt_vertify; //手機號碼 private String phone; //驗證碼 private String code; private boolean isChange; //控制按鈕樣式是否改變 private boolean tag = true; //每次驗證請求須要間隔60S private int i=60; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); // 啓動短信驗證sdk SMSSDK.initSDK(this, appKey, appSecret); 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) { //提交驗證碼成功 Message msg = new Message(); msg.arg1 = 0; msg.obj = data; handler.sendMessage(msg); Log.d(TAG, "提交驗證碼成功"); } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { Message msg = new Message(); //獲取驗證碼成功 msg.arg1 = 1; msg.obj = "獲取驗證碼成功"; handler.sendMessage(msg); Log.d(TAG, "獲取驗證碼成功"); } else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) { Message msg = new Message(); //返回支持發送驗證碼的國家列表 msg.arg1 = 2; msg.obj = "返回支持發送驗證碼的國家列表"; handler.sendMessage(msg); Log.d(TAG, "返回支持發送驗證碼的國家列表"); } } else { Message msg = new Message(); //返回支持發送驗證碼的國家列表 msg.arg1 = 3; msg.obj = "驗證失敗"; handler.sendMessage(msg); Log.d(TAG, "驗證失敗"); ((Throwable) data).printStackTrace(); } } }; SMSSDK.registerEventHandler(eh); //註冊短信回調 bt_getCode= (Button) findViewById(R.id.bt_getCode); bt_getCode.setClickable(false); bt_vertify= (Button) findViewById(R.id.bt_verify); bt_getCode.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //獲取驗證碼操做 phone=((EditText)findViewById(R.id.et_phone)).getText().toString(); if(phone.equals("")){ Toast.makeText(MainActivity.this,"手機號不能爲空",Toast.LENGTH_SHORT).show(); }else{ //填寫了手機號碼 if(isMobileNO(phone)){ //若是手機號碼無誤,則發送驗證請求 bt_getCode.setClickable(true); changeBtnGetCode(); getSupportedCountries(); getVerificationCode("86", phone); }else{ //手機號格式有誤 Toast.makeText(MainActivity.this,"手機號格式錯誤,請檢查",Toast.LENGTH_SHORT).show(); } } } }); bt_vertify.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //驗證操做 code=((EditText)findViewById(R.id.et_code)).getText().toString(); if (code.equals("")){ Toast.makeText(MainActivity.this,"驗證碼不能爲空",Toast.LENGTH_SHORT).show(); }else{ //填寫了驗證碼,進行驗證 submitVerificationCode("86", phone, code); } } }); } /* * 改變按鈕樣式 * */ private void changeBtnGetCode() { Thread thread = new Thread() { @Override public void run() { if (tag) { while (i > 0) { i--; //若是活動爲空 if (MainActivity.this == null) { break; } MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { bt_getCode.setText("獲取驗證碼(" + i + ")"); bt_getCode.setClickable(false); } }); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } tag = false; } i = 60; tag = true; if (MainActivity.this != null) { MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { bt_getCode.setText("獲取驗證碼"); bt_getCode.setClickable(true); } }); } } }; thread.start(); } private boolean isMobileNO(String phone) { /* 移動:13四、13五、13六、13七、13八、13九、150、15一、157(TD)、15八、15九、18七、188 聯通:130、13一、13二、15二、15五、15六、18五、186 電信:13三、15三、180、18九、(1349衛通) 總結起來就是第一位一定爲1,第二位一定爲3或5或8,其餘位置的能夠爲0-9 */ String telRegex = "[1][358]\\d{9}";//"[1]"表明第1位爲數字1,"[358]"表明第二位能夠爲三、五、8中的一個,"\\d{9}"表明後面是能夠是0~9的數字,有9位。 if (TextUtils.isEmpty(phone)) return false; else return phone.matches(telRegex); } }

源碼下載

項目地址:github

說明

一、爲了方便你們的導入,這裏附上個人AS的相關信息 
這裏寫圖片描述 
這裏寫圖片描述 
你們能夠根據本身的開發環境進行配置

二、這個栗子只是簡單的調用了SMSSDK的相關方法,在實際開發的過程當中,須要結合項目的需求,活學活用

相關文章
相關標籤/搜索