『实践』Android之短信验证码(用的Mob短信验证)

1、参考资料

Mob网站:http://www.mob.com/

Mob在Github上的例子:https://github.com/MobClub/SMSSDK-for-Android

教程:http://www.cnblogs.com/lizhanqi/p/5720962.html            

教程的源代码:  http://git.oschina.net/lizhanqi/MobSMSDemo

 

Dialog教程:http://blog.csdn.net/liang5630/article/details/44098899

定时器教程:http://www.cnblogs.com/wansho/p/5104335.html

 

2、前期准备

(1)Mob网站上下载SMS对应的SDK,解压出来为图1,打开图1,将其中的文件拷贝到as项目中的libs文件夹下,另外在add as library

图1

图2

(2)在as项目中的AndroidManifest.xml文件中添加图3所需权限,由于SMS权限为危险权限,所以还要动态申请,这在下面代码中会有体现。注意权限是写在application外面,不是里面。

图3

(3)如果图4中的targetSdkVersion大于22,那么在代码中必须动态申请权限。

图4

(4)在as项目中的图7中的build.gradle文件中添加图5和图6红色框中内容。

图5

图6

图7

 

(5)在Mob网站上申请App Key和App Secret。

图8

 (6)Toast

 

3、代码(没整理,将就看)

 此代码是不使用Mob自带的GUI的接口调用

