Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android實現獲取短信驗證碼(Eclipse IDE版)

Android實現獲取短信驗證碼(Eclipse IDE版)

編輯:關於Android編程

當前很多APP都有短信驗證的功能,如:帳號與手機號綁定的時候,通過短信驗證的方式確認身份。那麼該如何實現這個功能呢。

先簡單說一下流程

第一步:獲取短信驗證碼SDK

第二步:導入SDK

第三步:配置AndroidMainifest.xml

第四步:添加代碼

 

首先先看一下布局界面

\

 

通過這樣的界面來簡單的實現短信驗證的功能。

 

第一步:獲取獲取短信驗證碼SDK

進入Mob官網,點擊SDK下載---短信驗證碼SDK---SMS For Android---SDK下載(Eclipse)

下載成功後,解壓文件,得到ShortMessageSDKGUI和SMSSDK兩個文件。

第二步:導入SDK

在eclipse中導入解壓後得到的兩個文件。短信SDK在Eclipse中使用項目依賴的方式完成集成。將文件倒入後,右鍵我們要做的項目,選擇“屬性”,在彈出的窗口中側欄選擇"Andriod“並且在引用中選擇ShortMessageSDKGUI和SMSSDK。

注意:文件的編碼格式選為 UTF-8 不然會出現各種亂碼和錯誤。

第三步:配置AndroidMainifest.xml

添加權限:

 

 
    
    
    
    
    
    
    
    

第四部:添加代碼

 

知識儲備:

SMSSDK發起

EventHandler接受

1 初始化接口

所有的操作都是通過SMSSDK來發起,並通過EventHandler來接受。

\

1.1 initSDK

短信SDK的入口,需要傳遞您從ShareSDK應用管理後台中注冊的應用AppKey和AppSecrete,如果填寫錯誤,後續的操作都將不能進行。(其中的appkey和appsecret需要在Mob官網登錄帳號之後,點擊頭像進入後台中的SecurityCodeSDK中查看。)

1.2 registerEventHandler

用來往SMSSDK中注冊一個事件接收器,SMSSDK允許開發者注冊任意數量的接收器,所有接收器都會在事件 被觸發時收到消息。

SMSSDK.initSDK(this,APPKEY,APPSECRET);
        EventHandler 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) {
                //提交驗證碼成功
                }else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE){
                //獲取驗證碼成功
                }else if (event ==SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES){
                //返回支持發送驗證碼的國家列表
                } 
              }else{                                                                 
                 ((Throwable)data).printStackTrace(); 
          }
      } 
   }; 
SMSSDK.registerEventHandler(eh); //注冊短信回調

1.3 unregisterEventHandler

反注冊函數,registerEventHandler 必須和unregisterEventHandler配套使用,否則可能造成內存洩漏。

2.短信驗證碼接口

\

其中OnSendMessageHandler的定義如下,這個Handler的用途是在發送短信之前,開發者自己執行一個操作,來根據電話號碼判斷是否需要發送短信

 

public interface OnSendMessageHandler {
 
    //#if def{lang} == cn
    /** 
     * 此方法在發送驗證短信前被調用,傳入參數為接收者號碼
     * 返回true表示此號碼無須實際接收短信
     */
    //#elif def{lang} == en
    /**
     * This method will be called before verification message being to sent,
     * input params are the message receiver
     * return true means this number won't actually receive the message
     */
    //#endif
    public boolean onSendMessage(String country, String phone);
 
}

 

 

 

2.1 getSupportedCountries

短信SDK並不能支持世界上所有國家的短信驗證服務,因此我們提供了getSupportedCountries方法,在使用短信驗證碼功能前請調用此方法,獲取當前SDK可以支持的國家列表和號碼匹配規則。

2.2 getVerificationCode

getVerificationCode用於向服務器請求發送驗證碼的服務,需要傳遞國家代號和接收驗證碼的手機號碼,支持此服務的國家代碼在 getSupportedCountries中獲取。

2.3 getVerificationCode

請求getVerificationCode的時間間隔不應該小於60秒,否則服務端會返回“操作過 於頻繁”的錯誤

2.4 submitVerificationCode

submitVerificationCode用於向服務器提交接收到的短信驗證碼,驗證成功後會通過EventHandler返回國家代碼和電話號碼。


****這裡我們主要用到兩個函數
getVerificationCode來向服務器請求發送驗證碼
submitVerificationCode向服務器提交接收到的短信驗證碼

 

 

 

3.Android 短信SDK操作回調

 

