天天看點

Android短信驗證功能

短信驗證是現在很流行的一種驗證身份的技術。使用者輸入手機号,短信驗證平台發送驗證碼至使用者手機,使用者輸入正确的收到的驗證碼即可驗證手機身份。本文引用第三方mob網站的sdk添加進入app實作短信驗證功能。

首先在MOB網站注冊賬戶,在背景為你的app注冊獲得appkey和appsecret。然後下載下傳網站的短信驗證SDK,這裡我下載下傳的AS版本的,下載下傳完成後将SDK導入AS,引入SDK在網站上已經有很詳細的描述。

在oncreate方法中添加以下語句:

SMSSDK.initSDK(this, "你的appkey", "你的appsecret");
           

安卓對于網絡的通路需要放在程序中實作,安卓實作的是一套異步消息處理機制,使用handler發送和處理消息。發送消息一般是使用handler的sendMessage()方法,而發出的消息經過一系列地輾轉處理最終會傳遞到handler的handleMessage()方法。

此處聲明一個eventHandler作為消息處理者,為擷取驗證碼的按鈕添加監聽,先判斷輸入号碼是否正确,在驗證号碼正确性後使用下列語句調用SDK發送短信:

SMSSDK.getVerificationCode("86", phoneNums);
           

此時建一個程序,利用程序休眠實作倒計時的功能,這裡設定的時間為30秒。在30秒後恢複按鈕的可點選性,可再次點選發送短信。在輸入驗證碼後點選送出即可調用SDK驗證輸入驗證碼的正确性。

給出全部代碼,頁面UI可自行設計:

package com.example.exp;

import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ProgressBar;
import android.widget.Toast;
import android.widget.FrameLayout.LayoutParams;

public class register extends Activity implements OnClickListener {
private EditText etphone; // 手機号輸入框
private EditText etcode; // 驗證碼輸入框
private Button btnrequest; // 擷取驗證碼按鈕
private Button btnsub; // 注冊按鈕
int i = 30; // 設定短信驗證提示時間為30s
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);// 除去标題欄
    setContentView(R.layout.register);
    etphone = (EditText) findViewById(R.id.login_input_phone_et);
    etcode = (EditText) findViewById(R.id.login_input_code_et);
    btnrequest = (Button) findViewById(R.id.login_request_code_btn);
    btnsub = (Button) findViewById(R.id.login_commit_btn);
    btnrequest.setOnClickListener(this);
    btnsub.setOnClickListener(this);
    Log.e("ms", "1");
    // 啟動短信驗證sdk
    SMSSDK.initSDK(this, "186af2e954049",
            "48466e82249da303af399acb41f5e703");
    EventHandler eventHandler = new EventHandler() {
        @Override
        public void afterEvent(int event, int result, Object data) {
            Message msg = new Message();
            msg.arg1 = event;
            msg.arg2 = result;
            msg.obj = data;
            handler.sendMessage(msg);
        }
    };
    SMSSDK.registerEventHandler(eventHandler); // 注冊回調監聽接口
}
@Override
public void onClick(View v) {
    String phoneNums = etphone.getText().toString();
    switch (v.getId()) {
    case R.id.login_request_code_btn:
        if (!judgePhoneNums(phoneNums)) {// 判斷輸入号碼是否正确
            return;
        }
        SMSSDK.getVerificationCode("86", phoneNums); // 調用sdk發送短信驗證
        btnrequest.setClickable(false);// 設定按鈕不可點選 顯示倒計時
        btnrequest.setText("重新發送(" + i + ")");
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (i = 30; i > 0; i--) {
                    handler.sendEmptyMessage(-9);
                    if (i <= 0) {
                        break;
                    }
                    try {
                        Thread.sleep(1000);// 線程休眠實作讀秒功能
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                handler.sendEmptyMessage(-8);// 在30秒後重新顯示為擷取驗證碼
            }
        }).start();
        break;
    case R.id.login_commit_btn:
        SMSSDK.submitVerificationCode("86", phoneNums, etcode.getText()
                .toString());
        createProgressBar();
        break;
    }
}
Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        if (msg.what == -9) {
            btnrequest.setText("重新發送(" + i + ")");
        } else if (msg.what == -8) {
            btnrequest.setText("擷取驗證碼");
            btnrequest.setClickable(true); // 設定可點選
            i = 30;
        } else {
            int event = msg.arg1;
            int result = msg.arg2;
            Object data = msg.obj;
            if (result == SMSSDK.RESULT_COMPLETE) {
                // 短信注冊成功後,傳回MainActivity,然後提示
                if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {// 送出驗證碼成功
                    Toast.makeText(getApplicationContext(), "送出驗證碼成功",
                            Toast.LENGTH_SHORT).show();
                    // 驗證成功後跳轉主界面
                    //此處可注釋掉
                    Intent intent = new Intent(register.this, reg.class);
                    intent.putExtra("flag", "newuser");
                    startActivity(intent);
                    Log.e("注冊", "成功!");
                    finish();// 成功跳轉之後銷毀目前頁面
                } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
                    Toast.makeText(getApplicationContext(), "驗證碼已經發送",
                            Toast.LENGTH_SHORT).show();
                } else {
                    ((Throwable) data).printStackTrace();
                }
            }
        }
    }
};
/**
 * 判斷手機号碼是否合理
 * 
 * @param phoneNums
 */
private boolean judgePhoneNums(String phoneNums) {
    if (isMatchLength(phoneNums, 11) && isMobileNO(phoneNums)) {
        return true;
    }
    Toast.makeText(this, "手機号碼輸入有誤!", Toast.LENGTH_SHORT).show();
    return false;
}

public static boolean isMatchLength(String str, int length) {
    if (str.isEmpty()) {
        return false;
    } else {
        return str.length() == length ? true : false;
    }
}
public static boolean isMobileNO(String mobileNums) {
    String telRegex = "[1][358]\\d{9}";// "[1]"代表第1位為數字1,"[358]"代表第二位可以為3、5、8中的一個,"\\d{9}"代表後面是可以是0~9的數字,有9位。
    if (TextUtils.isEmpty(mobileNums))
        return false;
    else
        return mobileNums.matches(telRegex);
}

private void createProgressBar() {
    FrameLayout layout = (FrameLayout) findViewById(android.R.id.content);
    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    layoutParams.gravity = Gravity.CENTER;
    ProgressBar mProBar = new ProgressBar(this);
    mProBar.setLayoutParams(layoutParams);
    mProBar.setVisibility(View.VISIBLE);
    layout.addView(mProBar);
}

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