使用聚合数据实现Android手机验证码校验功能

在说Android中的短信验证码这个知识点前,我们首先来了解下聚合数据

聚合数据介绍

聚合数据是一家国内最大的基础数据API提供商,专业从事互联网数据服务。免费提供从天气查询、空气质量、地图坐标到金融基金、电商比价、违章查询等各个领域的安全、稳定和高效的数据。开发者可以免费试用聚合数据API进行移动APP的快速开发,免除数据收集、维护等环节,大大降低开发周期及成本。因此我们可以采用聚合数据给我提供好的一套东西来进行短信验证码的功能的添加。

首先我们要做准备工作,使用聚合数据主要分为以下步骤:

第一步,注册聚合数据

进入聚合数据官网(https://www.juhe.cn/)注册一个账号,完成注册后进入,”个人中心”——>“我的数据”点击申请数据如下图所示:

第二步,申请Appkey

申请后你会得到一个Appkey,此Appkey非常重要。

第三步,下载SDK

下载地址:https://www.juhe.cn/juhesdk

第四步,创建工程,配置环境

1.创建一个工程把我们下载的SDK里libs下的“armeabi文件”和”smscaptcha_v_1_4.jar”复制到我们工程的libs目录下

2.在AndroidManifest中添加开发密钥、所需权限等信息

 (1)在application中添加开发密钥

  1. <meta-data      
  2.       android:name=“JUHE_KEY”      
  3.       android:value=“开发者 key” />    
<meta-data    
      android:name="JUHE_KEY"    
      android:value="开发者 key" />  
(2)添加所需权限
  1. <uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE” />      
  2. <uses-permission android:name=”android.permission.INTERNET” />      
  3. <uses-permission android:name=”android.permission.ACCESS_WIFI_STATE” />      
  4. <uses-permission android:name=”android.permission.ACCESS_COARSE_LOCATION ” />      
  5. <uses-permission android:name=”android.permission.READ_FINE_LOCATION” />    
  6. <uses-permission android:name=”android.permission.READ_PHONE_STATE” />    
  7. <uses-permission android:name=”android.permission.READ_CONTACTS” />    
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    
<uses-permission android:name="android.permission.INTERNET" />    
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION " />    
<uses-permission android:name="android.permission.READ_FINE_LOCATION" />  
<uses-permission android:name="android.permission.READ_PHONE_STATE" />  
<uses-permission android:name="android.permission.READ_CONTACTS" />  

(3)在应用程序创建时初始化 SDK引用的Context全局变量

在这一步我们有两种方法

第一种在Activity中配置

  1. public class MainActivity extends Activity {      
  2.     @Override      
  3.     protected void onCreate(Bundle savedInstanceState) {      
  4.         super.onCreate(savedInstanceState);       
  5.         //在使用SDK各组件之前初始化context信息,传入ApplicationContext      
  6.         //注意该方法要再setContentView方法之前实现      
  7.     /**   
  8.     * 初始化方法  
  9.     * @param context  
  10.     * @needFriends 是否需要好友功能  
  11.     */     
  12.         CommonFun.initialize(getApplicationContext(),true);      
  13.         setContentView(R.layout.activity_main);      
  14.     }      
  15. }    
public class MainActivity extends Activity {    
    @Override    
    protected void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);     
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext    
        //注意该方法要再setContentView方法之前实现    
    /**  
    * 初始化方法 
    * @param context 
    * @needFriends 是否需要好友功能 
    */   
        CommonFun.initialize(getApplicationContext(),true);    
        setContentView(R.layout.activity_main);    
    }    
}  

下面这个注意是聚合数据文档给我们的建议,它建议我们把这个初始化工作放在Application中,因为程序运行首先会运行Application中的方法

注意:在SDK各功能组件使用之前都需要调用CommonFun.initialize(getApplicationContext(),true);,因此我们建议该方法放在Application的初始化方法中