3.1注冊回調:

SMSSDK.registerEventHandler(EventHandler);

3.2其中的EventHandler即為操作回調。它包括4個方法,分別為:

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

3.2.1 onRegister

在回調對象注冊的時候被觸發。

3.2.2 beforeEvent

在操作執行前被觸發,其參數event表示操作的類型,data是從外部傳入的數據

3.2.3 afterEvent

在操作結束時被觸發,同樣具備event和data參數,但是data是事件操作結果,其具體取值根據參數result而定。result是操作結果,為SMSSDK.RESULT_COMPLETE表示操作成功,為SMSSDK.RESULT_ERROR表示操作失敗。

---------------------------------------------------------------------------------割-----------------------------------------------------------------------------------------

 

1) 當result=SMSSDK.RESULT_ERROR,則data的類型為Throwable;如果服務器有返回錯誤碼,那麼這個Throwable的message就存放著服務器返回的json數據,你可以從中讀取相關信息。示例如下:

 

 

//#if def{lang} == cn
// 根據服務器返回的網絡錯誤,給toast提示
//#elif def{lang} == en
// show toast according to the error code
//#endif
try {
     Throwable throwable = (Throwable) data;
     throwable.printStackTrace();
     JSONObject object = new JSONObject(throwable.getMessage());
     String des = object.optString("detail");//錯誤描述
     int status = object.optInt("status");//錯誤代碼
     if (status > 0 && !TextUtils.isEmpty(des)) {
	Toast.makeText(activity, des, Toast.LENGTH_SHORT).show();
	return;
     }
} catch (Exception e) {
     //do something							
}

 

2) 當result=SMSSDK.RESULT_COMPLETE,則data的類型如下表所示。onUnregister在被反注冊的時候被觸發。

 

\

 

短信SDK采用“廣播”的方式發送操作結果。這就是說,每次調用registerEventHandler都會設置一個新的EventHandler到SDK內部,當事件發生時,這些注冊進來的EventHandler都能收到信息而不會發生“後者替換前者”的問題。為了避免EventHandler注冊後不再使用而造成內存洩漏,請務必在確定不使用某個EventHandler時,調用反注冊代碼將其注銷,反注冊的方法為:

SMSSDK.unregisterEventHandler(EventHandler);

在EventHandler的4個回調方法都可能不在UI線程下,因此如果要在其中執行UI操作,請務必使用Handler發送一個消息給UI線程處理。
---------------------------------------------------------------------------------割-----------------------------------------------------------------------------------------

大概的框架:

1.獲取驗證碼按鈕:
添加監聽器,監聽器中調用SMSSDK.getVerificationCode(String arg0, String arg1)
其中參數arg0是國家編號,arg1是手機號碼

 

2.驗證按鈕:
添加監聽器,監聽器中調用SMSSDK.submitVerificationCode(String arg0, String arg1, String arg2);
其中參數arg0是國家編號,arg1是手機號,arg2是填寫的驗證碼
 

3.onCreate()中:
3.1SMSSDK.initSDK(Context arg0, String arg1, String arg2)
3.2 新建一個EventHandler對象,實現裡面的afterEvent(int event, int result, Object data)函數,來獲取
最後SMSSDK.registerEventHandler(EventHandler arg0)
 

4.類中:
1.首先一定要寫一個EventHandler的反注冊函數。但是是需要在確定不使用這個EventHandler對象的時候,那麼在這個Activity結束的時候,肯定不用了,這裡覆蓋: Activity 中的 onDestroy()方法,在方法中添加SMSSDK.unregisterAllEventHandler();來實現反注冊。
2.這裡還寫了兩個Handler對象,重寫public void handleMessage (Message msg)放來,來獲取驗證信息的狀態。一個對象來改變獲取驗證碼按鈕的可點擊的屬性,來防止獲取驗證碼過於頻繁。另一個對象獲取信息後,通過返回的結果來判斷是否驗證成功。
 

------------------------------------------------------------------------------------------割-----------------------------------------------------------------------------------------------------
 

下面給出具體的布局文件和Java代碼,如果有不對的地方歡迎評論。

 



    

    

    

    

        
    

    

    

    

    

package com.example.testyzm;

