天天看點

Android短信驗證(手機号注冊,綁定手機号擷取驗證碼)執行個體

 今天寫一個常見的功能——手機app中注冊或綁定手機号的擷取驗證碼的功能。也就是短信驗證功能

  具體效果就是,你在注冊界面填寫手機号,點選擷取驗證碼按鈕,---然後會收到驗證短信,填入驗證碼後點選注冊按鈕,如果驗證正确就可以跳轉到另外一個界面

  1.首先大家需要在mob官網注冊一個賬号,mob是一個免費的短信驗證平台

  2.在mob.com背景建立應用

  3.下載下傳對應的sdk

  4.将sdk作為一個library導入到你的項目中

  5.現在就可以在你的項目中編寫代碼使用mob提供的這個功能了

  具體代碼如下:

  首先配置檔案加入權限:

XML/HTML代碼

  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.GET_TASKS" />    
  9. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />   

  然後聲明activity(這是固定的不能修改,直接複制粘貼到你的配置檔案就行)

XML/HTML代碼

  1. <activity    
  2. android:name="cn.smssdk.SMSSDKUIShell"    
  3. android:configChanges="keyboardHidden|orientation|screenSize"    
  4. android:theme="@android:style/Theme.Translucent.NoTitleBar"    
  5. android:windowSoftInputMode="stateHidden|adjustResize"/>    

  注冊界面xml布局檔案

XML/HTML代碼

  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:layout_width="match_parent"    
  4.     android:layout_height="match_parent"    
  5.     android:orientation="vertical" >    
  6.     <EditText    
  7.         android:id="@+id/login_input_phone_et"    
  8.         android:layout_width="280dp"    
  9.         android:layout_height="wrap_content"    
  10.         android:layout_alignParentTop="true"    
  11.         android:layout_centerHorizontal="true"    
  12.         android:layout_marginTop="107dp"    
  13.         android:ems="10"    
  14.         android:hint="請輸入手機号"    
  15.         android:inputType="phone" />    
  16.     <requestFocus />    
  17.     <EditText    
  18.         android:id="@+id/login_input_code_et"    
  19.         android:layout_width="170dp"    
  20.         android:layout_height="wrap_content"    
  21.         android:layout_alignLeft="@+id/login_input_phone_et"    
  22.         android:layout_below="@+id/login_input_phone_et"    
  23.         android:layout_marginTop="44dp"    
  24.         android:hint="請輸入驗證碼"    
  25.         android:inputType="textPassword" >    
  26.     </EditText>    
  27.     <Button    
  28.         android:id="@+id/login_request_code_btn"    
  29.         android:layout_width="wrap_content"    
  30.         android:layout_height="wrap_content"    
  31.         android:layout_alignRight="@+id/login_input_phone_et"    
  32.         android:layout_alignTop="@+id/login_input_code_et"    
  33.         android:text="擷取驗證碼" />    
  34.     <Button    
  35.         android:id="@+id/login_commit_btn"    
  36.         android:layout_width="280dp"    
  37.         android:layout_height="wrap_content"    
  38.         android:layout_alignLeft="@+id/login_input_code_et"    
  39.         android:layout_below="@+id/login_input_code_et"    
  40.         android:layout_marginTop="44dp"    
  41.         android:text="注冊" />    
  42. </RelativeLayout>    

  注冊界面activity

