Android開發之短信驗證碼示例

在說Android中的短信驗證碼這個知識點前,咱們首先來了解下聚合數據html

聚合數據介紹

聚合數據是一家國內最大的基礎數據API提供商,專業從事互聯網數據服務。免費提供從天氣查詢、空氣質量、地圖座標到金融基金、電商比價、違章查詢等各個領域的安全、穩定和高效的數據。開發者能夠免費試用聚合數據API進行移動APP的快速開發,免除數據收集、維護等環節,大大下降開發週期及成本。所以咱們能夠採用聚合數據給我提供好的一套東西來進行短信驗證碼的功能的添加。android

首先咱們要作準備工做,使用聚合數據主要分爲如下步驟:安全

第一步,註冊聚合數據

進入聚合數據官網(https://www.juhe.cn/)註冊一個帳號,完成註冊後進入,"我的中心"——>「個人數據」點擊申請數據以下圖所示:服務器

28132626_DWoM.png

第二步,申請Appkey

申請後你會獲得一個Appkey,此Appkey很是重要。網絡

第三步,下載SDK

下載地址:https://www.juhe.cn/juhesdkapp

第四步,建立工程,配置環境

1.建立一個工程把咱們下載的SDK裏libs下的「armeabi文件」和"smscaptcha_v_1_4.jar"複製到咱們工程的libs目錄下
2.在AndroidManifest中添加開發密鑰、所需權限等信息
(1)在application中添加開發密鑰ide

<meta-data    
      android:name="JUHE_KEY"    
      android:value="開發者 key" />

(2)添加所需權限佈局

<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中配置ui

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以下this

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後不要忘了在清單文件中配置

28132626_o2X8.jpg

好了環境已經配置好了,咱們來驗證一下看看咱們是否能收到短信
MainActivity的代碼以下

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);  
                }  
            }  
        });  
    }  
}

返回結果以下:

28132626_1Efy.jpg

第五步:完整的功能的實現,以及界面UI的實現

首先咱們來看下界面第一個界面
28132626_24zm.png

咱們在這個界面輸入手機號,及短信的目的地,點擊下一步後會彈出一個Dialog
28132626_HpRj.png

點擊肯定後會調用會調用聚合數據給咱們提供的sendCaptcha方法

/*點擊肯定後調用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時說明短信驗證碼發送成功,咱們須要進行界面的跳轉,代碼以下

//當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();  
    }

跳轉的界面的佈局以下
28132626_CJUt.png

在這個界面咱們須要輸入短信驗證碼,輸入短信驗證碼後點擊下一步時會調用聚合數據的commitCaptcha這個方法,比對數據的方法,

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中,首先

//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中。接下來就是倒計時的方法了

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。咱們在此基礎上,能夠根據需求對界面進行更改。以上就是對短信驗證碼的主要邏輯進行的介紹。

相關文章
相關標籤/搜索