Android最快捷集成Sharesdk短信验证码功能(干货)

一:概述

之前在公司用ShareSDK做过第三方登录和分享功能,相比较最早做第三方分享还得分别集成微博,微信,QQ三个官方SDK是方便了不少(下一篇文章着重介绍第三方登录和分享功能)。 到新公司登录需求是手机验证码登录,于是首先想到用ShareSDK中的短信验证码SDK实现,在仔细阅读官方文档后发现,主要介绍的是利用官方的注册界面实现功能,而在实际开发需求中使用自定义的注册界面实现的话在Demo,官方文档显得太臃肿而又不好阅读,因此我特意做了如下总结,帮助大家最快的集成ShareSDK的短信验证码功能。

主要包含:
ShareSDK的快速集成(针对AndroidStudio用户)
简单的注册界面ui编写
短信验证码倒计时的实现
短信SDK的回调等操作

二:使用步骤
1:注册mob开发者账号:首先到http://www.mob.com/注册开发者账号。之后创建应用->>点击进入后台->>添加产品->>选择SMSSDK,在这里面可以查看验证记录,设置短信模板,充值等。
注:(1)同一应用下的同一手机号在12小时内只可以发送5条短信,因此在测试的时候谨慎使用,超过条数也只能换号或者再等12小时了。
(2)因为ShareSDK自带智能验证功能,在第一次发送验证码后,之后会自动验证不会受到验证码,因此在测试的时候需要在后台的短信设置中,将最下面的智能验证功能关闭。
2:集成SDK:在官网下载最新的SDK,由于最新的为3.0.0.且新版与3.0之前的版本不兼容,因此本文着重介绍最新的3.0.0版本的集成方法,之前版本的集成方法可以详细参照官网。
下载SDK之后可以看到这个目录,其中SMSDK存放的就是短信SDK的全部内容。
这里写图片描述
打开后可以看到下面4个文件,其中前两个是shareSDK的公共库,如果同时想集成shareSDK的其他功能,公共库保存一份即可,但要注意版本一致或兼容,后面两个aar文件是短信SDK的核心,后缀名为GUI文件的是带官方ui的SDK,上面那个不带官方UI,需要定制。不用管那么多,把四个包都扔入Android studio中项目下的lib下。
这里写图片描述
放入lib下,前两个jar记得也要右键导入。后面两个aar文件需要这样配置
这里写图片描述
这里写图片描述
这里写图片描述
务必记得在SMSSDK-vision 这个vision换成特点的版本号,本项目是3.0.0。

3:添加代码配置
添加以下权限:

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

添加以下activity片段

<activity
   android:name="com.mob.tools.MobUIShell"
   android:theme="@android:style/Theme.Translucent.NoTitleBar"
   android:configChanges="keyboardHidden|orientation|screenSize"
   android:windowSoftInputMode="stateHidden|adjustResize"/>

在application配置下列属性:

android:name="com.mob.MobApplication"

<meta-data android:name="Mob-AppKey" android:value="你的AppKey"/>
<meta-data android:name="Mob-AppSecret" android:value="你的AppSecret"/>

注:有两种方法可以配置appkey和appsecret,以这种方法配置,如果咱们的程序中有自己的application公共类,只需要将咱们自己的application公共类继承mobapplication即可。否咋可以在代码中进行配置,在初始化sdk时候配置。
通过代码注册你的AppKey和AppSecret
MobSDK.init(context, “你的AppKey”, “你的AppSecret”);

4:如果你开启了proguard混淆,需要在proguard的rules里面添加以下规则:

# SMSSDK
-dontwarn com.mob.**
-keep class com.mob.**{*;}

-dontwarn cn.smssdk.**
-keep class cn.smssdk.**{*;}

5:进行注册界面的编写:
效果图
这里写图片描述

