短信验证

前言

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短信将据运营商供最低价格标准收费
相关文章
相关标签/搜索