Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 必知必會 - 極簡版 Leancloud 短信驗證碼功能

Android 必知必會 - 極簡版 Leancloud 短信驗證碼功能

編輯:關於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 這個開源圖片選擇器對於圖片加載庫的封裝,使得它可以適應多種圖片加載庫而不需要你修改項目中已有的圖片庫。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved