1. 程式人生 > >安卓使用Mob實現簡訊驗證登入程式碼 很簡單

安卓使用Mob實現簡訊驗證登入程式碼 很簡單

註冊賬號

在 Mob 官網右上角點選註冊,依次填入資訊,其中公司一欄可以隨便填

新增應用

登入後,點選 SecurityCodeSDK - 立即使用,Mob 會提示你新增應用,名字自己填,再選 Android,新增完後再點選 SecurityCodeSDk - 進入,之後應該可以看到如下介面

AppKey 和 AppSecret 一會會用到

下載 SDK

在網頁上方“下載SDK”中點選“免費簡訊驗證碼SDK”,網頁跳轉後找到“簡訊驗證碼SDK”,根據需要選擇系統吧,我做的 Android 就選 Android,網頁跳轉後根據需要選擇 AndroidStudio 或者 eclipse,在螢幕右方選擇,選好後點擊即可開始下載。

下好後解壓,開啟資料夾,目錄結構如下


要用到的 SDK 在 SMSSDK 資料夾中

匯入 SDK 到工程目錄

開啟 SMSSDK 資料夾,把兩個 .jar 和 .aar 檔案複製到工程目錄中 libs 資料夾下,如圖所示


貼上進去後,選中兩個 .jar 檔案,右鍵點選,選擇 add as library

再開啟 app 目錄下的 build.gradle,新增如下兩處內容

1 2 3 4 5 repositories{ flatDir{ dirs 'libs' } }
1 2 compile name:'SMSSDK-2.1.4',ext:'aar' compile name:'SMSSDKGUI-2.1.4',ext:'aar'

最後看起來是這樣的


新增的程式碼為 22-26 行和 36-37 行。

開啟 AndroidManifest.xml,新增如下許可權

1 2 3 4 5 6 7 8 9 10 <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.READ_SMS" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />


最終,你的AndroidManifest.xml看起來應該像這樣:

程式程式碼

