一:概述
之前在公司用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的客服都很专业也耐心,我的好多问题都是在上面解决的,希望可以帮到大家。