全部產品
Search
文件中心

ID Verification:Android接入

更新時間:Nov 04, 2025

本文介紹FACE_GUARD的Android端接入流程。

使用須知

重要

整合FACE_GUARD的應用,依賴業務側具備成熟的Face Service演算法和風險策略營運體系。建議您可以先和商務經理溝通評估業務情境匹配程度。

Android SDK使用限制如下:

  • 不支援模擬器模式調試。

  • 僅支援Android 4.4及以上系統版本的移動智慧型裝置(手機或Pad)接入。

  • 目前支援 arm、armv7 和 arm64 三個架構。

接入步驟

前期準備

接入前需要進行許可權配置和SDK依賴配置,您可以參考下面的步驟操作。

許可權說明

為增強人臉作弊的識別效果,當前 SDK 需要以下許可權:

許可權內容

是否必選

備忘

android.permission.INTERNET

保證 SDK 可以連網。

android.permission.ACCESS_NETWORK_STATE

用於擷取裝置網路狀態資訊。

android.permission.READ_PHONE_STATE

否(推薦賦予)

該部分許可權在 Android 6.0 以上系統中需要動態擷取。

說明

如果您要啟用相關許可權,那麼在接入 SDK 並調用 initWithOptions 初始化介面之前,確保您的 App 已經被授予了相關許可權。

android.permission.WRITE_EXTERNAL_STORAGE

否(推薦賦予)

android.permission.READ_EXTERNAL_STORAGE

否(推薦賦予)

依賴配置

  1. 下載 Android SDK(請聯絡商務經理擷取),並解壓。SDK 為 Android 標準的 .aar 包。

    說明
    • 單架構的 SO 檔案在 2M 左右。

    • FACE_GUARD SDK 為了保證自身的抗逆向性以及資料在網路傳輸過程中的安全性,SDK 中有大量的插花、膨脹及加解密操作,所以 SDK 體積會相對較大。

  2. 拷貝解壓後的 aar 檔案到工程的 libs 目錄下,並在 APP 的 build.gradle 中添加以下依賴關係:

    // FACE_GUARD SDK
    implementation(fileTree(dir: "libs", includes: ["*.aar"]))
    
    // 三方網路程式庫依賴
    implementation 'com.squareup.okhttp3:okhttp:3.11.0'
    implementation 'com.squareup.okio:okio:1.14.0
重要

三方網路程式庫不能省略,否則會造成FACE_GUARD SDK 無法連網。

介面混淆配置(重要)

如果您的工程使用了代碼混淆,請務必在App工程的proguard-rules.pro檔案中添加如下配置資訊,以防止介面被混淆處理後造成功能異常。

-keep class face.security.device.api.** {*;}
-dontwarn face.security.device.api.**

調用SDK

前期準備完成後,可按照下面三個步驟完成用戶端接入。

  1. 初始化(initWithOptions)

  2. 擷取用戶端 token(getDeviceToken)

  3. 攜帶token請求服務端

1. 初始化(initWithOptions)

