短信驗證

前言

AndroidStudio短信驗證之MobSMS與BmobSMS。html

MobSMS

配置

  • SDK
    • libs
    • gradle(app)
      /*SMS-將libs加入倉庫(repositories)*/
      repositories {
          flatDir {
              dirs 'libs'// aar目錄地址
          }
      }
      複製代碼
      compile name: 'SMSSDK-3.0.0', ext: 'aar'
      複製代碼
  • 清單文件
    • 權限android

      <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" />
      複製代碼
    • applicationgit

      <!-- SMS-配AppKey和AppSecret -->
        <meta-data
        android:name="Mob-AppKey"
        android:value="xxx" />
        <meta-data
        android:name="Mob-AppSecret"
        android:value="xxx" />
        <!-- SMS-添Activity -->
        <activity
        android:name="com.mob.tools.MobUIShell"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:windowSoftInputMode="stateHidden|adjustResize" />
      複製代碼

代碼

初始化

/*
 * 提示用戶讀取通訊錄則添下面代碼且須其它代碼調用前,否無用;無此需求可不加該行代碼
 * 加該行代碼,申請權限成功,系統再彈對話框提示用戶是否繼續用該權限
 * */
SMSSDK.setAskPermisionOnReadContact(true);
// 初始化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);
複製代碼

驗證碼處理

/**
 * 處理手機驗證碼
 *
 * @param countries
 */
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) {
            // 回調完成 result-1
            /*boolean smart = (Boolean) data;
            if (smart) {// 經過智能驗證
            } else {// 仍走短信驗證
            }*/
            LogManager.e("驗證碼狀態", "回調完成" + " " + event + "" + result);
            if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
                // 提交驗證碼成功 event-1
                LogManager.e("驗證碼狀態", "提交成功" + " " + event + "" + result);
                App.getInstance().setUserPhone(etUserPhoneRegister.getText().toString().trim());
                jumpNoBundle(PersonalInfoActivity.class);
            } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
                // 獲驗證碼成功 event-2
                LogManager.e("驗證碼狀態", "獲取成功" + " " + event + "" + result);
                toastShort(getString(R.string.identifyCodeGetHint));
            } else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {
                // 返支持發送驗證碼國家列表 event-3
            }
        } else {
            /*int status = 0;*/
            try {
                ((Throwable) data).printStackTrace();
                Throwable throwable = (Throwable) data;
                JSONObject object = new JSONObject(throwable.getMessage());
                String des = object.optString("detail");
                /*status = object.optInt("status");*/
                if (!TextUtils.isEmpty(des)) {
                    toastShort(des);
                    return;
                }
            } catch (Exception e) {
                SMSLog.getInstance().w(e);
            }
        }
    }
};
複製代碼

驗證碼獲取

/*
 * 短信SDK並不支持世界上全部國家短信驗證服務,故提供getSupportedCountries方法,用短信驗證碼功能前調此方法獲當前SDK支持國家列表和號碼匹配規則。
 * getVerificationCode用於向服務器請求發送驗證碼服務,監聽中返回,需傳國家代號和接收驗證碼手機號碼,在getSupportedCountries中獲支持此服務國家代碼。
 * 請求getVerificationCode時間間隔應不小60秒,否服務端返回「操做過於頻繁」錯誤。
 * submitVerificationCode用於向服務器提交所接短信驗證碼,驗證成功後經過EventHandler返國家代碼和電話號碼。
 */                            
SMSSDK.getVerificationCode("86",etUserPhoneRegister.getText().toString().trim());
複製代碼

移除監聽

// 註銷SDK防內存泄漏
SMSSDK.unregisterEventHandler(eventHandler);
複製代碼

BmobSMS

配置

  • SDK
    • gradle(project)github

      // Bmob之maven倉庫地址
      maven { url "https://raw.github.com/bmob/bmob-android-sdk/master" }
      複製代碼
    • gradle(app)apache

      android {
        	   // 兼容6.0出錯在dependencies下用compile 'cn.bmob.android:http-legacy:1.0'
        	   useLibrary 'org.apache.http.legacy'
        }
      
        dependencies {
        	   compile 'cn.bmob.android:http-legacy:1.0'
        	   /*兼容6.0加依賴org.apache.http.legacy.jar*/
        	   compile 'cn.bmob.android:bmob-sdk:3.5.5'
        	   /*bmob*/
        }
      複製代碼

      bash

      // Bmob短信服務單包
      compile 'cn.bmob.android:bmob-sms:1.0.1'
      複製代碼
  • 清單文件
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <!--保CPU運轉,屏幕和鍵盤燈可關閉,用於文件上傳下載 -->
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--容許讀手機狀態 創BmobInstallation--> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    複製代碼

代碼

初始化

// 默初始化
Bmob.initialize(this, "Application ID");
複製代碼

驗證碼獲取

BmobSMS.requestSMSCode("13673541527", "哈哈:123456", new QueryListener<Integer>() {
    @Override
    public void done(Integer integer, BmobException e) {
        if (e == null) {
            // 驗證碼發送成功
            toastShort("發送成功" + integer);
        } else {
            toastShort(e.getErrorCode() + e.getLocalizedMessage());
        }
    }
});
複製代碼

驗證碼處理

BmobSMS.verifySmsCode(etUserPhoneRegister.getText().toString().trim(), etIdentifyCodeRegister.getText().toString().trim(), new UpdateListener() {
    @Override
    public void done(BmobException e) {
        if (e != null) {
            toastShort("驗證成功");
        }
    }
});
複製代碼

對比

模板定製

  • Mob接入http短信並改短信簽名(即短信後綴)後才支持改短信模板,SDK短信內容不支持自定義。參考
  • Bmob帳戶後臺定製

驗證碼自動填充

價格

  • 每Bmob賬戶10條免費測試短信,超需購買才能繼續用
  • Mob帳戶
    • SMSSDK2.X+版經過上線登記審覈後徹底免費
    • 應用未經過上線登記審覈,天天僅20條測試短信
    • HTTP-API短信將據運營商供最低價格標準收費
相關文章
相關標籤/搜索