由于这个注册页面很简单,我就直接贴上代码了

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
        android:id="@+id/registerActivity_ry1"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:layout_marginTop="13dp"
            android:layout_width="wrap_content"
        >
        <ImageView
            android:id="@+id/registerActivity_cancel"
            android:layout_marginLeft="20dp"
            android:layout_height="wrap_content"
            android:src="@mipmap/cancel"
            android:layout_height="wrap_content"
            />

        <TextView
            android:id="@+id/registerActivity_register"
            android:layout_width="wrap_content"
            android:textColor="#333333"
            android:text="注册"
            android:layout_centerHorizontal="true"
            android:textSize="17sp"
            />
            android:text="登录"

        <TextView
            android:id="@+id/registerActivity_login"
            android:layout_width="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_height="wrap_content"
        android:id="@+id/registerActivity_ry2"
            android:textSize="17sp"
            android:textColor="#333333"
            android:layout_marginRight="20dp"
            />
    </RelativeLayout>

        android:layout_width="wrap_content"
    <RelativeLayout
        >
        android:layout_height="wrap_content"
        android:background="@mipmap/line1"
        android:layout_below="@+id/registerActivity_ry1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="43dp"

            android:layout_centerVertical="true"
        <EditText
            android:id="@+id/registerActivity_edt1"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:textColor="#777777"
            android:hint="手机号                                               "
        android:layout_height="wrap_content"
            android:background="@null"
            android:layout_marginLeft="14dp"
            android:inputType="number"
    <LinearLayout
            />

    </RelativeLayout>


        android:layout_width="wrap_content"
        android:id="@+id/registerActivity_ry3"
            android:id="@+id/registerActivity_edt2"
        android:background="@mipmap/line1"
        android:layout_below="@+id/registerActivity_ry2"
        android:layout_centerHorizontal="true"
        android:orientation="horizontal"
        android:layout_marginTop="25dp"
        >


        <EditText
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:hint="验证码                         "
            android:textColor="#777777"
            android:layout_gravity="center_vertical"
            android:inputType="number"
            android:background="@null"
            android:layout_marginLeft="14dp"
            />

            android:layout_gravity="center_vertical"
        <TextView
            android:id="@+id/registerActivity_tv"
            android:layout_width="wrap_content"
            android:text="获取验证码"
            android:layout_height="wrap_content"
            android:textColor="#00aeff"
            android:padding="5dp"
            android:textSize="15sp"
            android:layout_marginRight="14dp"
        android:layout_marginTop="25dp"
            />

    </LinearLayout>

    <RelativeLayout
        android:id="@+id/registerActivity_ry4"
        android:layout_width="wrap_content"
        android:background="@mipmap/line1"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/registerActivity_ry3"
        >

        <EditText
            android:layout_marginLeft="14dp"
            android:id="@+id/registerActivity_edt3"
            android:layout_width="wrap_content"
            android:hint="密码                                                         "
            android:layout_height="wrap_content"
            android:textColor="#777777"
            />
            android:layout_centerVertical="true"
            android:background="@null"

    </RelativeLayout>

    <ImageView
        android:layout_height="wrap_content"
        android:id="@+id/registerActivity_btn_register"
        android:layout_width="wrap_content"
        android:src="@drawable/btn_register_bg"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/registerActivity_ry4"
        android:layout_marginTop="25dp"
        android:src="@mipmap/dian"
        />

    <ImageView
        android:layout_width="wrap_content"
</RelativeLayout>
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/registerActivity_btn_register"
        android:layout_marginTop="25dp"
        />

6:短信验证码倒计时的实现
短信验证码通过倒计时,有好多种实现方法,而使用countDownTimer类最为简单,在这里我进行了简单的二次封装,方便今后在项目中可以直接使用,上代码:

/**
 * 验证码倒计时工具类
 */
public class CountDownTimerUtils extends CountDownTimer{
    private TextView mTextView;
    public CountDownTimerUtils(Context mContext,TextView textView, long millisInFuture, long countDownInterval) {
    private Context mContext;


        this.mTextView=textView;
        super(millisInFuture, countDownInterval);
        this.mContext=mContext;
        mTextView.setClickable(false);  //设置不可点击
    }

