前言
很多时候我们都会用到短信验证登陆注册等一些列功能,于是最近花时间研究了一下,因为很多都是需要收取一定费用,所以我选择了Mob开发平台,网上也有很多相关教程,我选择了最新的 SMS For Android Eclipse v3.1.1 在线gradle集成方式,并将自己的心得与方法分享给大家。
准备
我们需要在Mob开发者平台 http://www.mob.com/ 上注册一个账号,并且创建应用获取到该应用的App信息,如下图所示:
然后根据官方文档将相关代码添加到你的build.gradle文件下
这儿给大家补充一下,第一步中的gradle是你整个工程的gradle,第二个是App文件夹里面的gradle,如图:
添加完成之后编译就可以用了。
开始
下面就是相关代码的实现,由于官方文档给的太过简单,所以我做了一些修改。
先看布局文件:两个EditText两个Button,大家可以根据自己需要修改,就不多说了
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp">
<TextView
android:paddingLeft="10dp"
android:id="@+id/country_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/country_text"
android:textSize="24sp" />
<EditText
android:id="@+id/phone_ed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="phone"
android:padding="10dp" />
<Button
android:id="@+id/button_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/send_btn" />
<EditText
android:id="@+id/code_ed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp" />
<Button
android:id="@+id/btn_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/check_btn" />
</LinearLayout>
</LinearLayout>
效果:
初始化控件,不多说
private void initView() {
btn_send = findViewById(R.id.button_send);
ed_phone = findViewById(R.id.phone_ed);
text_country = findViewById(R.id.country_text);
code_ed = findViewById(R.id.code_ed);
btn_check = findViewById(R.id.btn_check);
//
btn_send.setOnClickListener(this);
btn_check.setOnClickListener(this);
}
然后我们看OnCick方法中,首先我写了一个方法,用来发送验证码,后面是一个Thread,用来进行计时,后面是检验验证码是否正确的button监听
@Override
public void onClick(View view) {
//发送验证码
if (view == btn_send) {
//检验手机号是否填写
if (TextUtils.isEmpty(ed_phone.getText().toString())) {
Toast.makeText(this, "手机号码不能为空",
Toast.LENGTH_SHORT).show();
return;
}
//发送验证码
sendCode(text_country.getText().toString()
, ed_phone.getText().toString());
btn_send.setClickable(false);
//启用Thread用来倒计时
new Thread(new Runnable() {
@Override
public void run() {
for (; countdown > 0; countdown--) {
handler.sendEmptyMessage(-1); //发送消息
if (countdown <= 0) {
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//倒计时结束执行
handler.sendEmptyMessage(-2);
}
}).start();
}
//检验验证码是否发送成功
if (view == btn_check) {
if(TextUtils.isEmpty(ed_phone.getText().toString())){
Toast.makeText(this, "手机号码不能为空",
Toast.LENGTH_SHORT).show();
return;
}
if(TextUtils.isEmpty(code_ed.getText().toString())){
Toast.makeText(this, "验证码不能为空",
Toast.LENGTH_SHORT).show();
return;
}
//检验是否发送成功
SMSSDK.submitVerificationCode("86", ed_phone.getText().toString(), code_ed.getText().toString());
}
}
接下来是sendCode方法,用来发送验证码
/**
* 发送验证码
* country: 国家"+86"
* phone: 手机号
*/
public void sendCode(String country, String phone) {
//registerEventHandler是用来往SMSSDK中注册一个事件接收器。
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);
//绑定国家country,与手机号phone
SMSSDK.getVerificationCode(country, phone);
}
之创建一个Handler,用来更新UI和完成验证的一些操作
/**
* 由于EventHandler开启了线程不能直接在afterEvent中更新UI
* 所以还需要在MainActivity当中定义一个Handler
* 来接受EventHandler发送过来的消息
*/
@SuppressLint("HandlerLeak")
Handler handler = new Handler() {
//主线程中更新UI
@Override
public void handleMessage(Message msg) {
if (msg.what == -1) {
//更新倒计时
btn_send.setText(countdown + "s后重发");
} else if (msg.what == -2) {
//修改控件文本,进行重新发送验证码
btn_send.setText("重新发送");
btn_send.setClickable(true);
countdown = 60;
} else {
int event = msg.arg1;
int result = msg.arg2;
Object data = msg.obj;
// 验证成功,后可在此调用后续方法
if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
Toast.makeText(getApplicationContext(), "验证成功",
Toast.LENGTH_SHORT).show();
}
//验证码发送成功
else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
Toast.makeText(getApplicationContext(), "验证码已经发送",
Toast.LENGTH_SHORT).show();
}
//验证码发送出错
else 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(MainActivity.this, des, Toast.LENGTH_SHORT).show();
return;
}
} catch (Exception e) {
//do something
}
}
}
}
};
最后别忘了需要onDestroy中销毁
protected void onDestroy() {
super.onDestroy();
//用完回调要注销掉,否则可能会出现内存泄露
SMSSDK.unregisterAllEventHandler();
}
好了,章到这儿就结束了,总体来说, v3.1.1版本的集成方式相比SDK离线集成省去了很多时间,官方也提供了说明文档,希望大家都能弄好,共同进步。