SDK 內部初始化,在 App 啟動的時候,您需要儘可能早地調用該函數 。請參考接入流程,在[時機1]調用初始化 initWithOptions 介面。

  • 函數原型

    public void initWithOptions(Context ctx, 
                           String userProductKey,
                           Map<String, String> options,
                           FaceSecInitListener securityInitListener);
  • 參數說明

    • ctx:當前 Application Context,或 Activity Context。

    • userProductKey:用於標識使用者身份,阿里雲分配的產品 AppKey(不同於AK),請聯絡商務經理擷取。

      重要

      整合FACE_GUARD的應用,依賴業務側具備成熟的Face Service演算法和風險策略營運體系。建議您可以先和商務經理溝通評估業務情境匹配程度。

    • options:資訊採集可選項,預設可以為null。選擇性參數如下:

      說明
      • ID Verification用戶端內建裝置助手安全模組,為了滿足不同地區資料收集合規要求,提供了不同的資料上報地區。您可以基於使用者屬性不同,設定CustomUrl和CustomHost指定不同的上報網站。

        注意:一次應用會話生命週期內只能指定一個地區上報,且服務端查詢時地區需要和上報地區保持一致。

      • 指定網站上報:

        • 新加坡網站(預設)https://cloudauth-device.ap-southeast-1.aliyuncs.com

        • 印尼網站https://cloudauth-device.ap-southeast-5.aliyuncs.com

        • 美西(矽谷)https://cloudauth-device.us-west-1.aliyuncs.com

        • 德國(法蘭克福)https://cloudauth-device.eu-central-1.aliyuncs.com

        • 中國香港https://cloudauth-device.cn-hongkong.aliyuncs.com

      • 不同產品服務端支援的地區,參考:支援的地區

      欄位名

      說明

      樣本

      IPv6

      是否使用IPv6網域名稱上報裝置資訊:

      • 0(預設):否(使用IPv4網域名稱)

      • 1:是(使用IPv6網域名稱)

      "1"

      DataSwitch

      裝置資訊上報時機。

      • 0(預設):初始化時

      • 1:擷取Token時

      說明

      建議採用預設配置。

      "1"

      CustomUrl

      設定資料上報伺服器網域名稱。

      "https://cloudauth-device.ap-southeast-1.aliyuncs.com"

      CustomHost

      設定資料上報伺服器host。

      "cloudauth-device.ap-southeast-1.aliyuncs.com

    • securityInitListener:初始化回調監聽介面,可在回調中判斷初始化是否成功, 預設可以傳入null。其中,code 欄位取值範圍可參考code 傳回值

      securityInitListener定義

      public interface FaceSecInitListener {
          // code表示介面調用狀態代碼
          void onInitFinish(int code);
      }
  • 調用樣本

    public class CustomApplication extends Application {
        private static String USER_PRODUCT_KEY = "123e4567e89b12d3a45642661417****";
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            Map<String, String> options = new HashMap<>();
            options.put("IPv6", "0"); // 設定為IPv4
            options.put("DataSwitch", "0"); // 設定為初始化階段採集
            // options.put("DataType", String.valueOf(NO_EXTRA_DEVICE_DATA)); 設定合規採集
            // 設定自訂的資料上報地區
            // options.put("CustomUrl", "xxx"); 設定上報網站Url
            // options.put("CustomHost", "xxx"); 設定上報網站Host
    
            // 標準調用(推薦)
            FaceSecDevice.getInstance().initWithOptions(this, USER_PRODUCT_KEY, 
                                                        options, null);
    
            // 回調調用
            FaceSecDevice.getInstance().initWithOptions(this, USER_PRODUCT_KEY,
                                          options, new FaceSecInitListener() {
                  @Override
                  public void onInitFinish(int code) {
                      if (FaceSecCode.SC_SUCCESS != code) {
                          Log.d("AliyunFaceGuard", "初始化失敗");
                      } else {
                          Log.d("AliyunFaceGuard", "初始化成功");
                      }
                  }
              });
        }
    }

2. 擷取用戶端 tokengetDeviceToken

擷取用戶端 token,請參考接入流程[時機2]進行調用,並上報到業務自己的伺服器,後續通過伺服器端查詢FACE_GUARDFaceGuardRisk介面,從而擷取用戶端裝置風險識別資訊。