    @Override
    public void onTick(long millisUntilFinished) {
      //  mTextView.setBackgroundResource(R.drawable.bg_identify_code_press);//设置按钮为灰色(不可点击)
        mTextView.setText(millisUntilFinished/1000+"秒后可重新发送");

        //设置按钮上的文字,获取截取设置为红色
        ForegroundColorSpan span=new ForegroundColorSpan(Color.RED);
        SpannableString spannableString=new SpannableString(mTextView.getText().toString());
    public void onFinish() {
        spannableString.setSpan(span, 0, 2, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//将倒计时的时间设置为红色
        mTextView.setText(spannableString);

    }

    @Override
}
        mTextView.setText("重新获取验证码");
        mTextView.setClickable(true);//重新获得点击
      //  mTextView.setBackgroundResource(R.drawable.bg_identify_code_normal);  //还原背景色
    }

在这个类中设置了按钮点击背景色的变化,数字显示为红色更为醒目等,可以根据实际需求进行更改。简单封装后,在项目中就可以直接使用了,使用方式也很简单:
CountDownTimerUtils utils=new
CountDownTimerUtls(context,btn,10000,1000);
utils.start();
context上下文,btn点击启动的textview或者button

7 短信sdk回调等操作

package com.a3beijing.a2.xiyu;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Handler;
import android.os.Bundle;
import android.os.Message;
import android.text.TextUtils;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.ImageView;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Toast;


import butterknife.BindView;
import com.mob.MobSDK;

import org.json.JSONObject;

import java.util.HashMap;

import utils.CountDownTimerUtils;
import base.BaseActivity;
import butterknife.ButterKnife;
import cn.smssdk.EventHandler;
import butterknife.OnClick;
import cn.smssdk.SMSSDK;
    @BindView(R.id.registerActivity_cancel)
import utils.ToastUtil;

/**
 * 注册页面
 */
public class RegisterActivity extends BaseActivity {



    ImageView registerActivityCancel;
    TextView registerActivityLogin;
    @BindView(R.id.registerActivity_register)
    TextView registerActivityRegister;
    @BindView(R.id.registerActivity_ry1)
    @BindView(R.id.registerActivity_login)
    RelativeLayout registerActivityRy2;
    RelativeLayout registerActivityRy1;
    @BindView(R.id.registerActivity_edt1)
    EditText registerActivityEdt1;
    @BindView(R.id.registerActivity_edt2)
    @BindView(R.id.registerActivity_ry2)
    @BindView(R.id.registerActivity_btn_register)
    EditText registerActivityEdt2;
    @BindView(R.id.registerActivity_tv)
    TextView registerActivityTv;
    @BindView(R.id.registerActivity_ry3)
    LinearLayout registerActivityRy3;
    private String pwd;
    ImageView registerActivityBtnRegister;
    @BindView(R.id.registerActivity_edt3)
    @BindView(R.id.registerActivity_ry4)
    EditText registerActivityEdt3;
    RelativeLayout registerActivityRy4;

    private String code;
    private String phoneNumber;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ButterKnife.bind(this);
        setContentView(R.layout.activity_register);

        //提交验证码成功,如果验证成功会在data里返回数据。data数据类型为HashMap<number,code>
        MobSDK.init(RegisterActivity.this,"yourappkey",
         "yourappsecret");
        SMSSDK.registerEventHandler(ev);
    private EventHandler ev=new EventHandler(){
    }


