編輯:關於Android編程
使用 LeanCloud 的 REST API 來自定義短信驗證碼相關功能,不再需要臃腫的 SDK 。
公司的項目僅僅使用了 Leancloud 短信功能來發送驗證碼,剛開始 Leancloud 的短信 SDK 還會和項目中的 okhttp 、fastjson 產生沖突,後來使用了獨立的命名空間解決了沖突,但這樣處理會導致項目中產生大量的冗余庫。在僅僅使用短信驗證碼功能 SDK 的情況下會有下列文件被引入到項目中:
avoscloud-sdk-v3.13.8.jar fastjson-1.1.39-leancloud.jar okhttp-2.6.0-leancloud.jar okio-1.6.0-leancloud.jar本來開發 Android 時,大家都盡量避免觸碰 64K 個方法的限制,對於發驗證碼這樣一個簡單的事情,還需要引入大量的第三方庫實在是難以接受。
在目前開發的新項目中,我盡量控制第三方庫的篩選和使用,不想引起啟用 Multidex 導致應用啟動慢的問題。直到我發現 Leancloud 的 REST API ,頓時覺得裡面有搞頭,對,大有搞頭。
首先貼下文檔地址:短信服務 REST API 詳解 ,建議先進行初步閱讀了解基礎概念。
REST API 是請求接口,與具體的語言無關,這裡僅僅演示 Android 下使用 Java 語言的一個實現。
項目中使用的是 okhttp-3.4.1 和 gson-2.7 ,當然你也可以使用其他網絡請求庫和JSON 解析庫。下面上關鍵代碼:
OkHttpUtil
// Constants.APP_KEY 和 Constants.APP_ID 在 LeanCloud 控制台獲取 // String MD5Util.string2MD5(String s); 進行 MD5 加密的一個方法。 // 項目使用了 Logger 日志庫,沒使用的話請自行刪除相關代碼... public class OkHttpUtil { private static OkHttpUtil OkHttpUtil = new OkHttpUtil(); private static OkHttpClient client; public static OkHttpUtil getInstance() { client = new OkHttpClient().newBuilder().build(); return OkHttpUtil; } public Boolean postJson(String target, String json) { MediaType JSON = MediaType.parse("application/json; charset=utf-8"); RequestBody requestBody = RequestBody.create(JSON, json); long timestamp = System.currentTimeMillis(); String sign = MD5Util.string2MD5(timestamp + Constants.APP_KEY); Request request = new Request.Builder() .addHeader("X-LC-Id", Constants.APP_ID) .addHeader("X-LC-Sign", sign + "," + timestamp) .url(target) .post(requestBody) .build(); try { Response response = client.newCall(request).execute(); //判斷請求是否成功 if (response.isSuccessful()) { return true; } else { Logger.e(response.body().string()); } } catch (Exception e) { Logger.e(e.toString()); } return false; } }
LoginActivity
/** * 發送短信驗證碼 * params : mobilePhoneNumber */ private class SendCodeTask extends AsyncTask{ @Override protected Boolean doInBackground(String... params) { //ttl後面的值是短信有效時間(分鐘) String json = "{\"mobilePhoneNumber\":\"{0}\",\"ttl\":10,\"name\":\"注冊\"}"; json = json.replace("{0}", phone); return okHttpUtil.postJson("https://api.leancloud.cn/1.1/requestSmsCode", json); } @Override protected void onPostExecute(Boolean s) { super.onPostExecute(s); if (s) { Toast.makeText(LoginActivity.this,"驗證碼發送成功",Toast.LENGTH_SHORT).show(); } else Toast.makeText(LoginActivity.this, "驗證碼發送失敗",Toast.LENGTH_SHORT).show(); } } /** * 驗證短信驗證碼 * params : mobilePhoneNumber , smsCode */ private class VerifySmsCode extends AsyncTask { @Override protected Boolean doInBackground(String... params) { String json = "{\"mobilePhoneNumber\":\"{0}\"}"; json = json.replace("{0}", params[0]); return okHttpUtil.postJson("https://api.leancloud.cn/1.1/verifySmsCode/" + params[1], json); } @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); if { //do something } else Toast.makeText(LoginActivity.this, "驗證碼不匹配",Toast.LENGTH_SHORT).show(); } }
自己動手,豐衣足食啊。
順便吐槽下:國內的很多第三方 SDK 封裝的時候,基本上沒怎麼考慮使用者項目中已經使用了什麼類庫。對於大部分常見的類庫(圖片加載庫,網絡請求庫等)進行進一步的抽象,可以大大減少開發者的負擔。
如果你不明白我的意思,可以看看 GalleryFinal 這個開源圖片選擇器對於圖片加載庫的封裝,使得它可以適應多種圖片加載庫而不需要你修改項目中已有的圖片庫。
CircleImageView實現圓形頭像代碼分享,供大家參考,具體內容如下一、創建屬性文件(attrs.xml)具體操作:1、在項目的values文件底下創建一新的屬性
眾所周知android studio會在library所依賴的app運行或者build之後自動生成jar,路徑為build/intermediates/bundles/d
TextInput TextInput是允許用戶輸入文本的基礎組件。 他有一些屬性可以來幫助我們處理業務邏輯諸如onChangeText onSubmitEditing
Android用戶界面設計:基本按鈕 本文向你展示了在你的Android應用程序中創建一個簡單的Button或ImageButton控件的步驟。首先,你會