重要
  • 請參考接入流程進行接入,在[時機1]調用初始化 initWithOptions 介面,在[時機2]調用 getDeviceToken 介面;或確保 initWithOptions 介面和 getDeviceToken 介面調用時間間隔 3 秒以上。

  • 調用 getDeviceToken 時建議傳入 bizId,可以將本次 token 和業務唯一認證 ID 綁定,後在服務端查詢結果時將 ID 一起傳入,並確保用戶端傳入bizId和服務端傳入 ID 一致,可避免 Token 被篡改的風險。

  • 建議在 APP 子線程上調用 getDeviceToken 介面,以避免介面調用耗時可能導致的崩潰。

  • 函數原型

    public SecurityToken getDeviceToken() 
    // 推薦傳入bizId
    public SecurityToken getDeviceToken(String bizId)
  • 參數

    bizId:客戶的業務ID,可用於關聯業務ID和token。預設情況可以不傳。

  • 傳回值

    • FaceSecToken 類型,定義如下:

      public class FaceSecToken {
          // 介面調用狀態代碼
          public int code;
          
          // 用於伺服器端查詢結果的token字串。
          public String token;
      }
    • code:返回介面調用狀態代碼,可用於判斷介面調用是否成功。

      code傳回值

      FaceSecCode

      Code

      備忘

      SC_SUCCESS

      10000

      SDK初始化成功。

      SC_NOT_INIT

      10001

      SDK未初始化。

      SC_NOT_PERMISSION

      10002

      SDK需要的Android基礎許可權未完全授權。

      SC_UNKNOWN_ERROR

      10003

      系統未知錯誤。

      SC_NETWORK_ERROR

      10004

      網路錯誤。

      SC_NETWORK_ERROR_EMPTY

      10005

      網路錯誤,返回內容為空白串。

      SC_NETWORK_ERROR_INVALID

      10006

      網路返回的格式非法。

      SC_PARSE_SRV_CFG_ERROR

      10007

      服務端配置解析失敗。

      SC_NETWORK_RET_CODE_ERROR

      10008

      網關返回失敗。

      SC_APPKEY_EMPTY

      10009

      AppKey為空白。

      SC_PARAMS_ERROR

      10010

      其他參數錯誤。

      SC_FGKEY_ERROR

      10011

      密鑰計算錯誤。

      SC_APPKEY_ERROR

      10012

      APPKey 無效。

    • token:返回 token 字串資訊,商務就緒後續查詢阿里雲FACE_GUARD介面。

      重要

      token 字串在網路環境良好的情境下,長度為 600 位元組左右;在網路環境較差的情境下,返回的長度在 2.5K 左右,並且帶有特殊標識:

      • 有網:"U0dfTkxxxx"

      • 弱網:"U0dfUFxxxx"

      如果業務上出現了大量的長 token

      • 首先,請確保用戶端的網路是暢通的;

      • 其次,請參考接入流程進行接入,在[時機1]調用初始化 initWithOptions 介面,在[時機2]調用 getDeviceToken 介面;或確保 SDK 的 initWithOptions 介面和 getDeviceToken 介面調用間隔在 3 秒以上。

  • 調用樣本

    new Thread() {
        @Override
        public void run() {
            // 推薦傳入bizId,防止deviceToken被篡改。
            String bizId = "1234567890abcdef1234567890ab****";
            FaceSecToken deviceToken = FaceSecDevice.getInstance().getDeviceToken(bizId);
            if(null != deviceToken){
                if(FaceSecCode.SC_SUCCESS == deviceToken.code){
                    Log.d("AliyunFace", "token: " + deviceToken.token);
                } else {
                    Log.e("AliyunFace", "getDeviceToken error, code: " + deviceToken.code);
                }
            } else {
                Log.e("AliyunFace", "getDeviceToken is null.");
            }
        }
    }.start();

3. 攜帶token請求服務端

成功擷取deviceToken(FaceSecToken.token)後,可攜帶此參數請求商務服務器,由服務端查詢並校正結果。具體操作,請參見服務端API介面

完整程式碼範例

import face.security.device.api.FaceSecDevice;
import face.security.device.api.FaceSecInitListener;
import face.security.device.api.FaceSecToken;
import face.security.device.api.FaceSecCode;

public class MainActivity extends AppCompatActivity {
  private static String USER_PRODUCT_KEY = "<請聯絡商務經理擷取>";
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      doStantard();
  }

    private void doStantard() {
        // 初始化SDK
        // 在App生命週期中只需要調用1次
        // 建議在接入流程時機1調用initWithOptions介面
        doInit();

        // 此處等待3s僅類比人臉認證流程
        // try {
        //   Thread.sleep(2000);
        // } catch (InterruptedException e) {
        //   e.printStackTrace();
        // }

        // 建議在接入流程時機2調用getDeviceToken介面
        new Thread() {
            @Override
            public void run() {
                // 擷取token
                doGetToken();
            }
        }.start();
    }

    private void doInit() {
        Map<String, String> options = new HashMap<>();
        options.put("IPv6", "0"); // 設定為IPv4
        options.put("DataSwitch", "0"); // 設定為初始化階段採集
        // options.put("DataType", String.valueOf(NO_EXTRA_DEVICE_DATA)); 設定合規採集
        // 設定自訂的資料上報地區
        // options.put("CustomUrl", "xxx"); 設定上報網站Url
        // options.put("CustomHost", "xxx"); 設定上報網站Host
        FaceSecDevice.getInstance().initWithOptions(this, USER_PRODUCT_KEY, options, null);
    }

    private void doGetToken() {
        // 推薦傳入bizId,防止deviceToken被篡改。
        String bizId = "1234567890abcdef1234567890ab****";
        FaceSecToken deviceToken = FaceSecDevice.getInstance().getDeviceToken(bizId);
        if(null == deviceToken || FaceSecCode.SC_SUCCESS != deviceToken.code){
            Log.e("AliyunFaceGuard", "擷取token失敗, code: " + deviceToken.code);
        } else {
            Log.d("AliyunFaceGuard", "擷取token成功, token: " + deviceToken.token);
        }
    }
}