    //短信验证的回调监听
        @Override
        public void afterEvent(int event, int result, Object data) {
          if (result==SMSSDK.RESULT_COMPLETE){  //回调完成
              //返回用户注册的手机号
          if (event==SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE){
              Log.e("TAG", "提交验证码成功" + data.toString());
             HashMap<String,Object> mData= (HashMap<String, Object>) data;
              //返回国家的编号
              String country= (String) mData.get("country");
                  Log.e("TAG", "验证失败");
              String phone= (String) mData.get("phone");
              Log.e("TAG", country + "====" + phone);
              if (phone.equals(phoneNumber)){
              //如果返回的用户注册的手机号和用户输入的手机号相同,则代表通过验证
                  Log.e("TAG", "恭喜你验证成功");
        }
                  //进行服务器的注册操作

              }else{

              }


          }else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE){//获取验证码成功


          }else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES){//返回支持发送验证码的国家列表

          }

          } else {
              //否则验证失败,抛出一个异常,程序中断
              Log.e("TAG", "提交验证码验证失败");
              ((Throwable) data).printStackTrace();
          }

    };







    //需要在ondestroy方法中注销sdk,否侧会造成内存泄漏问题
    ,R.id.registerActivity_cancel,R.id.registerActivity_login})
    protected void onDestroy() {
        super.onDestroy();

        SMSSDK.unregisterEventHandler(eventHandler);
    }

    @Override
    public void initView() {

    }

    @Override
    @OnClick({R.id.registerActivity_edt1, R.id.registerActivity_edt2, R.id.registerActivity_tv,
    public void initList() {

    }


                pwd = registerActivityEdt3.getText().toString();
            R.id.registerActivity_btn_register,R.id.registerActivity_edt3

    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.registerActivity_edt1:

                break;
            case R.id.registerActivity_edt2:

                //点击获取验证码
                break;
            case R.id.registerActivity_tv:
                code = registerActivityEdt2.getText().toString();
                phoneNumber = registerActivityEdt1.getText().toString();
            case R.id.registerActivity_btn_register:
                //点击获取验证码
                CountDownTimerUtils countDownTimerUtils =
                        new CountDownTimerUtils(RegisterActivity.this, registerActivityTv, 10000, 1000);
                countDownTimerUtils.start();
                SMSSDK.getVerificationCode("86",phoneNumber);
               ToastUtil.showToastShort(RegisterActivity.this,"我被点击了");
                //请求短信验证码
                        ToastUtil.showToastShort(RegisterActivity.this,"请输入11位的手机号");
                break;
                //点击注册按钮,需要获取用户输入的信息
                phoneNumber = registerActivityEdt1.getText().toString();
                code = registerActivityEdt2.getText().toString();
                if (!TextUtils.isEmpty(phoneNumber)&&!TextUtils.isEmpty(code)&&!TextUtils.isEmpty(pwd)){
                pwd = registerActivityEdt3.getText().toString();

                    if (phoneNumber.length()!=11){
                          startActivity(intent);
                    }else {
                      if (code.length()!=4){
                          ToastUtil.showToastShort(RegisterActivity.this,"请输入4位验证码");
                      }else{
                          //将上面三个参数发送给服务器进行注册操作
                          intent.putExtra("phoneNumber", phoneNumber);
                          Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
                          intent.putExtra("pwd", pwd);
            case R.id.registerActivity_login:
                          //提交短信验证码
                       SMSSDK.submitVerificationCode("86",phoneNumber,code);
                    ToastUtil.showToastShort(RegisterActivity.this,"请输入完整的信息");
                      }

                    }

                }else{

                }

            case R.id.registerActivity_cancel:
                break;
            case R.id.registerActivity_edt3:

                break;
                Intent intent=new Intent(RegisterActivity.this,LoginActivity.class);
                finish();
                break;

                startActivity(intent);
                finish();
                break;
        }
    }
}

总结下上段代码,因为直接在自己的项目中摘出来的所以按钮显得多余。简述下流程,首先在oncreate中对MOBSDK进行初始化。之后添加SMSSDK.registerEventHandler回调。最重要的就是在EventHandler中的回调监听,重写afterEvent,通过result和event的状态来对数据进行回调监听。而R.id.registerActivity_tv为获取验证码几个字的点击事件,通过点击调用之前封装的CountDownTimerUtils工具类,进行倒计时操作,同时SMSSDK.getVerificationCode(“86”,”手机号”);进行获取验证码操作。在R.id.registerActivity_btn_register为注册,提交得到验证码,执行SMSSDK.submitVerificationCode(“86”,”电话号码”);进行验证码的提交验证,回调上文中的EventHandler进行相应的逻辑操作即可。

如果有其他问题,可以直接在mob官网是点击技术支持,问客服,mob的客服都很专业也耐心,我的好多问题都是在上面解决的,希望可以帮到大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值