Java代碼

  1. package com.mobdemo.view;    
  2. import cn.smssdk.EventHandler;    
  3. import cn.smssdk.SMSSDK;    
  4. import android.app.Activity;    
  5. import android.content.Intent;    
  6. import android.os.Bundle;    
  7. import android.os.Handler;    
  8. import android.os.Message;    
  9. import android.text.TextUtils;    
  10. import android.util.Log;    
  11. import android.view.Gravity;    
  12. import android.view.View;    
  13. import android.view.View.OnClickListener;    
  14. import android.widget.Button;    
  15. import android.widget.EditText;    
  16. import android.widget.FrameLayout;    
  17. import android.widget.ProgressBar;    
  18. import android.widget.Toast;    
  19. import android.widget.FrameLayout.LayoutParams;    
  20. public class LoginActivity extends Activity implements OnClickListener {    
  21.     String APPKEY = "101732155b605";    
  22.     String APPSECRETE = "69d1850f4b74100266ab576b64e6cb16";    
  23.     // 手機号輸入框    
  24.     private EditText inputPhoneEt;    
  25.     // 驗證碼輸入框    
  26.     private EditText inputCodeEt;    
  27.     // 擷取驗證碼按鈕    
  28.     private Button requestCodeBtn;    
  29.     // 注冊按鈕    
  30.     private Button commitBtn;    
  31.     //    
  32.     int i = 30;    
  33.     @Override    
  34.     protected void onCreate(Bundle savedInstanceState) {    
  35.         super.onCreate(savedInstanceState);    
  36.         setContentView(R.layout.activity_login);    
  37.         init();    
  38.     }    
  39.     private void init() {    
  40.         inputPhoneEt = (EditText) findViewById(R.id.login_input_phone_et);    
  41.         inputCodeEt = (EditText) findViewById(R.id.login_input_code_et);    
  42.         requestCodeBtn = (Button) findViewById(R.id.login_request_code_btn);    
  43.         commitBtn = (Button) findViewById(R.id.login_commit_btn);    
  44.         requestCodeBtn.setOnClickListener(this);    
  45.         commitBtn.setOnClickListener(this);    
  46.         // 啟動短信驗證sdk    
  47.         SMSSDK.initSDK(this, APPKEY, APPSECRETE);    
  48.         EventHandler eventHandler = new EventHandler(){    
  49.             @Override    
  50.             public void afterEvent(int event, int result, Object data) {    
  51.                 Message msg = new Message();    
  52.                 msg.arg1 = event;    
  53.                 msg.arg2 = result;    
  54.                 msg.obj = data;    
  55.                 handler.sendMessage(msg);    
  56.             }    
  57.         };    
  58.         //注冊回調監聽接口    
  59.         SMSSDK.registerEventHandler(eventHandler);    
  60.     }    
  61.     @Override    
  62.     public void onClick(View v) {    
  63.         String phoneNums = inputPhoneEt.getText().toString();    
  64.         switch (v.getId()) {    
  65.         case R.id.login_request_code_btn:    
  66.             // 1. 通過規則判斷手機号    
  67.             if (!judgePhoneNums(phoneNums)) {    
  68.                 return;    
  69.             } // 2. 通過sdk發送短信驗證    
  70.             SMSSDK.getVerificationCode("86", phoneNums);    
  71.             // 3. 把按鈕變成不可點選,并且顯示倒計時(正在擷取)    
  72.             requestCodeBtn.setClickable(false);    
  73.             requestCodeBtn.setText("重新發送(" + i + ")");    
  74.             new Thread(new Runnable() {    
  75.                 @Override    
  76.                 public void run() {    
  77.                     for (; i > 0; i--) {    
  78.                         handler.sendEmptyMessage(-9);    
  79.                         if (i <= 0) {    
  80.                             break;    
  81.                         }    
  82.                         try {    
  83.                             Thread.sleep(1000);    
  84.                         } catch (InterruptedException e) {    
  85.                             e.printStackTrace();    
  86.                         }    
  87.                     }    
  88.                     handler.sendEmptyMessage(-8);    
  89.                 }    
  90.             }).start();    
  91.             break;    
  92.         case R.id.login_commit_btn:    
  93.             //将收到的驗證碼和手機号送出再次核對    
  94.             SMSSDK.submitVerificationCode("86", phoneNums, inputCodeEt    
  95.                     .getText().toString());    
  96.             //createProgressBar();    
  97.             break;    
  98.         }    
  99.     }    
  100.     Handler handler = new Handler() {    
  101.         public void handleMessage(Message msg) {    
  102.             if (msg.what == -9) {    
  103.                 requestCodeBtn.setText("重新發送(" + i + ")");    
  104.             } else if (msg.what == -8) {    
  105.                 requestCodeBtn.setText("擷取驗證碼");    
  106.                 requestCodeBtn.setClickable(true);    
  107.                 i = 30;    
  108.             } else {    
  109.                 int event = msg.arg1;    
  110.                 int result = msg.arg2;    
  111.                 Object data = msg.obj;    
  112.                 Log.e("event", "event=" + event);    
  113.                 if (result == SMSSDK.RESULT_COMPLETE) {    
  114.                     // 短信注冊成功後,傳回MainActivity,然後提示    
  115.                     if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {// 送出驗證碼成功    
  116.                         Toast.makeText(getApplicationContext(), "送出驗證碼成功",    
  117.                                 Toast.LENGTH_SHORT).show();    
  118.                         Intent intent = new Intent(LoginActivity.this,    
  119.                                 MainActivity.class);    
  120.                         startActivity(intent);    
  121.                     } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {    
  122.                         Toast.makeText(getApplicationContext(), "正在擷取驗證碼",    
  123.                                 Toast.LENGTH_SHORT).show();    
  124.                     } else {    
  125.                         ((Throwable) data).printStackTrace();    
  126.                     }    
  127.                 }    
  128.             }    
  129.         }    
  130.     };    
  131.     private boolean judgePhoneNums(String phoneNums) {    
  132.         if (isMatchLength(phoneNums, 11)    
  133.                 && isMobileNO(phoneNums)) {    
  134.             return true;    
  135.         }    
  136.         Toast.makeText(this, "手機号碼輸入有誤!",Toast.LENGTH_SHORT).show();    
  137.         return false;    
  138.     }    
  139.     public static boolean isMatchLength(String str, int length) {    
  140.         if (str.isEmpty()) {    
  141.             return false;    
  142.         } else {    
  143.             return str.length() == length ? true : false;    
  144.         }    
  145.     }    
  146.     public static boolean isMobileNO(String mobileNums) {    
  147.         String telRegex = "[1][358]\\d{9}";// "[1]"代表第1位為數字1,"[358]"代表第二位可以為3、5、8中的一個,"\\d{9}"代表後面是可以是0~9的數字,有9位。    
  148.         if (TextUtils.isEmpty(mobileNums))    
  149.             return false;    
  150.         else    
  151.             return mobileNums.matches(telRegex);    
  152.     }    
  153.     private void createProgressBar() {    
  154.         FrameLayout layout = (FrameLayout) findViewById(android.R.id.content);    
  155.         FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(    
  156.                 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);    
  157.         layoutParams.gravity = Gravity.CENTER;    
  158.         ProgressBar mProBar = new ProgressBar(this);    
  159.         mProBar.setLayoutParams(layoutParams);    
  160.         mProBar.setVisibility(View.VISIBLE);    
  161.         layout.addView(mProBar);    
  162.     }    
  163.     @Override    
  164.     protected void onDestroy() {    
  165.         SMSSDK.unregisterAllEventHandler();    
  166.         super.onDestroy();    
  167.     }    
  168. }    

  驗證成功的界面我就不寫了。