編輯:關於Android編程
基本上很多驗證都需要用到短信服務,注冊登錄時或有消息通知時需要對用戶進行驗證,這時會向用戶發送一條短信。Mob是一個移動開發者服務平台,他可以為我們提供第三方的短信服務功能。開發者可以通過官網,注冊登錄並創建應用項目,獲取對應的Key,以及 Secret,就可以使用官方短信SDK。
個人覺得Mob最大的優勢在於,提供數據統計,對於應用分析是一個很好的數據參考。
正如前面所說,要想使用Mob第三方短信驗證服務,開發者需要通過官網,注冊登錄並創建應用項目,獲取對應的Key,以及 Secret,就可以使用官方短信SDK。
進入官網,在右上角進行注冊並登錄
2.2.1
登錄成功後,進入後台
2.2.2
啟用短信應用SDK
2.2.3
添寫應用信息,短信信息中會附有應用名稱
2.2.4
得到key值以及secret
2.3.1
可以通過官網導航欄進入短信SDK界面
也可以直接通過該鏈接:
http://download.csdn.net/download/abrazen_zz/9644555 進行下載
2.3.2
選擇IDE版本
這裡只講解Android Studio導入方式
2.4.1
打開下載好的SDK,在SMSSDK下,將以下標出的四個文件導入到項目app的libs目錄下(如果沒有libs文件夾可以直接新建)。
SMSSDK目錄如下:
2.4.2
在build.gradle下,加上藍圈中的這幾句。
項目結構:
考慮到等待時間較長,這裡省略輸入手機號碼界面,短信發至另外部手機,效果如下:
3.2.1
添加如下的權限:
3.2.2
在application標簽下添加跳轉界面的Activity配置:
windowsoftinputmode="stateHidden|adjustResize">
在你要跳轉到短信頁面時,按順序加入以下步驟的代碼
3.3.1
啟動時初始化
SMSSDK.initSDK(this, "您的appkey", "您的appsecret");
3.3.2
發送短信驗證碼
短信SDK內置了開源的GUI功能,您可以通過調用下面的代碼打開短信驗證頁面:
//創建注冊頁面 RegisterPage registerPage = new RegisterPage(); //顯示界面 registerPage.show(MainActivity.this); //回調函數 registerPage.setRegisterCallback(new EventHandler() { public void afterEvent(int event, int result, Object data) { // 解析注冊結果 if (result == SMSSDK.RESULT_COMPLETE) { @SuppressWarnings("unchecked") HashMapphoneMap = (HashMap ) data; String country = (String) phoneMap.get("country"); String phone = (String) phoneMap.get("phone"); Toast.makeText(MainActivity.this, "驗證成功", Toast.LENGTH_SHORT).show(); // 提交用戶信息(此方法可以不調用) //registerUser(country, phone); } } });
只要初始化並顯示短信驗證界面,剩下的SDK都封裝好了。我們也可以監聽短信驗證的每個步驟,如請求獲取驗證短信,驗證成功,驗證失敗等等。
這裡使用setRegisterCallback()為短信添加一個EventHandler監聽方法,result == SMSSDK.RESULT_COMPLETE即驗證碼驗證成功後的監聽。
具體關於短信驗證的回調函數在下面有做分析,在這裡只是簡單的參考。
這裡是我自己制作的頁面,點擊驗證按鈕就會調用官方提供接口上傳手機號碼,從而請求下發短信。效果如下:
4.2.1
同理,這裡需要在AndroidManifest.xml中添加權限,因為不需要調用界面,所以不需要配置< activity>< /activity>.
4.2.2
在點擊事件,添加如下代碼:
Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) Toast.makeText(mActivity, "回調完成", Toast.LENGTH_SHORT).show(); else if (msg.what == 2) Toast.makeText(mActivity, "提交驗證碼成功", Toast.LENGTH_SHORT).show(); else if (msg.what == 3) Toast.makeText(mActivity, "獲取驗證碼成功", Toast.LENGTH_SHORT).show(); else if (msg.what == 4) Toast.makeText(mActivity, "返回支持發送國家驗證碼", Toast.LENGTH_SHORT).show(); } }; //回調函數 EventHandler eh = new EventHandler() { @Override public void afterEvent(int event, int result, Object data) { if (result == SMSSDK.RESULT_COMPLETE) { handler.sendEmptyMessage(1); //回調完成 if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { //提交驗證碼成功 handler.sendEmptyMessage(2); } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { //獲取驗證碼成功 handler.sendEmptyMessage(3); } else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) { //返回支持發送驗證碼的國家列表 handler.sendEmptyMessage(4); } } else { ((Throwable) data).printStackTrace(); } } }; SMSSDK.initSDK(this, "您的appkey", "您的appsecret");//初始化 SMSSDK.registerEventHandler(eh); //注冊短信回調 SMSSDK.getVerificationCode("86", phone);//請求獲取短信驗證碼
這裡使用registerEventHandler()方法為短信驗證增加一個EventHandler的監聽對象。
其次,這裡只是請求下發短信到手機。並未進行判斷驗證碼是否准確。
可以通過
submitVerificationCode(String country, String phone, String code)
對短信進行驗證。請求成狗與否,驗證成功與否會調用回調函數EventHandler。
5. 監聽器(回調接口)
其中的EventHandler即為操作回調。它包括4個方法,分別為:
public void onRegister(); //注冊監聽時被觸發 public void beforeEvent(int event, Object);//操作執行前被觸發 public void afterEvent(int event, int result, Object data);//操作結束時被觸發(即相當於輸入手機號碼並點擊了驗證) public void onUnregister();//解除監聽時被觸發
其中要注意的是:afterEvent在操作結束時被觸發,event表示操作的類型但是,data表示事件操作結果,其具體取值根據參數result而定。result是操作結果,為SMSSDK.RESULT_COMPLETE表示操作成功,為SMSSDK.RESULT_ERROR表示操作失敗。
當result=SMSSDK.RESULT_COMPLETE時
先判斷result,再判斷event,之後直接將data強壯成對應的類型即可。
短信SDK采用“廣播”的方式發送操作結果。每次調用registerEventHandler都會設置創建新的EventHandler。
為了避免EventHandler注冊後不再使用而造成內存洩漏,請務必在確定不使用某個EventHandler時,需要解除注冊,方法如下:
SMSSDK.unregisterEventHandler(EventHandler);
在EventHandler的4個回調方法都可能不在UI線程下,因此如果要在其中執行UI操作,請務必使用Handler發送一個消息給UI線程處理。
6. 智能短信驗證
從Android 1.3.1版本開始,我們新增了智能驗證功能。智能驗證是指您的手機號最近一次已經在Mob平台的SMSSDK驗證過。此時就不再下發短信到該手機上,直接通過驗證。當用戶手機未通過智能驗證時,則依然需要下發短信/語音驗證碼的方式驗證手機號的有效性。
如果你不想使用此功能,可以在短信的後台關閉,默認是打開。
6.1使用智能驗證
智能驗證依然在獲取短信驗證的api(SMSSDK.getVerificationCode)裡,只是操作回調中,需要判斷一下。當result=SMSSDK.RESULT_COMPLETE,則data的類型為Boolean,你需要判斷一下,如果為true,便是智能驗證。
調用代碼如下:
if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
if(result == SMSSDK.RESULT_COMPLETE) {
boolean smart = (Boolean)data;
if(smart) {
//通過智能驗證
} else {
//依然走短信驗證
}
}
}
7. 服務器短信服務
之前,短信驗證碼正確與否是在客戶端調用submitVerificationCode(String country, String phone, String code);進行判斷。
Mob提供服務器短信服務,即在驗證碼正確與否由自己的服務器調用相應的代碼進行判斷。這樣,客戶端只需要將獲取到的短信驗證碼提交到自己的服務器。再由自己的服務器向短信驗證的服務器去判定。
7.1接口使用
第一步:開通服務端驗證開關
免費短信驗證碼SDK/應用管理/短信設置 , 把服務端驗證接口開關開啟
第二步:請求接口驗證短信
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxjb2RlPsfrx/O12Na3zqqjujxhIGhyZWY9"https://webapi.sms.mob.com/sms/verify">https://webapi.sms.mob.com/sms/verify
請求方式: POST
請求參數
返回結果
{status:200}
8. 錯誤碼參考
8.1本地錯誤碼:
8.2服務器錯誤碼:
如下,這是驗證碼輸入錯誤Android studio 報的錯誤..
有了狀態碼,就能知道到底是本地發生錯誤還是服務器,具體是什麼錯誤。
9. 附加
9.1權限修改
9.1.1
SMSSDK中用到的權限
普通組:
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_WIFI_STATE
android.permission.INTERNET
android.permission.GET_TASKS
謹慎組:
android.permission.READ_PHONE_STATE
android.permission.RECEIVE_SMS
android.permission.READ_SMS
android.permission.READ_CONTACTS
android.permission.WRITE_EXTERNAL_STORAGE
這些權限一般在Manifest文件中按需加入
9.1.2
6.0權限
因為6.0權限授權的改變,即使你在Manifest中加入,有些權限依然需要獲得用戶的手動授權。由於手動授權在SDK中不好做,
它會中斷SDK的初始化,因此需要開發者自己實現權限授權。
上面普通組中的只需在manifest文件中加入即可。謹慎組中的需要額外授權。
如果你需要智能驗證,請授權READ_PHONE_STATE,READ_SMS。
如果你需要通訊錄功能,請授權READ_CONTACT。
如果你需要讀取SD卡,請授權WRITE_EXTERNAL_STORAGE
如果用到UI庫中的自動讀取驗證碼,請授權RECEIVE_SMS
具體授權過程請參考官方教材:
http://developer.android.com/training/permissions/index.html
9.2mob規則
mob規則是指,對短信數量及各方面做了限制。
具體參考該鏈接: http://wiki.mob.com/smssdk2-x-x%E9%BB%98%E8%AE%A4%E8%A7%84%E5%88%99/
先占個位置,下次翻譯~ :p There are a few scenarios in which your activity is destroyed due t
經過了幾天的痛苦煎熬,終於把微信支付調通,整個調試過程很痛苦,痛苦的主要來源是微信支付的調試真的是,以前調試公眾號支付也是一波三折啊。好吧,開始!首先說明,我這裡主要沒有
聲音的類型有:定義在AudioSystem.java文件中 /* The default audio stream */public static final
1.創建一個類繼承viewpublic class MyToggleButton extends View { private static final String N