一.前言
现在的app基本上都需要用到短信功能,注册时或者有消息通知时需要给用户发送一条短信,但是对于个人开发者来说,去买第三方的短信服务实在是有点奢侈,很好的是mob为我们提供了免费的短信验证码服务功能,我不是打广告,的确觉得这项服务很不错。那么下面就简单讲一下如何在自己的工程里集成mob的短信功能,其实整个流程并不复杂,只是个人觉得mob的官方文档有点小乱,官方Demo也有点小复杂,同时有一些细节地方容易被忽视,也会导致一些问题。
PS:太喜欢mob的logo了。
二.实现过程
本篇只涉及Android,如果是IOS系统,还望自己斟酌,希望本篇文章也能给您提供帮助,同时IDE是Android Studio。
1.key申请
申请地址:http://www.mob.com,在产品中心选择短信验证码SDK,然后完成相应的注册和申请工作;
进入自己的后台中心,就可以看见自己的App Key和App Secret:
整体趋势栏给我们展示了一些短信服务使用情况。未上线登记时,我们可以免费使用20条/天,如果需求量比较大,我们可以在自己的工程里集成了mob短信,然后上线登记,应该可以获得更多的免费短信条数,暂未尝试。
2.下载SDK
在SDK下载栏目选择SMS for Android,然后选择相应IDE对应的SDK即可(本篇IDE是as)
下载后大概是这样:
3.集成过程
申请到了key和secret后就是集成到自己的工程中了。mob主要提供两种接口方式:1)使用官方自带的UI;2)使用无GUI接口。
3.1.配置SDK
这已经是使用第三方接口的老规矩了。官网文档我就不贴了,着实看着不舒服,在这里只贴自己的。
首先是在工程的libs下添加jar包和.aar文件。
然后在build.gradle中添加依赖项
在AndroidManifest中添加相应权限和注册相应的activity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<
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.GET_TASKS"
/>
<
uses-permission
android:name
=
"android.permission.ACCESS_FINE_LOCATION"
/>
<
activity
android:name
=
"com.mob.tools.MobUIShell"
android:configChanges
=
"keyboardHidden|orientation|screenSize"
android:theme
=
"@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode
=
"stateHidden|adjustResize"
>
activity
>
|
3.2.调用接口发送短信
前面提到了,mob短息提供有GUI和无GUI的两种方式,无论哪种方式,都需要对SMSSDK先初始化,再调用接口。
初始化:SMSSDK.initSDK(LoginActivity.this, “App Key”, “App Secret”);
1)有GUI,即使用mob提供的界面
方法如下:
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
|
registerText.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
//首先初始化SMSSDK
SMSSDK.initSDK(LoginActivity.
this
,
"App Key"
,
"App Secret"
);
RegisterPage registerPage =
new
RegisterPage();
//回调函数
registerPage.setRegisterCallback(
new
EventHandler()
{
public
void
afterEvent(
int
event,
int
result, Object data)
{
// 解析结果
if
(result == SMSSDK.RESULT_COMPLETE)
{
//提交验证码成功
if
(event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE)
{
}
//提交验证码成功,此时已经验证成功了
else
if
(event == SMSSDK.EVENT_GET_VERIFICATION_CODE)
{
}
}
}
});
registerPage.show(LoginActivity.
this
);
}
});
|
2)无GUI
这种情况一般是使用自己的activity界面,然后集成短信功能,比如一个简单的注册。
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|
//我只提供一些关键代码,其他部分就不提供了,太多,看起来太杂
public
class
ActivityMessageRegister
extends
Activity
{
private
static
final
int
CODE_ING =
1
;
//已发送,倒计时
private
static
final
int
CODE_REPEAT =
2
;
//重新发送
private
static
final
int
SMSDDK_HANDLER =
3
;
//短信回调
private
int
TIME =
60
;
//倒计时60s
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_message_register);
initView();
//界面初始化
initSDK();
//短信初始化
}
//初始化界面
void
initView()
{
userPhoneText = (EditText)findViewById(R.id.user_phone_input);
userPasswordText = (EditText)findViewById(R.id.user_password_input);
userNameText = (EditText)findViewById(R.id.user_name_input);
registerButton = (Button)findViewById(R.id.register_button);
registerButton.setOnClickListener(
new
OnClickListener());
loginView = (TextView)findViewById(R.id.login_view);
getCodeButton = (Button)findViewById(R.id.get_code_button);
getCodeButton.setOnClickListener(
new
OnClickListener());
codeText = (EditText)findViewById(R.id.code_view);
//
...
//
}
//初始化SMSSDK
private
void
initSDK()
{
SMSSDK.initSDK(
this
,
"App Key"
,
"App Secret"
);
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;
msg.what = SMSDDK_HANDLER;
handler.sendMessage(msg);
}
};
// 注册回调监听接口
SMSSDK.registerEventHandler(eventHandler);
}
//监听函数
private
class
OnClickListener
implements
View.OnClickListener
{
@Override
public
void
onClick(View v) {
userPhone = userPhoneText.getText().toString();
switch
(v.getId()) {
case
R.id.get_code_button:
//获取验证码
new
AlertDialog.Builder(ActivityMessageRegister.
this
)
.setTitle(
"发送短信"
)
.setMessage(
"我们将把验证码发送到以下号码:\n"
+
"+86:"
+userPhone)
.setPositiveButton(
"确定"
,
new
DialogInterface.OnClickListener()
{
@Override
public
void
onClick(DialogInterface dialog,
int
which)
{
SMSSDK.getVerificationCode(
"86"
, userPhone);
getCodeButton.setClickable(
false
);
new
Thread(
new
Runnable()
{
@Override
public
void
run()
{
for
(
int
i =
60
; i >
0
; i--)
{
handler.sendEmptyMessage(CODE_ING);
if
(i <=
0
)
{
break
;
}
try
{
Thread.sleep(
1000
);
}
catch
(InterruptedException e)
{
e.printStackTrace();
}
}
handler.sendEmptyMessage(CODE_REPEAT);
}
}).start();
}
})
.create()
.show();
break
;
case
R.id.register_button:
//注册
SMSSDK.submitVerificationCode(
"86"
, userPhone, codeText.getText().toString());
//对验证码进行验证->回调函数
break
;
default
:
break
;
}
}
}
Handler handler =
new
Handler()
{
public
void
handleMessage(Message msg)
{
switch
(msg.what)
{
case
CODE_ING:
//已发送,倒计时
getCodeButton.setText(
"重新发送("
+--TIME+
"s)"
);
break
;
case
CODE_REPEAT:
//重新发送
getCodeButton.setText(
"获取验证码"
);
getCodeButton.setClickable(
true
);
break
;
case
SMSDDK_HANDLER:
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(ActivityMessageRegister.
this
,
"验证成功"
, Toast.LENGTH_LONG).show();
if
(check())
//其他合法性的检测
{
UserModel user =
new
UserModel();
user.setUserId(MyUUID.getUUID());
//id
user.setUserPhone(userPhone);
user.setUserPassword(MD5.md5(userPassword));
//md5加密
user.setUserGender(gender);
//性别
user.setUserName(userName);
user.setUserBirthday(
"19920401"
);
//暂时为空
//user.setUserIdCard(userIdCard);
//user.setUserImage(""); //暂时为空
//注册->服务器
UserController.userRegister(user, handler);
}
}
//已发送验证码
else
if
(event == SMSSDK.EVENT_GET_VERIFICATION_CODE)
{
Toast.makeText(getApplicationContext(),
"验证码已经发送"
,
Toast.LENGTH_SHORT).show();
}
else
{
((Throwable) data).printStackTrace();
}
}
if
(result==SMSSDK.RESULT_ERROR)
{
try
{
Throwable throwable = (Throwable) data;
throwable.printStackTrace();
JSONObject object =
new
JSONObject(throwable.getMessage());
String des = object.optString(
"detail"
);
//错误描述
int
status = object.optInt(
"status"
);
//错误代码
if
(status >
0
&& !TextUtils.isEmpty(des)) {
Toast.makeText(getApplicationContext(), des, Toast.LENGTH_SHORT).show();
return
;
}
}
catch
(Exception e) {
//do something
}
}
break
;
case
R.id.register_status:
String result_code = msg.getData().getString(
"result"
).toString();
if
(
"1"
.equals(result_code))
{
Toast.makeText(ActivityMessageRegister.
this
,
"注册成功"
, Toast.LENGTH_LONG).show();
Intent intent =
new
Intent(ActivityMessageRegister.
this
,LoginActivity.
class
);
intent.putExtra(
"userPhone"
, userPhone);
ActivityMessageRegister.
this
.setResult(RESULE_CODE, intent);
//startActivity(intent);
finish();
}
else
{
Toast.makeText(ActivityMessageRegister.
this
,
"注册失败"
, Toast.LENGTH_LONG).show();
}
break
;
case
R.id.check_phone_exist:
//手机号是否已存在
String result_code_2 = msg.getData().getString(
"result"
).toString();
if
(
"1"
.equals(result_code_2))
{
errPhoneText.setText(
"手机号码已经注册,请换用其他号码"
);
resultMap.put(
"phone"
,
false
);
}
else
{
errPhoneText.setText(
""
);
resultMap.put(
"phone"
,
true
);
}
break
;
}
}
};
}
|
OK,基本就大功告成。
三.问题
集成中可能会出现几个问题:
1.无法接收短信验证码
mob默认是开启了智能验证的,也意味着如果一个号码通过了一次验证码验证,那之后再次进行短信验证时,就会智能验证通过,而此时是不会接收到验证码的,因为mob不会下发验证码。这就对我们的测试造成了一定的影响,有时候,我们始终无法接收到验证码,原因就在这里。进入后台,将智能验证功能关闭就可以了。后台中心->短信设置->智能验证
这里写图片描述
2.短信验证成功后,并未执行相应的代码,而是返回到了某一个界面
还是有可能是因为智能验证的原因。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
eventHandler =
new
EventHandler() {
@Override
public
void
afterEvent(
int
event,
int
result, Object data)
{
if
(result == SMSSDK.RESULT_COMPLETE)
{
if
(event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE)
{
//官方文档中说了,如果是智能验证只需要在这里对data进行判断就可以了
if
((Boolean)data)
//是智能验证
{
//如果增加了这条if语句,那么就算关闭了智能验证,此时的data强制转换成了Boolean也是为true的,所以并不会执行后面的相应代码,所以,如果在集成的时候不需要智能验证,最好的方式就是不去管这个功能。
}
else
{
//非智能
}
}
}
}
|
所以,最妥的方式,就是彻底舍弃掉智能验证功能。
以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。
如对本文有疑问,请提交到交流社区,广大热心网友会为你解答!! 点击进入社区