刚才集成了一下Mob的短信登录验证功能直接集成的3.0.0版本,发现官方的集成文档写的超级烂。所以写这篇博客让大家少走弯路。
1.首先先把环境配置好,这里拿as的环境配置为例。
Android Studio
AS版本的SMSSDK目录下包含以下内容:
smssdk_as目录结构
MobCommons.jar:Mob 通用公共库(必须)
MobTools.jar:Mob 工具公共库(必须)
SMSSDK-3.0.0.aar:SMSSDK 核心(必须)
SMSSDKGUI-3.0.0.aar:SMSSDK GUI 开源库(非必须)
HowToUse.txt:使用说明
注意:如果你同时使用ShareSDK,保留一份公共库就行(公共库版本一致或兼容)。
2.1、将以上文件按需放入Android Studio项目所要使用SMSSDK的Module所在的Libs里面:
smssdk_导入as项目
2.2、在Module的build.gradle里面将libs加入仓库(repositories):
repositories{
flatDir{
dirs 'libs' //就是你放aar的目录地址
}
}
2.3、在Module的build.gradle里面添加依赖(dependencies ):
dependencies {
....//你的其他依赖,注意这里官方文档是错的。
compile files('libs/MobCommons-2017.0607.1736.jar')
compile files('libs/MobTools-2017.0607.1736.jar')
compile name: 'SMSSDK-3.0.0', ext: 'aar'
compile name: 'SMSSDKGUI-3.0.0', ext: 'aar'
}
最终,你的build.gradle看起来应该像这样:
smssdk_as build文件
三、添加代码
1.配置AndroidManifest.xml
1.1、添加以下权限:
<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" />
1.2、添加以下Activity:
<activity
android:name="com.mob.tools.MobUIShell"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="stateHidden|adjustResize"/>
1.3、在Application节点下添加以下属性:
android:name="com.mob.MobApplication"
1.4、在Application节点下添加以下meta-data:
<!-- 通过AndroidManifest配置AppKey和AppSecret,如果你选择通过代码配置,则不需要配置以下meta-data -->
<meta-data android:name="Mob-AppKey" android:value="你的AppKey"/>
<meta-data android:name="Mob-AppSecret" android:value="你的AppSecret"/>
最终,你的AndroidManifest.xml看起来应该像这样:
2.现在我们步入正文
这时候就不要看任何官方文档了全是坑。这里有两种登录验证方式第一种是我们自己绘制UI界面进行短信登录验证,第二种是用官方自带的UI界面进行短信验证登录。第一种比较常用我们先说第一种。
首先我们这时候现在布局中搭好UI界面。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="wswy.mymob.MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送短信验证码"
android:onClick="play"
/>
<EditText
android:id="@+id/yanzhengma"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入手机验证码"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="tijiao"
android:text="提交"
/>
</LinearLayout>
然后做好初始化工作,这个应该不能不会吧。然后我们在发送短信验证码的按钮监听里写入发送短信验证码的方法。
public void play(View view) {
//获取验证码
SMSSDK.getVerificationCode("86","188****8888");
}
然后我们在提交按钮的监听里先通过EditText获取到用户所输入的验证码,然后和刚才用的那个手机号一起提交到后台验证。
public void tijiao(View view) {
String number = yanzhengma.getText().toString();
SMSSDK.submitVerificationCode("86","188****8888",number);
}
这里手机号前面的86是代表中国大陆的手机号,如果不涉及到国外就写死。
最后我们在onCreate的方法里对SDK进行初始化
MobSDK.init(this, "1f35afb98e***","0fe8807a4bed3f15d4dd00e4e8e1****");
//这里是我的App key 和App secret,一定要换成你自己的不然一定会报错。
这句代码一定要写在第一行。
然后在onCreate里写下面代码。
handler = new EventHandler(){
@Override
public void afterEvent(int event, int result, Object data) {
if (result == SMSSDK.RESULT_COMPLETE){
//回调完成
if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
//提交验证码成功
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"验证成功",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
}
});
}else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE){
//获取验证码成功
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"验证码已发送",Toast.LENGTH_SHORT).show();
}
});
}else if (event ==SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES){
}
}else{
((Throwable)data).printStackTrace();
Throwable throwable = (Throwable) data;
try {
JSONObject obj = new JSONObject(throwable.getMessage());
final String des = obj.optString("detail");
if (!TextUtils.isEmpty(des)){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"提交错误信息",Toast.LENGTH_SHORT).show();
}
});
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
SMSSDK.registerEventHandler(handler);
不要问我handler为什么报红,那是因为你没初始化。把他初始化成全局变量。在我写intent跳转页面的地方写跳转,因为代码运行到那个地方的时候就代表验证成功了。它下面的那个else if里判断的是验证码是否发送成功,再下面是处理国家地区用的就是前面提到的那个“86”,最后的else方法区是处理错误信息用的。还有因为你提交了handler对象所以不用的时候一定要记得销毁,不然一定会内存泄漏。就是你上面最后一行代码。
销毁要这么处理。
}
protected void onDestroy() {
super.onDestroy();
SMSSDK.unregisterEventHandler(handler);
}
能看懂吧。这是activity的生命周期的最后一个。连这都不认识的话,就不用看了。看你也看不懂。