所以我们就按它建议的方法,而不采用第一种方法这样我们需要创建一个Applicaiton类MyApplication如下

  1. package com.example.android.sms;    
  2.     
  3. import com.thinkland.sdk.util.CommonFun;    
  4.     
  5. import android.app.Application;    
  6.     
  7. public class MyApplication extends Application {    
  8.     
  9.     @Override    
  10.     public void onCreate() {    
  11.         super.onCreate();    
  12.         CommonFun.initialize(getApplicationContext(), false);     
  13.     }    
  14. }    
package com.example.android.sms;  

import com.thinkland.sdk.util.CommonFun;  

import android.app.Application;  

public class MyApplication extends Application {  

    @Override  
    public void onCreate() {  
        super.onCreate();  
        CommonFun.initialize(getApplicationContext(), false);   
    }  
}  

声明好Application后不要忘了在清单文件中配置

 

好了环境已经配置好了,我们来验证一下看看我们是否能收到短信

MainActivity的代码如下

  1. package com.example.android.sms;    
  2.     
  3. import com.thinkland.sdk.sms.SMSCaptcha;    
  4. import com.thinkland.sdk.util.BaseData;    
  5. import com.thinkland.sdk.util.CommonFun;    
  6.     
  7. import android.os.Bundle;    
  8. import android.app.Activity;    
  9. import android.util.Log;    
  10. import android.view.Menu;    
  11. import android.widget.Toast;    
  12.     
  13. public class MainActivity extends Activity {    
  14.     
  15.     protected static final String TAG =“MainActivity”;    
  16.     
  17.     @Override    
  18.     protected void onCreate(Bundle savedInstanceState) {    
  19.         super.onCreate(savedInstanceState);    
  20.         
  21.         setContentView(R.layout.activity_main);    
  22.         //初始化 SMSCaptcha对象在这个对象中有给我们发送短信验证码的方法    
  23.         SMSCaptcha smsCaptcha=SMSCaptcha.getInstance();    
  24.         //调用发送短信验证码的方法,在其中有一个回调    
  25.             
  26.         /**  
  27.           phone 手机号码  
  28.           callBack  返回结果回调方法.  
  29.          */    
  30.         smsCaptcha.sendCaptcha(”此处输入你的手机号”,new BaseData.ResultCallBack() {    
  31.                 
  32.             @Override    
  33.             public void onResult(int code, String reason, String result) {    
  34.                     
  35.                    /*  
  36.                     code:返回码:  
  37.                     服务器: 0 成功; 1 错误;  
  38.                     本地: -2 本地网络异常; -3 服务器网络异常;-4 解析错误;-5初始化异常  
  39.                     reason:返回信息 成功或错误原因.  
  40.                     result:返回结果,JSON格式.错误或者无返回值时为空.*/    
  41.                     
  42.                 if(code==0){    
  43.                     Log.i(TAG,”code=”+code);    
  44.                     Log.i(TAG,”reason=”+reason);    
  45.                     Log.i(TAG,”result=”+result);    
  46.                 }    
  47.             }    
  48.         });    
  49.     }    
  50. }    
package com.example.android.sms;  

import com.thinkland.sdk.sms.SMSCaptcha;  
import com.thinkland.sdk.util.BaseData;  
import com.thinkland.sdk.util.CommonFun;  

import android.os.Bundle;  
import android.app.Activity;  
import android.util.Log;  
import android.view.Menu;  
import android.widget.Toast;  

public class MainActivity extends Activity {  

    protected static final String TAG ="MainActivity";  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  

        setContentView(R.layout.activity_main);  
        //初始化 SMSCaptcha对象在这个对象中有给我们发送短信验证码的方法  
        SMSCaptcha smsCaptcha=SMSCaptcha.getInstance();  
        //调用发送短信验证码的方法,在其中有一个回调  

