短信验证码可以说是现在app中必备的功能,当然开发过程也很简单,各种各样的短信平台服务也很多,这里我用的是Mob平台的短信验证码服务。http://www.mob.com,注册登录,点击右上角头像,进入后台,选择SecurityCodeSdk,创建应用,获取到App Secre和App Key,下载SMSSDK,我这里使用的是2.0版本,准备工作就做好了。
http://wiki.mob.com/sms-android-%e6%97%a0gui%e6%8e%a5%e5%8f%a3%e8%b0%83%e7%94%a8/,开发文档地址。按照开发文档导入lib目录,添加相应权限。界面如图所示。
首先在onCreat()方法中进行初始化SDK,与注册接口回调。
SMSSDK.initSDK(getApplicationContext(), APP_KEY, APP_SECRET);//初始化SDK,单例,可以多次调用;任何方法调用前,必须先初始化
SMSSDK.registerEventHandler(eventHandler);//注册短信回调
其中所有的操作都是通过回调来进行的,通过EventHandler来进行处理。注意,在这里一旦我们注册了短信回调,在相应的地方就要进行解注册,否则容易造成内存泄露。
//SDK操作回调
EventHandler 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) {
//提交验证码成功
mHandler.sendEmptyMessage(VERIFICATION_SUCCESS);
} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
//获取验证码成功
} else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {
//返回支持发送验证码的国家列表
}
} else {
((Throwable) data).printStackTrace();
Message message = mHandler.obtainMessage();
message.what = VERIFICATION_FAILE;
message.obj = data;
mHandler.sendMessage(message);
}
}
};
用户可以通过getSupportedCountries()获取当前支持的国家列表,通过getVerificationCode(String country,String phone)申请短信验证码,通过
submitVerificationCode(String country,String phone,String code)来提交验证码。这些操作的结果都将在EventHandler中获得,但是因为这并不是在UI线程中,要进行UI操作需要使用Handler来发送消息。这里顺便叨叨Handler的使用。Handler操作不当可能导致内存泄露(虽然没有遇到过),但是防患于未然。Java当中,非静态的内部类和匿名内部类都会隐式的持有一个外部对象。非静态的handler可能会持有一个外部Activity对象,当handler在进行一些延时操作时,这时候会阻碍Activity的回收。也就是说,当使用内部类的时候,如果是非静态的,当其实例的生命周期大于其持有的外部对象的生命周期时,从而导致影响到外部对象的回收,就会发生内存泄露。这里主要推荐两种做法,使用静态类和弱引用。静态内部类不会持有外部对象,弱引用不会阻碍gc对其持有外部对象的回收。如下代码所示。
//弱引用handler,防止内存泄露
static class MyHandler extends Handler {
private WeakReference<Sms_verification> weakReference;
MyHandler(Sms_verification sms_verification) {
this.weakReference = new WeakReference<>(sms_verification);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Sms_verification sms_verification = weakReference.get();
switch (msg.what) {
case VERIFICATION_SUCCESS:
Toast.makeText(sms_verification, "验证成功", Toast.LENGTH_SHORT).show();
break;
case VERIFICATION_FAILE:
sms_verification.getErrorMsg(msg);
break;
}
}
}
最后还有一个简单的计时器来倒数60s,重新获取验证码,很简单直接上代码。
//计时器
private void starttime() {
canClick = false;
Runnable runnable = new Runnable() {
@Override
public void run() {
get_verificationcode.setText(UPDATE-- + "s后重新获取");
get_verificationcode.setTextColor(getResources().getColor(R.color.black));
if (UPDATE == 0) {
get_verificationcode.setClickable(true);
get_verificationcode.setText("获取验证码");
get_verificationcode.setTextColor(getResources().getColor(R.color.red));
UPDATE = 60;
canClick = true;
} else {
mHandler.postDelayed(this, TIME);
}
}
};
mHandler.post(runnable);
}
大致就是这样了,这里面的country代码,这个版本中国是“+86”,曾经某个版本是“86”,大家做的时候可以查询一下。
最后附上项目地址:https://github.com/lulululbj/DailyAndroid,利用业余时间总结一些项目中用到的知识,不断更新中。
有任何疑问,欢迎加群讨论:261386924