abstract:在說Android中的短信驗(yàn)證碼這個(gè)知識(shí)點(diǎn)前,我們首先來了解下聚合數(shù)據(jù)。聚合數(shù)據(jù)介紹聚合數(shù)據(jù)是一家國內(nèi)最大的基礎(chǔ)數(shù)據(jù)API提供商,專業(yè)從事互聯(lián)網(wǎng)數(shù)據(jù)服務(wù)。免費(fèi)提供從天氣查詢、空氣質(zhì)量、地圖坐標(biāo)到金融基金、電商比價(jià)、違章查詢等各個(gè)領(lǐng)域的安全、穩(wěn)定和高效的數(shù)據(jù)。開發(fā)者可以免費(fèi)試用聚合數(shù)據(jù)API進(jìn)行移動(dòng)APP的快速開發(fā),免除數(shù)據(jù)收集、維護(hù)等環(huán)節(jié),大大降低開發(fā)周期及成本。因此我們可以采用聚合數(shù)據(jù)給我提供好
在說Android中的短信驗(yàn)證碼這個(gè)知識(shí)點(diǎn)前,我們首先來了解下聚合數(shù)據(jù)。
聚合數(shù)據(jù)介紹
聚合數(shù)據(jù)是一家國內(nèi)最大的基礎(chǔ)數(shù)據(jù)API提供商,專業(yè)從事互聯(lián)網(wǎng)數(shù)據(jù)服務(wù)。免費(fèi)提供從天氣查詢、空氣質(zhì)量、地圖坐標(biāo)到金融基金、電商比價(jià)、違章查詢等各個(gè)領(lǐng)域的安全、穩(wěn)定和高效的數(shù)據(jù)。開發(fā)者可以免費(fèi)試用聚合數(shù)據(jù)API進(jìn)行移動(dòng)APP的快速開發(fā),免除數(shù)據(jù)收集、維護(hù)等環(huán)節(jié),大大降低開發(fā)周期及成本。因此我們可以采用聚合數(shù)據(jù)給我提供好的一套東西來進(jìn)行短信驗(yàn)證碼的功能的添加。
首先我們要做準(zhǔn)備工作,使用聚合數(shù)據(jù)主要分為以下步驟:
第一步,注冊聚合數(shù)據(jù)
進(jìn)入聚合數(shù)據(jù)官網(wǎng)(https://www.juhe.cn/)注冊一個(gè)賬號(hào),完成注冊后進(jìn)入,"個(gè)人中心"——>“我的數(shù)據(jù)”點(diǎn)擊申請數(shù)據(jù)如下圖所示:
第二步,申請Appkey
申請后你會(huì)得到一個(gè)Appkey,此Appkey非常重要。
第三步,下載SDK
下載地址:https://www.juhe.cn/juhesdk
第四步,創(chuàng)建工程,配置環(huán)境
1.創(chuàng)建一個(gè)工程把我們下載的SDK里libs下的“armeabi文件”和"smscaptcha_v_1_4.jar"復(fù)制到我們工程的libs目錄下
2.在AndroidManifest中添加開發(fā)密鑰、所需權(quán)限等信息
(1)在application中添加開發(fā)密鑰
<meta-data android:name="JUHE_KEY" android:value="開發(fā)者 key" />
(2)添加所需權(quán)限
<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)在應(yīng)用程序創(chuàng)建時(shí)初始化 SDK引用的Context全局變量
在這一步我們有兩種方法
第一種在Activity中配置
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件之前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法之前實(shí)現(xiàn) /** * 初始化方法 * @param context * @needFriends 是否需要好友功能 */ CommonFun.initialize(getApplicationContext(),true); setContentView(R.layout.activity_main); } }
下面這個(gè)注意是聚合數(shù)據(jù)文檔給我們的建議,它建議我們把這個(gè)初始化工作放在Application中,因?yàn)槌绦蜻\(yùn)行首先會(huì)運(yùn)行Application中的方法
注意:在SDK各功能組件使用之前都需要調(diào)用CommonFun.initialize(getApplicationContext(),true);,因此我們建議該方法放在Application的初始化方法中
所以我們就按它建議的方法,而不采用第一種方法這樣我們需要?jiǎng)?chuàng)建一個(gè)Applicaiton類MyApplication如下
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后不要忘了在清單文件中配置
好了環(huán)境已經(jīng)配置好了,我們來驗(yàn)證一下看看我們是否能收到短信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對(duì)象在這個(gè)對(duì)象中有給我們發(fā)送短信驗(yàn)證碼的方法 SMSCaptcha smsCaptcha=SMSCaptcha.getInstance(); //調(diào)用發(fā)送短信驗(yàn)證碼的方法,在其中有一個(gè)回調(diào) /** phone 手機(jī)號(hào)碼 callBack 返回結(jié)果回調(diào)方法. */ smsCaptcha.sendCaptcha("此處輸入你的手機(jī)號(hào)",new BaseData.ResultCallBack() { @Override public void onResult(int code, String reason, String result) { /* code:返回碼: 服務(wù)器: 0 成功; 1 錯(cuò)誤; 本地: -2 本地網(wǎng)絡(luò)異常; -3 服務(wù)器網(wǎng)絡(luò)異常;-4 解析錯(cuò)誤;-5初始化異常 reason:返回信息 成功或錯(cuò)誤原因. result:返回結(jié)果,JSON格式.錯(cuò)誤或者無返回值時(shí)為空.*/ if(code==0){ Log.i(TAG,"code="+code); Log.i(TAG,"reason="+reason); Log.i(TAG,"result="+result); } } }); } }
返回結(jié)果如下:
第五步:完整的功能的實(shí)現(xiàn),以及界面UI的實(shí)現(xiàn)
首先我們來看下界面第一個(gè)界面
我們在這個(gè)界面輸入手機(jī)號(hào),及短信的目的地,點(diǎn)擊下一步后會(huì)彈出一個(gè)Dialog
點(diǎn)擊確定后會(huì)調(diào)用會(huì)調(diào)用聚合數(shù)據(jù)給我們提供的sendCaptcha方法
/*點(diǎn)擊確定后調(diào)用sendCaptcha方法向服務(wù)器提交手機(jī)號(hào)碼 code(返回碼): 服務(wù)器:0 成功,1 錯(cuò)誤; 本 地:-2 本地網(wǎng)絡(luò)異常,-3 服務(wù)器網(wǎng)絡(luò)異常,-4 解析錯(cuò)誤,-5 初始化異常。 reason(返回信息):成功或錯(cuò)誤的原因。 result(返回結(jié)果):JSON格式,錯(cuò)誤或者無返回值時(shí)為空。 */ smsCaptcha.sendCaptcha(phone,new ResultCallBack() { @Override public void onResult(int code, String reason, String result) { closeDialog(); if(code==0){ afterCapterRequested(); } } );
當(dāng)返回的code==0時(shí)說明短信驗(yàn)證碼發(fā)送成功,我們需要進(jìn)行界面的跳轉(zhuǎn),代碼如下
//當(dāng)code=0成功時(shí),跳轉(zhuǎn)到輸入驗(yàn)證碼的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); //把手機(jī)號(hào)碼和格式化的手機(jī)號(hào)碼傳過去 intent.putExtra("formatedPhone",fomatedPhone); intent.putExtra("phone",phone); startActivity(intent); } //格式化手機(jī)號(hào)碼的方法,格式化后的形式:+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(); }
跳轉(zhuǎn)的界面的布局如下
在這個(gè)界面我們需要輸入短信驗(yàn)證碼,輸入短信驗(yàn)證碼后點(diǎn)擊下一步時(shí)會(huì)調(diào)用聚合數(shù)據(jù)的commitCaptcha這個(gè)方法,比對(duì)數(shù)據(jù)的方法,
smsCaptcha.commitCaptcha(phoneNumbber,verfiyCode,new ResultCallBack() { /* code:返回碼: 服務(wù)器: 0 成功; 1 錯(cuò)誤; 本地: -2 本地網(wǎng)絡(luò)異常; -3 服務(wù)器網(wǎng)絡(luò)異常;-4 解析錯(cuò)誤;-5初始化異常 reason:返回信息 成功或錯(cuò)誤原因. result:返回結(jié)果,JSON格式.錯(cuò)誤或者無返回值時(shí)為空.*/ @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,"您輸入的驗(yàn)證碼正確",Toast.LENGTH_SHORT).show(); CaptchaActivity.this.finish(); }else{ Toast.makeText(CaptchaActivity.this,"您輸入的驗(yàn)證碼不正確",Toast.LENGTH_SHORT).show(); } } });
我們可以看到這個(gè)方法所需的參數(shù)是①手機(jī)號(hào)碼②手機(jī)驗(yàn)證碼,我們調(diào)用此方法后聚合數(shù)據(jù)的服務(wù)器會(huì)進(jìn)行判斷,此驗(yàn)證碼是否是剛才發(fā)送給這個(gè)手機(jī)號(hào)的驗(yàn)證碼,驗(yàn)證后給我返回結(jié)果,我們根據(jù)返回的結(jié)果就可以進(jìn)行相應(yīng)的操作。在上面的界面中我們發(fā)現(xiàn)有一個(gè)倒計(jì)時(shí)的功能,我在這里說一下思路,當(dāng)然這個(gè)倒計(jì)時(shí)方法有很多。在這個(gè)Demo中倒計(jì)時(shí)是放在一個(gè)tvCountDown的一個(gè)textView中,首先
//R.string.receiveMessgeCountDown的內(nèi)容為:<Data>接收短信大約需要<font color=#209526>%s</font>秒</Data> //這句話就是用time把 html里的%號(hào)替換掉 String unReceive=getResources().getString(R.string. receiveMessgeCountDown,time ); //把用html格式化的字符串設(shè)置給倒計(jì)時(shí)的文本框 tvCountDown.setText(Html.fromHtml(unReceive));
這樣我們可以把html格式化的文本填充到tvCountDown中。接下來就是倒計(jì)時(shí)的方法了
private final int RETRY_INTERVAL =60; private int time=RETRY_INTERVAL; //倒計(jì)時(shí)方法 private void countDown() { new Thread( new Runnable() { @Override public void run() { while( time-->0){ //減一后的time把<Data>接收短信大約需要<font color=#209526>%s</font>秒</Data>中的%號(hào)替換掉 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); } }); }
總結(jié):其實(shí)使用聚合數(shù)據(jù)的短信驗(yàn)證碼功能,主要就兩個(gè)方法,一個(gè)是獲取驗(yàn)證碼的方法sendCaptcha,一個(gè)是提交驗(yàn)證碼進(jìn)行驗(yàn)證的方法commitCaptcha。我們在此基礎(chǔ)上,可以根據(jù)需求對(duì)界面進(jìn)行更改。以上就是對(duì)短信驗(yàn)證碼的主要邏輯進(jìn)行的介紹。