        /** 
          phone 手机号码 
          callBack  返回结果回调方法. 
         */  
        smsCaptcha.sendCaptcha("此处输入你的手机号",new BaseData.ResultCallBack() {  

            @Override  
            public void onResult(int code, String reason, String result) {  

                   /* 
                    code:返回码: 
                    服务器: 0 成功; 1 错误; 
                    本地: -2 本地网络异常; -3 服务器网络异常;-4 解析错误;-5初始化异常 
                    reason:返回信息 成功或错误原因. 
                    result:返回结果,JSON格式.错误或者无返回值时为空.*/  

                if(code==0){  
                    Log.i(TAG,"code="+code);  
                    Log.i(TAG,"reason="+reason);  
                    Log.i(TAG,"result="+result);  
                }  
            }  
        });  
    }  
}  

返回结果如下:

第五步:完整的功能的实现,以及界面UI的实现

首先我们来看下界面第一个界面

我们在这个界面输入手机号,及短信的目的地,点击下一步后会弹出一个Dialog

点击确定后会调用会调用聚合数据给我们提供的sendCaptcha方法

  1.     /*点击确定后调用sendCaptcha方法向服务器提交手机号码  
  2.                   code(返回码):   
  3.                   服务器:0 成功,1 错误;   
  4.                   本  地:-2 本地网络异常,-3 服务器网络异常,-4 解析错误,-5 初始化异常。   
  5.                   reason(返回信息):成功或错误的原因。   
  6.                   result(返回结果):JSON格式,错误或者无返回值时为空。   
  7.                 */     
  8. smsCaptcha.sendCaptcha(phone,new ResultCallBack() {    
  9.                         
  10. @Override    
  11. public void onResult(int code, String reason, String result) {    
  12. closeDialog();    
  13. if(code==0){    
  14. afterCapterRequested();    
  15. }                           
  16.   }    
  17.     
  18. );    
    /*点击确定后调用sendCaptcha方法向服务器提交手机号码 
                  code(返回码):  
                  服务器:0 成功,1 错误;  
                  本  地:-2 本地网络异常,-3 服务器网络异常,-4 解析错误,-5 初始化异常。  
                  reason(返回信息):成功或错误的原因。  
                  result(返回结果):JSON格式,错误或者无返回值时为空。  
                */   
smsCaptcha.sendCaptcha(phone,new ResultCallBack() {  

@Override  
public void onResult(int code, String reason, String result) {  
closeDialog();  
if(code==0){  
afterCapterRequested();  
}                         
  }  

);  
当返回的code==0时说明短信验证码发送成功,我们需要进行界面的跳转,代码如下
  1. //当code=0成功时,跳转到输入验证码的Activity    
  2.     private void afterCapterRequested() {    
  3.         String phone=etPhoneNumber.getText().toString().trim().replaceAll(”\\ss*”,     
  4.                 ”“);    
  5.         String code=tvCountryNumber.getText().toString().trim();    
  6.         String fomatedPhone=code+” ”+splitPhoneNum(phone);    
  7.             
  8.         Toast.makeText(this,“成功”,Toast.LENGTH_SHORT).show();    
  9.         Intent intent=new Intent();    
  10.         intent.setClass(RegistActivity.this,CaptchaActivity.class);    
  11.         //把手机号码和格式化的手机号码传过去    
  12.         intent.putExtra(”formatedPhone”,fomatedPhone);    
  13.         intent.putExtra(”phone”,phone);    
  14.         startActivity(intent);    
  15.     }    
  16.         
  17.     //格式化手机号码的方法,格式化后的形式:+86 131 4118 2951    
  18.     private String splitPhoneNum(String phone) {    
  19.             
  20.         StringBuilder builder=new StringBuilder(phone);    
  21.         builder.reverse();    
  22.         for(int i=4,len=builder.length();i<len;i+=5){    
  23.             builder.insert(i,’ ’);    
  24.         }    
  25.         builder.reverse();    
  26.         return builder.toString();    
  27.     }    
//当code=0成功时,跳转到输入验证码的Activity  
    private void afterCapterRequested() {  
        String phone=etPhoneNumber.getText().toString().trim().replaceAll("\\ss*",   
                "");  
        String code=tvCountryNumber.getText().toString().trim();  
        String fomatedPhone=code+" "+splitPhoneNum(phone);  

        Toast.makeText(this,"成功",Toast.LENGTH_SHORT).show();  
        Intent intent=new Intent();  
        intent.setClass(RegistActivity.this,CaptchaActivity.class);  
        //把手机号码和格式化的手机号码传过去  
        intent.putExtra("formatedPhone",fomatedPhone);  
        intent.putExtra("phone",phone);  
        startActivity(intent);  
    }  

    //格式化手机号码的方法,格式化后的形式:+86 131 4118 2951  
    private String splitPhoneNum(String phone) {  

        StringBuilder builder=new StringBuilder(phone);  
        builder.reverse();  
        for(int i=4,len=builder.length();i<len;i+=5){  
            builder.insert(i,' ');  
        }  
        builder.reverse();  
        return builder.toString();  
    }  

跳转的界面的布局如下

在这个界面我们需要输入短信验证码,输入短信验证码后点击下一步时会调用聚合数据的commitCaptcha这个方法,比对数据的方法,

  1. smsCaptcha.commitCaptcha(phoneNumbber,verfiyCode,new ResultCallBack() {    
  2.         /*   
  3.                     code:返回码:   
  4.                     服务器: 0 成功; 1 错误;   
  5.                     本地: -2 本地网络异常; -3 服务器网络异常;-4 解析错误;-5初始化异常   
  6.                     reason:返回信息 成功或错误原因.   
  7.                     result:返回结果,JSON格式.错误或者无返回值时为空.*/     
  8.         @Override    
  9.         public void onResult(int code,String reason,String result) {    
  10.         if(code==0){    
  11.         Log.i(TAG,code+”“);    
  12.         Log.i(TAG,reason);    
  13.         Log.i(TAG,result);    
  14.         Toast.makeText(CaptchaActivity.this,“您输入的验证码正确”,Toast.LENGTH_SHORT).show();    
  15.         CaptchaActivity.this.finish();    
  16.         }else{    
  17.         Toast.makeText(CaptchaActivity.this,“您输入的验证码不正确”,Toast.LENGTH_SHORT).show();    
  18.                 }    
  19.             }    
  20.         });    
smsCaptcha.commitCaptcha(phoneNumbber,verfiyCode,new ResultCallBack() {  
        /*  
                    code:返回码:  
                    服务器: 0 成功; 1 错误;  
                    本地: -2 本地网络异常; -3 服务器网络异常;-4 解析错误;-5初始化异常  
                    reason:返回信息 成功或错误原因.  
                    result:返回结果,JSON格式.错误或者无返回值时为空.*/   
        @Override  
        public void onResult(int code,String reason,String result) {  
        if(code==0){  
        Log.i(TAG,code+"");  
        Log.i(TAG,reason);  
        Log.i(TAG,result);  
        Toast.makeText(CaptchaActivity.this,"您输入的验证码正确",Toast.LENGTH_SHORT).show();  
        CaptchaActivity.this.finish();  
        }else{  
        Toast.makeText(CaptchaActivity.this,"您输入的验证码不正确",Toast.LENGTH_SHORT).show();  
                }  
            }  
        });  
我们可以看到这个方法所需的参数是①手机号码②手机验证码,我们调用此方法后聚合数据的服务器会进行判断,此验证码是否是刚才发送给这个手机号的验证码,验证后给我返回结果,我们根据返回的结果就可以进行相应的操作。
在上面的界面中我们发现有一个倒计时的功能,我在这里说一下思路,当然这个倒计时方法有很多。在这个Demo中倒计时是放在一个tvCountDown的一个textView中,首先
  1. //R.string.receiveMessgeCountDown的内容为:<Data>接收短信大约需要<font color=#209526>%s</font>秒</Data>    
  2. //这句话就是用time把 html里的%号替换掉    
  3. String unReceive=getResources().getString(R.string. receiveMessgeCountDown,time );    
  4. //把用html格式化的字符串设置给倒计时的文本框    
  5. tvCountDown.setText(Html.fromHtml(unReceive));    
//R.string.receiveMessgeCountDown的内容为:<Data>接收短信大约需要<font color=#209526>%s</font>秒</Data>  
//这句话就是用time把 html里的%号替换掉  
String unReceive=getResources().getString(R.string. receiveMessgeCountDown,time );  
//把用html格式化的字符串设置给倒计时的文本框  
tvCountDown.setText(Html.fromHtml(unReceive));  
这样我们可以把html格式化的文本填充到tvCountDown中。接下来就是倒计时的方法了
  1. private final int RETRY_INTERVAL =60;    
  2. private int time=RETRY_INTERVAL;    
  3.      //倒计时方法    
  4.      private void countDown() {    
  5.             new Thread( new Runnable() {    
  6.                     
  7.                  @Override    
  8.                  public void run() {    
  9.                  while( time–>0){    
  10.                //减一后的time把<Data>接收短信大约需要<font color=#209526>%s</font>秒</Data>中的%号替换掉    
  11.                 String countDownTime=CaptchaActivity.this .getResources().getString(R.string. receiveMessgeCountDown,time );    
  12.               //在主线程上更新tvCountDown    
  13.               upDateTvCountDown(countDownTime);    
  14.               try {    
  15.                  Thread. sleep(1000);    
  16.                   } catch (InterruptedException e) {    
  17.                       e.printStackTrace();    
  18.                      }    
  19.                  }       
  20.                 String countDownTime=CaptchaActivity.this .getResources().getString(R.string. unreceiveMessage, time);    
  21.                upDateTvCountDown(countDownTime);    
  22.                time = RETRY_INTERVAL;    
  23.            }    
  24.      }).start();    
  25. }    
  26. //在主线程上更新tvCountDown    
  27. private void upDateTvCountDown(final String countDownTime) {    
  28.            runOnUiThread( new Runnable() {    
  29.                  @Override    
  30.                  public void run() {    
  31.                   tvCountDown.setText(Html. fromHtml(countDownTime));    
  32.                   tvCountDown.setEnabled( false);    
  33.                 }    
  34.            });    
  35.      }    
private final int RETRY_INTERVAL =60;  
private int time=RETRY_INTERVAL;  
     //倒计时方法  
     private void countDown() {  
            new Thread( new Runnable() {  

                 @Override  
                 public void run() {  
                 while( time-->0){  
               //减一后的time把<Data>接收短信大约需要<font color=#209526>%s</font>秒</Data>中的%号替换掉  
                String countDownTime=CaptchaActivity.this .getResources().getString(R.string. receiveMessgeCountDown,time );  
              //在主线程上更新tvCountDown  
              upDateTvCountDown(countDownTime);  
              try {  
                 Thread. sleep(1000);  
                  } catch (InterruptedException e) {  
                      e.printStackTrace();  
                     }  
                 }     
                String countDownTime=CaptchaActivity.this .getResources().getString(R.string. unreceiveMessage, time);  
               upDateTvCountDown(countDownTime);  
               time = RETRY_INTERVAL;  
           }  
     }).start();  
}  
//在主线程上更新tvCountDown  
private void upDateTvCountDown(final String countDownTime) {  
           runOnUiThread( new Runnable() {  
                 @Override  
                 public void run() {  
                  tvCountDown.setText(Html. fromHtml(countDownTime));  
                  tvCountDown.setEnabled( false);  
                }  
           });  
     }  
总结:其实使用聚合数据的短信验证码功能,主要就两个方法,一个是获取验证码的方法sendCaptcha,一个是提交验证码进行验证的方法commitCaptcha。我们在此基础上,可以根据需求对界面进行更改。以上就是对短信验证码的主要逻辑进行的介绍。

转载来源:http://blog.youkuaiyun.com/ishxiao/article/details/52710870

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值