import static com.mob.tools.utils.R.getStringRes;
import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

	private EditText phone; // 手機號
	private EditText cord; // 驗證碼
	private TextView now; // 提示信息
	private Button getCord; // 獲取驗證碼按鈕
	private Button saveCord;// 驗證按鈕

	private String iPhone;
	private String iCord;
	private int time = 60;
	private boolean flag = true;// 驗證碼是否正確標記

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 獲取控件
		getView();

		SMSSDK.initSDK(this, "1914d1e0f1a38",
				"658801a43e091a2f650c349eb9e62425");
		EventHandler eh = 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(eh);

	}

	// 獲取控件
	private void getView() {
		phone = (EditText) findViewById(R.id.phone);
		cord = (EditText) findViewById(R.id.cord);
		now = (TextView) findViewById(R.id.now);
		getCord = (Button) findViewById(R.id.getcord);
		saveCord = (Button) findViewById(R.id.savecord);
		getCord.setOnClickListener(this);
		saveCord.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.getcord:
			if (!TextUtils.isEmpty(phone.getText().toString().trim())) {
				if (phone.getText().toString().trim().length() == 11) {
					iPhone = phone.getText().toString().trim();
					//請求獲取短信驗證碼 在監聽中返回
					SMSSDK.getVerificationCode("86", iPhone);
					cord.requestFocus();
					getCord.setVisibility(View.GONE);
				} else {
					Toast.makeText(MainActivity.this, "請輸入完整電話號碼",
							Toast.LENGTH_LONG).show();
					phone.requestFocus();
				}
			} else {
				Toast.makeText(MainActivity.this, "請輸入您的電話號碼",
						Toast.LENGTH_LONG).show();
				phone.requestFocus();
			}
			break;

		case R.id.savecord:
			if (!TextUtils.isEmpty(cord.getText().toString().trim())) {
				if (cord.getText().toString().trim().length() == 4) {
					iCord = cord.getText().toString().trim();
					//提交短信驗證碼 在監聽中返回
					SMSSDK.submitVerificationCode("86", iPhone, iCord);
					flag = false;
				} else {
					Toast.makeText(MainActivity.this, "請輸入完整驗證碼",
							Toast.LENGTH_LONG).show();
					cord.requestFocus();
				}
			} else {
				Toast.makeText(MainActivity.this, "請輸入驗證碼", Toast.LENGTH_LONG)
						.show();
				cord.requestFocus();
			}
			break;

		default:
			break;
		}
	}

	// 驗證碼送成功後提示文字
	private void reminderText() {
		now.setVisibility(View.VISIBLE);
		handlerText.sendEmptyMessageDelayed(1, 1000);
	}

	Handler handlerText = new Handler() {
		public void handleMessage(Message msg) {
			if (msg.what == 1) {
				if (time > 0) {
					now.setText("驗證碼已發送" + time + "秒");
					time--;
					handlerText.sendEmptyMessageDelayed(1, 1000);
				} else {
					now.setText("提示信息");
					time = 60;
					now.setVisibility(View.GONE);
					getCord.setVisibility(View.VISIBLE);
				}
			} else {
				cord.setText("");
				now.setText("提示信息");
				time = 60;
				now.setVisibility(View.GONE);
				getCord.setVisibility(View.VISIBLE);
			}
		};
	};

	Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			int event = msg.arg1;
			int result = msg.arg2;
			Object data = msg.obj;
			Log.e("event", "event=" + event);
			if (result == SMSSDK.RESULT_COMPLETE) {

				if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {// 提交驗證碼成功,驗證通過
					Toast.makeText(getApplicationContext(), "驗證碼校驗成功",
							Toast.LENGTH_SHORT).show();
					handlerText.sendEmptyMessage(2);
				} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {// 服務器驗證碼發送成功
					reminderText();
					Toast.makeText(getApplicationContext(), "驗證碼已經發送",
							Toast.LENGTH_SHORT).show();
				} else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {// 返回支持發送驗證碼的國家列表
					Toast.makeText(getApplicationContext(), "獲取國家列表成功",
							Toast.LENGTH_SHORT).show();
				}
			} else {
				if (flag) {
					getCord.setVisibility(View.VISIBLE);
					Toast.makeText(MainActivity.this, "驗證碼獲取失敗,請重新獲取",
							Toast.LENGTH_SHORT).show();
					phone.requestFocus();
				} else {
					((Throwable) data).printStackTrace();
					int resId = getStringRes(MainActivity.this,
							"smssdk_network_error");
					Toast.makeText(MainActivity.this, "驗證碼錯誤",
							Toast.LENGTH_SHORT).show();
					cord.selectAll();
					if (resId > 0) {
						Toast.makeText(MainActivity.this, resId,
								Toast.LENGTH_SHORT).show();
					}
				}
			}
		}
	};

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

}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved