Android用 Mob 实现发送短信验证码实例
注册账号
在 Mob 官网右上角点击注册,依次填入信息,其中公司一栏可以随便填
添加应用
登录后,点击 SecurityCodeSDK - 立即使用,Mob 会提示你添加应用,名字自己填,再选 Android,添加完后再点击 SecurityCodeSDk - 进入,之后应该可以看到如下界面
AppKey 和 AppSecret 一会会用到
下载 SDK
在网页上方“下载SDK”中点击“免费短信验证码SDK”,网页跳转后找到“短信验证码SDK”,根据需要选择系统吧,我做的 Android 就选 Android,网页跳转后根据需要选择 AndroidStudio 或者 eclipse,在屏幕右方选择,选好后点击即可开始下载。
下好后解压,打开文件夹,目录结构如下
要用到的 SDK 在 SMSSDK 文件夹中
导入 SDK 到工程目录
打开 SMSSDK 文件夹,把两个 .jar 和 .aar 文件复制到工程目录中 libs 文件夹下,如图所示
粘贴进去后,选中两个 .jar 文件,右键点击,选择 add as library
再打开 app 目录下的 build.gradle,添加如下两处内容
1
2
3
4
5
repositories{
flatDir{
dirs 'libs'
}
}
1
2
compile name:'SMSSDK-2.1.4',ext:'aar'
compile name:'SMSSDKGUI-2.1.4',ext:'aar'
最后看起来是这样的
添加的代码为 22-26 行和 36-37 行。
打开 AndroidManifest.xml,添加如下权限
1
2
3
4
5
6
7
8
9
10
<
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"
/>
最终,你的AndroidManifest.xml看起来应该像这样:
程序代码
先把完整代码贴出来(没贴 xml,这个不影响)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
public
class
Register
extends
AppCompatActivity
implements
View.OnClickListener {
private
EditText etPhoneNumber;
// 电话号码
private
Button sendVerificationCode;
// 发送验证码
private
EditText etVerificationCode;
// 验证码
private
Button nextStep;
// 下一步
private
String phoneNumber;
// 电话号码
private
String verificationCode;
// 验证码
private
boolean
flag;
// 操作是否成功
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
init();
// 初始化控件、注册点击事件
final
Context context = Register.
this
;
// context
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);
// 注册回调接口
}
private
void
init() {
etPhoneNumber = (EditText) findViewById(R.id.edit_phone_number);
sendVerificationCode = (Button) findViewById(R.id.btn_send_verification_code);
etVerificationCode = (EditText) findViewById(R.id.edit_verification_code);
nextStep = (Button) findViewById(R.id.btn_next_step);
sendVerificationCode.setOnClickListener(
this
);
nextStep.setOnClickListener(
this
);
}
@Override
public
void
onClick(View v) {
switch
(v.getId()) {
case
R.id.btn_send_verification_code:
if
(!TextUtils.isEmpty(etPhoneNumber.getText())) {
if
(etPhoneNumber.getText().length() ==
11
) {
phoneNumber = etPhoneNumber.getText().toString();
SMSSDK.getVerificationCode(
"86"
, phoneNumber);
// 发送验证码给号码的 phoneNumber 的手机
etVerificationCode.requestFocus();
}
else
{
Toast.makeText(
this
,
"请输入完整的电话号码"
, Toast.LENGTH_SHORT).show();
etPhoneNumber.requestFocus();
}
}
else
{
Toast.makeText(
this
,
"请输入电话号码"
, Toast.LENGTH_SHORT).show();
etPhoneNumber.requestFocus();
}
break
;
case
R.id.btn_next_step:
if
(!TextUtils.isEmpty(etVerificationCode.getText())) {
if
(etVerificationCode.getText().length() ==
4
) {
verificationCode = etVerificationCode.getText().toString();
SMSSDK.submitVerificationCode(
"86"
, phoneNumber, verificationCode);
flag =
false
;
}
else
{
Toast.makeText(
this
,
"请输入完整的验证码"
, Toast.LENGTH_SHORT).show();
etVerificationCode.requestFocus();
}
}
else
{
Toast.makeText(
this
,
"请输入验证码"
, Toast.LENGTH_SHORT).show();
etVerificationCode.requestFocus();
}
break
;
default
:
break
;
}
}
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) {
// 如果操作成功
if
(event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
// 校验验证码,返回校验的手机和国家代码
Toast.makeText(Register.
this
,
"验证成功"
, Toast.LENGTH_SHORT).show();
Intent intent =
new
Intent(Register.
this
, MainActivity.
class
);
startActivity(intent);
}
else
if
(event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
// 获取验证码成功,true为智能验证,false为普通下发短信
Toast.makeText(Register.
this
,
"验证码已发送"
, Toast.LENGTH_SHORT).show();
}
else
if
(event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {
// 返回支持发送验证码的国家列表
}
}
else
{
// 如果操作失败
if
(flag) {
Toast.makeText(Register.
this
,
"验证码获取失败,请重新获取"
, Toast.LENGTH_SHORT).show();
etPhoneNumber.requestFocus();
}
else
{
((Throwable) data).printStackTrace();
Toast.makeText(Register.
this
,
"验证码错误"
, Toast.LENGTH_SHORT).show();
}
}
}
};
@Override
protected
void
onDestroy() {
super
.onDestroy();
SMSSDK.unregisterAllEventHandler();
// 注销回调接口
}
}
注意要把你的 AppKey 和 AppSecret 替换进去。
其实看过很多教程你会发现,很多时候并不是代码看不懂,而是在配置文件的时候出了问题,因为一个刚接触 Android 没两天的人是不可能对很多第三方 SDK 有需求的,一开始都是以基础为主,所以需要配置第三方 SDK 的很多都是写过一些 Android 代码的人,他们所关心的其实就是该调用哪些方法来实现自己的目的,所以知道怎么调用就行了,再根据实际需求写几个 if-else 就可以了。
注意
1
2
3
4
5
6
7
8
9
10
11
12
SMSSDK.initSDK(context, AppKey, AppSecret);
// 初始化 SDK 单例,可以多次调用
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);
// 注册回调接口
这几行代码是调用这个 SDK 的基础,写在 onCreate 中。
发送短信验证码的语句是
1
SMSSDK.getVerificationCode(
"86"
, phoneNumber);
phoneNumber 的取值取决于用户输入的号码,“86”是中国的区号,根据需求也可以让用户自己选择,稍微修改一下就行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if
(result == SMSSDK.RESULT_COMPLETE) {
// 如果操作成功
if
(event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
// 校验验证码,返回校验的手机和国家代码
Toast.makeText(Register.
this
,
"验证成功"
, Toast.LENGTH_SHORT).show();
Intent intent =
new
Intent(Register.
this
, MainActivity.
class
);
startActivity(intent);
}
else
if
(event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
// 获取验证码成功,true为智能验证,false为普通下发短信
Toast.makeText(Register.
this
,
"验证码已发送"
, Toast.LENGTH_SHORT).show();
}
else
if
(event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {
// 返回支持发送验证码的国家列表
}
}
else
{
// 如果操作失败
if
(flag) {
Toast.makeText(Register.
this
,
"验证码获取失败,请重新获取"
, Toast.LENGTH_SHORT).show();
etPhoneNumber.requestFocus();
}
else
{
((Throwable) data).printStackTrace();
Toast.makeText(Register.
this
,
"验证码错误"
, Toast.LENGTH_SHORT).show();
}
}
这几行代码判断验证码发没发送以及正不正确,根据 event 来确定是哪一种情况,如果想深入了解,可以参考官方文档
当然,免费服务肯定收费的要差点,体现在短信发的比收费的慢,大概要十秒才能收到,收费的三秒就收到了,由于只是个比赛,自己做着玩,用免费的足矣。
另外,最开始免费的时候每天只能发 20 条短信,而且一个手机号每 12 小时只能收到 5 条,所以,省着点用,当然你可以在应用管理界面申请上线登记(见第一张图),审核通过后就完全免费了。
Android用 Mob 实现发送短信验证码实例
注册账号
在 Mob 官网右上角点击注册,依次填入信息,其中公司一栏可以随便填
添加应用
登录后,点击 SecurityCodeSDK - 立即使用,Mob 会提示你添加应用,名字自己填,再选 Android,添加完后再点击 SecurityCodeSDk - 进入,之后应该可以看到如下界面
AppKey 和 AppSecret 一会会用到
下载 SDK
在网页上方“下载SDK”中点击“免费短信验证码SDK”,网页跳转后找到“短信验证码SDK”,根据需要选择系统吧,我做的 Android 就选 Android,网页跳转后根据需要选择 AndroidStudio 或者 eclipse,在屏幕右方选择,选好后点击即可开始下载。
下好后解压,打开文件夹,目录结构如下
要用到的 SDK 在 SMSSDK 文件夹中
导入 SDK 到工程目录
打开 SMSSDK 文件夹,把两个 .jar 和 .aar 文件复制到工程目录中 libs 文件夹下,如图所示
粘贴进去后,选中两个 .jar 文件,右键点击,选择 add as library
再打开 app 目录下的 build.gradle,添加如下两处内容
1
2
3
4
5
|
repositories{
flatDir{
dirs 'libs'
}
}
|
1
2
|
compile name:'SMSSDK-2.1.4',ext:'aar'
compile name:'SMSSDKGUI-2.1.4',ext:'aar'
|
最后看起来是这样的
添加的代码为 22-26 行和 36-37 行。
打开 AndroidManifest.xml,添加如下权限
1
2
3
4
5
6
7
8
9
10
|
< 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" />
|
程序代码
先把完整代码贴出来(没贴 xml,这个不影响)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
public class Register extends AppCompatActivity implements View.OnClickListener {
private EditText etPhoneNumber; // 电话号码
private Button sendVerificationCode; // 发送验证码
private EditText etVerificationCode; // 验证码
private Button nextStep; // 下一步
private String phoneNumber; // 电话号码
private String verificationCode; // 验证码
private boolean flag; // 操作是否成功
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
init(); // 初始化控件、注册点击事件
final Context context = Register. this ; // context
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); // 注册回调接口
}
private void init() {
etPhoneNumber = (EditText) findViewById(R.id.edit_phone_number);
sendVerificationCode = (Button) findViewById(R.id.btn_send_verification_code);
etVerificationCode = (EditText) findViewById(R.id.edit_verification_code);
nextStep = (Button) findViewById(R.id.btn_next_step);
sendVerificationCode.setOnClickListener( this );
nextStep.setOnClickListener( this );
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send_verification_code:
if (!TextUtils.isEmpty(etPhoneNumber.getText())) {
if (etPhoneNumber.getText().length() == 11 ) {
phoneNumber = etPhoneNumber.getText().toString();
SMSSDK.getVerificationCode( "86" , phoneNumber); // 发送验证码给号码的 phoneNumber 的手机
etVerificationCode.requestFocus();
}
else {
Toast.makeText( this , "请输入完整的电话号码" , Toast.LENGTH_SHORT).show();
etPhoneNumber.requestFocus();
}
} else {
Toast.makeText( this , "请输入电话号码" , Toast.LENGTH_SHORT).show();
etPhoneNumber.requestFocus();
}
break ;
case R.id.btn_next_step:
if (!TextUtils.isEmpty(etVerificationCode.getText())) {
if (etVerificationCode.getText().length() == 4 ) {
verificationCode = etVerificationCode.getText().toString();
SMSSDK.submitVerificationCode( "86" , phoneNumber, verificationCode);
flag = false ;
} else {
Toast.makeText( this , "请输入完整的验证码" , Toast.LENGTH_SHORT).show();
etVerificationCode.requestFocus();
}
} else {
Toast.makeText( this , "请输入验证码" , Toast.LENGTH_SHORT).show();
etVerificationCode.requestFocus();
}
break ;
default :
break ;
}
}
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) {
// 如果操作成功
if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
// 校验验证码,返回校验的手机和国家代码
Toast.makeText(Register. this , "验证成功" , Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Register. this , MainActivity. class );
startActivity(intent);
} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
// 获取验证码成功,true为智能验证,false为普通下发短信
Toast.makeText(Register. this , "验证码已发送" , Toast.LENGTH_SHORT).show();
} else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {
// 返回支持发送验证码的国家列表
}
} else {
// 如果操作失败
if (flag) {
Toast.makeText(Register. this , "验证码获取失败,请重新获取" , Toast.LENGTH_SHORT).show();
etPhoneNumber.requestFocus();
} else {
((Throwable) data).printStackTrace();
Toast.makeText(Register. this , "验证码错误" , Toast.LENGTH_SHORT).show();
}
}
}
};
@Override
protected void onDestroy() {
super .onDestroy();
SMSSDK.unregisterAllEventHandler(); // 注销回调接口
}
}
|
注意要把你的 AppKey 和 AppSecret 替换进去。
其实看过很多教程你会发现,很多时候并不是代码看不懂,而是在配置文件的时候出了问题,因为一个刚接触 Android 没两天的人是不可能对很多第三方 SDK 有需求的,一开始都是以基础为主,所以需要配置第三方 SDK 的很多都是写过一些 Android 代码的人,他们所关心的其实就是该调用哪些方法来实现自己的目的,所以知道怎么调用就行了,再根据实际需求写几个 if-else 就可以了。
注意
1
2
3
4
5
6
7
8
9
10
11
12
|
SMSSDK.initSDK(context, AppKey, AppSecret); // 初始化 SDK 单例,可以多次调用
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); // 注册回调接口
|
这几行代码是调用这个 SDK 的基础,写在 onCreate 中。
发送短信验证码的语句是
1
|
SMSSDK.getVerificationCode( "86" , phoneNumber);
|
phoneNumber 的取值取决于用户输入的号码,“86”是中国的区号,根据需求也可以让用户自己选择,稍微修改一下就行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
if (result == SMSSDK.RESULT_COMPLETE) {
// 如果操作成功
if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
// 校验验证码,返回校验的手机和国家代码
Toast.makeText(Register. this , "验证成功" , Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Register. this , MainActivity. class );
startActivity(intent);
} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
// 获取验证码成功,true为智能验证,false为普通下发短信
Toast.makeText(Register. this , "验证码已发送" , Toast.LENGTH_SHORT).show();
} else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {
// 返回支持发送验证码的国家列表
}
} else {
// 如果操作失败
if (flag) {
Toast.makeText(Register. this , "验证码获取失败,请重新获取" , Toast.LENGTH_SHORT).show();
etPhoneNumber.requestFocus();
} else {
((Throwable) data).printStackTrace();
Toast.makeText(Register. this , "验证码错误" , Toast.LENGTH_SHORT).show();
}
}
|
这几行代码判断验证码发没发送以及正不正确,根据 event 来确定是哪一种情况,如果想深入了解,可以参考官方文档
当然,免费服务肯定收费的要差点,体现在短信发的比收费的慢,大概要十秒才能收到,收费的三秒就收到了,由于只是个比赛,自己做着玩,用免费的足矣。
另外,最开始免费的时候每天只能发 20 条短信,而且一个手机号每 12 小时只能收到 5 条,所以,省着点用,当然你可以在应用管理界面申请上线登记(见第一张图),审核通过后就完全免费了。