先把完整程式碼貼出來(沒貼 xml,這個不影響)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 public class Register extends AppCompatActivity implements View.OnClickListener { private EditText etPhoneNumber;    // 電話號碼 private Button sendVerificationCode;  // 傳送驗證碼 private EditText etVerificationCode;  // 驗證碼 private Button nextStep;        // 下一步 private String phoneNumber;     // 電話號碼 private String verificationCode;  // 驗證碼 private boolean flag;  // 操作是否成功 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); init(); // 初始化控制元件、註冊點選事件 final Context context = Register.this;            // context 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);   // 註冊回撥介面 } private void init() { etPhoneNumber = (EditText) findViewById(R.id.edit_phone_number); sendVerificationCode = (Button) findViewById(R.id.btn_send_verification_code); etVerificationCode = (EditText) findViewById(R.id.edit_verification_code); nextStep = (Button) findViewById(R.id.btn_next_step); sendVerificationCode.setOnClickListener(this); nextStep.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_send_verification_code: if (!TextUtils.isEmpty(etPhoneNumber.getText())) { if (etPhoneNumber.getText().length() == 11) { phoneNumber = etPhoneNumber.getText().toString(); SMSSDK.getVerificationCode("86", phoneNumber); // 傳送驗證碼給號碼的 phoneNumber 的手機 etVerificationCode.requestFocus(); } else { Toast.makeText(this"請輸入完整的電話號碼", Toast.LENGTH_SHORT).show(); etPhoneNumber.requestFocus(); } else { Toast.makeText(this"請輸入電話號碼", Toast.LENGTH_SHORT).show(); etPhoneNumber.requestFocus(); } break; case R.id.btn_next_step: if (!TextUtils.isEmpty(etVerificationCode.getText())) { if (etVerificationCode.getText().length() == 4) { verificationCode = etVerificationCode.getText().toString(); SMSSDK.submitVerificationCode("86", phoneNumber, verificationCode); flag = false; else { Toast.makeText(this"請輸入完整的驗證碼", Toast.LENGTH_SHORT).show(); etVerificationCode.requestFocus(); } else { Toast.makeText(this"請輸入驗證碼", Toast.LENGTH_SHORT).show(); etVerificationCode.requestFocus(); } break; default: break; } } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); int event = msg.arg1; int result = msg.arg2; Object data = msg.obj; if (result == SMSSDK.RESULT_COMPLETE) { // 如果操作成功 if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { // 校驗驗證碼,返回校驗的手機和國家程式碼 Toast.makeText(Register.this"驗證成功", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(Register.this, MainActivity.class); startActivity(intent); else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { // 獲取驗證碼成功,true為智慧驗證,false為普通下發簡訊 Toast.makeText(Register.this"驗證碼已傳送", Toast.LENGTH_SHORT).show(); else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) { // 返回支援傳送驗證碼的國家列表 } else { // 如果操作失敗 if (flag) { Toast.makeText(Register.this"驗證碼獲取失敗,請重新獲取", Toast.LENGTH_SHORT).show(); etPhoneNumber.requestFocus(); else { ((Throwable) data).printStackTrace(); Toast.makeText(Register.this"驗證碼錯誤", Toast.LENGTH_SHORT).show(); } } } }; @Override protected void onDestroy() { super.onDestroy(); SMSSDK.unregisterAllEventHandler(); // 登出回撥介面 } }

注意要把你的 AppKey 和 AppSecret 替換進去。

其實看過很多教程你會發現,很多時候並不是程式碼看不懂,而是在配置檔案的時候出了問題,因為一個剛接觸 Android 沒兩天的人是不可能對很多第三方 SDK 有需求的,一開始都是以基礎為主,所以需要配置第三方 SDK 的很多都是寫過一些 Android 程式碼的人,他們所關心的其實就是該呼叫哪些方法來實現自己的目的,所以知道怎麼呼叫就行了,再根據實際需求寫幾個 if-else 就可以了。

注意

1 2 3 4 5 6 7 8 9 10 11 12 SMSSDK.initSDK(context, AppKey, AppSecret);      // 初始化 SDK 單例,可以多次呼叫 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);   // 註冊回撥介面

這幾行程式碼是呼叫這個 SDK 的基礎,寫在 onCreate 中。

傳送簡訊驗證碼的語句是

1 SMSSDK.getVerificationCode("86", phoneNumber);

phoneNumber 的取值取決於使用者輸入的號碼,“86”是中國的區號,根據需求也可以讓使用者自己選擇,稍微修改一下就行。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 if (result == SMSSDK.RESULT_COMPLETE) { // 如果操作成功 if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { // 校驗驗證碼,返回校驗的手機和國家程式碼 Toast.makeText(Register.this"驗證成功", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(Register.this, MainActivity.class); startActivity(intent); else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { // 獲取驗證碼成功,true為智慧驗證,false為普通下發簡訊 Toast.makeText(Register.this"驗證碼已傳送", Toast.LENGTH_SHORT).show(); else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) { // 返回支援傳送驗證碼的國家列表 } else { // 如果操作失敗 if (flag) { Toast.makeText(Register.this"驗證碼獲取失敗,請重新獲取", Toast.LENGTH_SHORT).show(); etPhoneNumber.requestFocus(); else { ((Throwable) data).printStackTrace(); Toast.makeText(Register.this"驗證碼錯誤", Toast.LENGTH_SHORT).show(); } }

這幾行程式碼判斷驗證碼發沒傳送以及正不正確,根據 event 來確定是哪一種情況,如果想深入瞭解,可以參考官方文件

當然,免費服務肯定收費的要差點,體現在簡訊發的比收費的慢,大概要十秒才能收到,收費的三秒就收到了,由於只是個比賽,自己做著玩,用免費的足矣。

另外,最開始免費的時候每天只能發 20 條簡訊,而且一個手機號每 12 小時只能收到 5 條,所以,省著點用,當然你可以在應用管理介面申請上線登記(見第一張圖),稽核通過後就完全免費了。