简单的讲一下:

  • 启动SKD:SMSSDK.initSDK(this, "您的appkey", "您的appsecret");
  • 注册回调接口:registerEventHandler(EventHandler handler);
  • 注销回调接口:unregisterEventHandler(EventHandler handler);注册回调接口和注销回调接口必须配套使用,否则可能内存泄漏。
  • EventHandler是操作回调,其中的afterEvent在操作结束时被触发。
  • afterEvent(int event, int result, Object data):参数event表示操作的类型,data是事件操作结果,其具体取值根据参数result而定。result是操作结果,为SMSSDK.RESULT_COMPLETE表示操作成功,为SMSSDK.RESULT_ERROR表示操作失败。
  • 请求获取短信验证码,在监听(eventHandle)中返回:getVerificationCode(String country, String phone);
  • 提交短信验证码,在监听eventHandle中返回:submitVerificationCode(String country, String phone, String code);
  • 备注:在EventHandler的4个回调方法都可能不在UI线程下,因此如果要在其中执行UI操作,请务必使用Handler发送一个消息给UI线程处理。

 

  1 package com.gxu.lepao.activity;
  2 
  3 import android.Manifest;
  4 import android.app.Dialog;
  5 import android.content.DialogInterface;
  6 import android.content.Intent;
  7 import android.content.pm.PackageManager;
  8 import android.os.Bundle;
  9 import android.os.CountDownTimer;
 10 import android.os.Handler;
 11 import android.os.Message;
 12 import android.support.v4.app.ActivityCompat;
 13 import android.support.v4.content.ContextCompat;
 14 import android.support.v7.app.AlertDialog;
 15 import android.text.TextUtils;
 16 import android.util.Log;
 17 import android.view.View;
 18 import android.widget.Button;
 19 import android.widget.EditText;
 20 import android.widget.TextView;
 21 import android.widget.Toast;
 22 import com.gxu.lepao.R;
 23 import com.gxu.lepao.model.UserInfo;
 24 import org.litepal.crud.DataSupport;//LitePal开源数据库框架
 25 import java.util.List;
 26 import cn.smssdk.EventHandler;//Mob短信验证码
 27 import cn.smssdk.SMSSDK;//Mob短信验证码
 28 
 29 /**
 30  * Created by ljy on 2017-05-21.
 31  * 获取和验证短信验证码界面
 32  */
 33 
 34 public class RegisterActivity extends BaseActivity {
 35 
 36     private EditText phoneEdit;
 37     private EditText smsEdit;
 38     private Button getSms;
 39     private Button submitSms;
 40     private TextView login;
 41     private TextView reset;
 42     private CountDownTimer countDownTimer;
 43     //倒计时
 44     private int TIME = 60;
 45     //这是中国区号,如果需要其他国家列表,可以使用getSupportedCountries();获得国家区号
 46     public String country = "86";
 47     //APPKEY
 48     private static String appKey = "......";
 49     // 填写从短信SDK应用后台注册得到的APPSECRET
 50     private static String appSecret = "......";
 51     //表示是否使用了registerEventHandler
 52     private boolean ready;
 53 
 54 
 55     @Override
 56     protected void onCreate(Bundle savedInstanceState) {
 57         super.onCreate(savedInstanceState);
 58         Log.d("RegisterActivity","Task; id is " + getTaskId());
 59         setContentView(R.layout.activity_register);
 60         // 初始化界面
 61         initView();
 62         //初始化SMSSDK
 63         initSDK();
//获取验证码按钮监听
64 getSms.setOnClickListener(new View.OnClickListener(){ 65 @Override 66 public void onClick(View v) { 67 boolean isLogin = false; 68 //判断手机号码是否已注册过 69 isLogin = isRegister(); 70 if(!TextUtils.isEmpty(phoneEdit.getText().toString())){ 71 if(!isLogin){ 72 //发送短信权限 73 if(ContextCompat.checkSelfPermission(RegisterActivity.this 74 ,Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED){ 75 //显示申请权限弹窗 76 showRequestPermission(); 77 }else{ 78 //弹窗确认 79 alterWarning(); 80 } 81 }else{ 82 Toast.makeText(RegisterActivity.this,"此手机号码已经注册过",Toast.LENGTH_SHORT).show(); 83 } 84 }else{ 85 Toast.makeText(RegisterActivity.this,"请输入手机号码",Toast.LENGTH_SHORT).show(); 86 } 87 } 88 });
//提交验证码按钮监听
89 submitSms.setOnClickListener(new View.OnClickListener(){ 90 @Override 91 public void onClick(View v) { 92 String sms = smsEdit.getText().toString(); 93 String phone = phoneEdit.getText().toString(); 94 if(!TextUtils.isEmpty(sms)){
//提交验证码和手机号码到Mob,回调在eventHandle中获得
95 SMSSDK.submitVerificationCode( country, phone, sms); 96 }else{ 97 Toast.makeText(RegisterActivity.this,"请输入验证码",Toast.LENGTH_SHORT).show(); 98 } 99 } 100 }); 101 login.setOnClickListener(new View.OnClickListener(){ 102 @Override 103 public void onClick(View v) { 104 Intent intent = new Intent(RegisterActivity.this,LoginActivity.class); 105 startActivity(intent); 106 } 107 }); 108 reset.setOnClickListener(new View.OnClickListener(){ 109 @Override 110 public void onClick(View v) { 111 Intent intent = new Intent(RegisterActivity.this,ResetPwdActivity.class); 112 startActivity(intent); 113 } 114 }); 115 } 116 117 //申请权限弹窗 118 private void showRequestPermission(){ 119 //先new出一个监听器,设置好监听 120 DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){ 121 @Override 122 public void onClick(DialogInterface dialog, int which) { 123 switch(which){ 124 case Dialog.BUTTON_POSITIVE: 125 //接收短信权限 126 ActivityCompat.requestPermissions(RegisterActivity.this,new String[]{Manifest.permission.RECEIVE_SMS},1); 127 //发送短信权限 128 ActivityCompat.requestPermissions(RegisterActivity.this,new String[]{Manifest.permission.SEND_SMS},2); 129 //弹窗确认 130 alterWarning(); 131 break; 132 case Dialog.BUTTON_NEGATIVE: 133 Toast.makeText(RegisterActivity.this, "拒绝" + which, Toast.LENGTH_SHORT).show(); 134 break; 135 } 136 } 137 }; 138 //dialog参数设置 139 AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this); //先得到构造器 140 builder.setTitle("申请权限"); //设置标题 141 builder.setMessage("要允许lepao接收验证码短信吗?"); //设置内容 142 builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可 143 builder.setPositiveButton("允许",dialogOnclicListener); 144 builder.setNegativeButton("拒绝", dialogOnclicListener); 145 builder.create().show(); 146 } 147 148 //申请权限 149 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 150 switch (requestCode){ 151 case 1: 152 if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 153 //initSDK(); 154 Toast.makeText(this,"你授权。。。接收短信权限",Toast.LENGTH_SHORT).show(); 155 }else{ 156 Toast.makeText(this,"你拒绝。。。接收短信权限",Toast.LENGTH_SHORT).show(); 157 } 158 break; 159 case 2: 160 if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 161 Toast.makeText(this,"你授权。。。发送短信权限",Toast.LENGTH_SHORT).show(); 162 }else{ 163 Toast.makeText(this,"你拒绝。。。发送短信权限",Toast.LENGTH_SHORT).show(); 164 } 165 break; 166 default: 167 } 168 } 169 170 // 初始化短信SDK 171 private void initSDK() { 172 SMSSDK.initSDK(this, appKey, appSecret, true); 173 //final Handler handler = new Handler(); 174 EventHandler eventHandler = new EventHandler() { 175 public void afterEvent(int event, int result, Object data) { 176 //回调完成 177 if (result == SMSSDK.RESULT_COMPLETE) 178 { 179 //验证码验证成功 180 if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) 181 { 182 toast("验证成功"); 183 Intent intent = new Intent(RegisterActivity.this,SetPwdActivity.class); 184 intent.putExtra("phone",phoneEdit.getText().toString()); 185 startActivity(intent); 186 finish(); 187 } 188 //已发送验证码 189 else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) 190 { 191 toast("验证码已经发送"); 192 } else 193 { 194 ((Throwable) data).printStackTrace(); 195 String str = data.toString(); 196 toast(str); 197 } 198 } 199 if(result==SMSSDK.RESULT_ERROR) { 200 toast("验证码错误"); 201 } 202 203 } 204 }; 205 // 注册回调监听接口 206 SMSSDK.registerEventHandler(eventHandler); 207 ready = true; 208 } 209 210 //吐司的一个小方法 211 private void toast(final String str) { 212 runOnUiThread(new Runnable() { 213 @Override 214 public void run() { 215 Toast.makeText(RegisterActivity.this, str, Toast.LENGTH_SHORT).show(); 216 } 217 }); 218 } 219 220 221 222 //销毁短信注册 223 @Override 224 protected void onDestroy() { 225 // 注销回调接口registerEventHandler必须和unregisterEventHandler配套使用,否则可能造成内存泄漏。 226 if(ready){ 227 SMSSDK.unregisterAllEventHandler(); 228 } 229 super.onDestroy(); 230 } 231 232 //初始化界面 233 private void initView(){ 234 phoneEdit = (EditText) findViewById(R.id.phone); 235 smsEdit = (EditText) findViewById(R.id.sms); 236 getSms = (Button) findViewById(R.id.getSms); 237 submitSms = (Button) findViewById(R.id.submitSms); 238 login = (TextView) findViewById(R.id.login); 239 reset = (TextView) findViewById(R.id.reset); 240 } 241 242 //弹窗确认 243 private void alterWarning(){ 244 //先new出一个监听器,设置好监听 245 DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){ 246 @Override 247 public void onClick(DialogInterface dialog, int which) { 248 switch(which){ 249 case Dialog.BUTTON_POSITIVE: 250 dialog.dismiss(); 251 //通过sdk发送短信验证(请求获取短信验证码,在监听(eventHandle)中返回) 252 SMSSDK.getVerificationCode(country, phoneEdit.getText().toString()); 253 //设置获取验证码按钮不能点击 254 getSms.setClickable(false); 255 //倒计时,执行次数为(TIME+1)*1000/1000,countDownTimer每次执行间隔:1000(单位为毫秒) 256 countDownTimer = new CountDownTimer((TIME+1)*1000, 1000) { 257 @Override 258 public void onTick(long millisUntilFinished) { 259 getSms.setText(TIME-- + "秒后再次获取验证码"); 260 } 261 262 @Override 263 public void onFinish() { 264 //设置获取验证码按钮可以点击 265 getSms.setClickable(true); 266 getSms.setText("点击获取短信验证码"); 267 } 268 }; 269 countDownTimer.start(); 270 break; 271 case Dialog.BUTTON_NEGATIVE: 272 dialog.dismiss(); 273 Toast.makeText(RegisterActivity.this, "已取消", Toast.LENGTH_SHORT).show(); 274 break; 275 } 276 } 277 }; 278 //dialog参数设置 279 AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器 280 builder.setTitle("发送短信"); //设置标题 281 builder.setMessage("我们将把验证码发送到以下号码:\n"+country+"-"+phoneEdit.getText().toString()); //设置内容 282 builder.setIcon(R.drawable.icon);//设置图标,图片id即可 283 builder.setPositiveButton("确认",dialogOnclicListener); 284 builder.setNegativeButton("取消", dialogOnclicListener); 285 builder.create().show(); 286 } 287 288 //判断手机号码是否已注册过 289 public boolean isRegister(){ 290 boolean isLogin = false; 291 。。。。。299 return isLogin; 300 } 301 302 303 }

 

posted @ 2017-05-23 17:03  洛水3000  阅读(3244)  评论(0编辑  收藏  举报
开始录制