1. 程式人生 > >Android從零單排之免費簡訊驗證

Android從零單排之免費簡訊驗證

介紹

簡訊驗證功能大家都很熟悉了。在很多地方都能見到,註冊新使用者或者短息驗證支付等。簡訊驗證利用簡訊驗證碼來註冊會員,大大降低了非法註冊,很大程度上提高了使用者賬戶的安全性。

   目前市面上已經有了很多提供簡訊驗證的服務商,有收費的,也有免費的。如果是個人的開發者,用免費的是最划算的了!下面我就介紹一個免費的簡訊驗證平臺---Mob.com

   Mob平臺提供的簡訊驗證功能可以實現快速的驗證和匹配通訊錄好友功能,並且能為每個app每天提供10000條免費簡訊驗證。很多開發者都想在自己的app中整合簡訊驗證功能,下面我們就來體驗一下免費的”快感“吧!

應用

 1. 首先需要註冊成為mob平臺使用者,然後進入控制中心中的【免費簡訊驗證碼SDK】,在介面上點選【新增新應用】新增自己的應用。這一步驟完成之後,會給你提供一個AppKey

和一個App Secret。需要把這兩個碼記下來,下面有重要用處。



SMSSDK就是平臺提供的驗證簡訊的SDK,sample資料夾是一個demo。

       3. 在ecliplse中匯入這個sdk,作為一個library,然後把它作為一個庫引入到你自己的專案中。


接下來,需要在AndroidManifest.xml中新增如下smssdk需要的許可權:

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

在activity標籤下新增如下資訊:

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

            接下來,在你的專案啟動的時候,呼叫

SMSSDK.initSDK(this, “appkey”, “appsecret”);

             第二個和第三個引數分別是你在mob平臺上新增應用提供的兩個碼!
    然後添加註冊回撥監聽介面

SMSSDK.regeisterEventHandler(EventHandler);

             其中EventHandler表示毀掉函式,包括四個方法。

public void onRegister();//在回撥物件被註冊的時候被呼叫
public void beforeEvent(int event, Object data);//在操作之前被觸發
public void afterEvent(int event, int result, Object data);//在操作結束的時候被觸發
public void onUnregister();//在反註冊的時候被觸發

             一般只需要實現afterEvent方法就夠了。該方法有3個引數,event表示操作的型別,result表示操作的結果,data表示操作返回的資料。比較常用的event有 EVENT_GET_VERIFICATION_CODE(獲取驗證碼)、EVENT_SUBMIT_VERIFICATION_CODE(提交驗證碼)。

    在處理完成之後,需要呼叫反註冊將其銷燬

SMSSDK.unresigterEventHandler(EventHandler);

          注意:EventHandler的四個回撥函式都不能在UI執行緒中執行,需要使用handler傳送訊息給UI執行緒處理。

    下面看我的例子吧:

/**
	 * 初始化簡訊SDK
	 */
	private void initSDK() {
		SMSSDK.initSDK(this, "xxxxxx", "xxxxxxxx");
		EventHandler eventHandler = new EventHandler() {
			/**
			 * 在操作之後被觸發
			 * 
			 * @param event
			 *            引數1
			 * @param result
			 *            引數2 SMSSDK.RESULT_COMPLETE表示操作成功,為SMSSDK.
			 *            RESULT_ERROR表示操作失敗
			 * @param data
			 *            事件操作的結果
			 */
			@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 = phoneNumEt.getText().toString();
		switch (v.getId()) {
		case R.id.back_iv:
			this.finish();
			KeyBoardUtils.closeKeybord(phoneNumEt, RegisterActivity.this);
			break;
		case R.id.request_code_btn:
			// 1. 通過規則判斷手機號
			if (!judgePhoneNums(phoneNums)) {
				return;
			} // 2. 通過sdk傳送簡訊驗證
			SMSSDK.getVerificationCode("86", phoneNums);

			// 3. 把按鈕變成不可點選,並且顯示倒計時(正在獲取)
			requestCodeBtn.setClickable(false);
			requestCodeBtn.setText("重新發送(" + i-- + ")");
			new Thread(new Runnable() {
				@Override
				public void run() {
					for (int i = 30; i > 0; i--) {
						handler.sendEmptyMessage(-9);
						if (i <= 0) {
							break;
						}
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					handler.sendEmptyMessage(-8);
				}
			}).start();

			// 4. 開啟廣播來接受讀取簡訊

			break;
		case R.id.commit_btn:
			// judgePhoneNums(phoneNums);
			SMSSDK.submitVerificationCode("86", phoneNums, inputCodeEt
					.getText().toString());
			createProgressBar();
			// 驗證通過之後,將smssdk註冊程式碼登出
			// SMSSDK.unregisterEventHandler(eventHandler);
			break;
		case R.id.clear_phone_iv:
			phoneNumEt.setText("");
			break;
		case R.id.clear_code_iv:
			inputCodeEt.setText("");
			break;
		}
	}
Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			if (msg.what == -9) {
				requestCodeBtn.setText("重新發送(" + i-- + ")");
			} else if (msg.what == -8) {
				requestCodeBtn.setText("獲取驗證碼");
				requestCodeBtn.setClickable(true);
			} else {
				int event = msg.arg1;
				int result = msg.arg2;
				Object data = msg.obj;
				Log.e("event", "event=" + event);
				if (result == SMSSDK.RESULT_COMPLETE) {
					// 簡訊註冊成功後,返回MainActivity,然後提示新好友
					if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {// 提交驗證碼成功
						Toast.makeText(getApplicationContext(), "提交驗證碼成功",
								Toast.LENGTH_SHORT).show();
						Intent intent = new Intent(RegisterActivity.this,
								MainActivity.class);
						startActivity(intent);
					} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
						Toast.makeText(getApplicationContext(), "驗證碼已經發送",
								Toast.LENGTH_SHORT).show();
					} else {
						((Throwable) data).printStackTrace();
					}
				}
			}
		}
	};
@Override
	protected void onDestroy() {
		super.onDestroy();
		//
		this.unregisterReceiver(smsBroadcastReceiver);
		SMSSDK.unregisterAllEventHandler();
	}

總結

        至此,一個簡訊驗證功能就已經實現了。這個平臺有一些限制,app必須聯網,驗證碼只能是4位。還有就是驗證簡訊不能自定義,只能是  【xxxx】xxxx的驗證碼:7521。  這種形式的。如果開發者不希望有這些限制的話,我看只能找運營商合作了。

下載