『实践』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.****.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

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

图1

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

图2

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

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

图3

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

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

图4

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

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

图5

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

图6

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

图7

 

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

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

图8

 (6)Toast

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

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 }