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文件。在AndroidManifest中添加相应权限和注册相应的activity
<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" />
<activity
android:name="com.mob.tools.MobUIShell"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="stateHidden|adjustResize"/>
4.
启动SDK
在您的项目启动时,调用下面的代码:
SMSSDK.initSDK(this, "您的appkey", "您的appsecret");//在Applicaton中初始化 或者
SMSSDK.initSDK(LoginActivity.
this
,
"App Key"
,
"App Secret"
);//调用时在Activity中初始化
4.1短信SDK内置了开源的GUI功能,您可以通过调用下面的代码打开短信验证页面:
//打开注册页面
RegisterPage registerPage = new RegisterPage();
registerPage.setRegisterCallback(new EventHandler() {
public void afterEvent(int event, int result, Object data) {
// 解析注册结果
if (result == SMSSDK.RESULT_COMPLETE) {
@SuppressWarnings("unchecked")
HashMap<String,Object> phoneMap = (HashMap<String, Object>) data;
String country = (String) phoneMap.get("country");
String phone = (String) phoneMap.get("phone");
// 提交用户信息(此方法可以不调用)
registerUser(country, phone);
}
}
});
registerPage.show(context);
4.2一般是使用自己的activity界面,然后集成短信功能,比如一个简单的注册
//我只提供一些关键代码,其他部分就不提供了,太多,看起来太杂
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
;
}
}
};
}
集成中可能会出现问题:
.无法接收短信验证码
mob默认是开启了智能验证的,也意味着如果一个号码通过了一次验证码验证,那之后再次进行短信验证时,就会智能验证通过,而此时是不会接收到验证码的,因为mob不会下发验证码。这就对我们的测试造成了一定的影响,有时候,我们始终无法接收到验证码,原因就在这里。进入后台,将智能验证功能关闭就可以了。后台中心->短信设置->智能验证。