すべてのプロダクト
Search
ドキュメントセンター

ID Verification:Android 統合

最終更新日:Nov 09, 2025

このトピックでは、FACE_GUARD SDK for Android を統合する方法について説明します。

開始する前に

重要

FACE_GUARD を統合するアプリケーションには、成熟した顔認識アルゴリズムと脅威ポリシーを管理するシステムが必要です。ビジネスシナリオに適しているかどうかを評価するために、まずビジネス マネージャーに相談することをお勧めします。

Android SDK には次の制限があります。

  • エミュレーターモードでのデバッグはサポートされていません。

  • SDK は、Android 4.4 以降を実行するスマートフォンやタブレットなどのスマートモバイルデバイスにのみ統合できます。

  • arm、armv7、および arm64 アーキテクチャがサポートされています。

統合手順

準備

SDK を統合する前に、権限と依存関係を構成する必要があります。

権限

顔のなりすまし攻撃の検出を向上させるために、SDK には次の権限が必要です。

権限

必須

注意

android.permission.INTERNET

はい

SDK がインターネットに接続できることを保証します。

android.permission.ACCESS_NETWORK_STATE

はい

デバイスのネットワークステータス情報を取得するために使用されます。

android.permission.READ_PHONE_STATE

いいえ (推奨)

これらの権限は、Android 6.0 以降を実行するシステムで動的にリクエストする必要があります。

説明

これらの権限を有効にする場合は、SDK を統合して initWithOptions 初期化操作を呼び出す前に、アプリに権限が付与されていることを確認してください。

android.permission.WRITE_EXTERNAL_STORAGE

いいえ (推奨)

android.permission.READ_EXTERNAL_STORAGE

いいえ (推奨)

依存関係の構成

  1. 標準の Android .aar パッケージである Android SDK をダウンロードして解凍します。SDK を入手するには、ビジネス マネージャーにお問い合わせください。

    説明
    • 単一アーキテクチャの SO ファイルは約 2 MB です。

    • ネットワーク伝送中のリバースエンジニアリング対策機能とデータセキュリティを確保するために、FACE_GUARD SDK は複数の難読化、インフレーション、および暗号化/復号操作を実行します。これにより、SDK パッケージは比較的に大きくなります。

  2. 解凍した .aar ファイルをプロジェクトの libs ディレクトリにコピーします。次に、アプリの 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 はインターネットに接続できません。

難読化ルールの構成 (重要)

プロジェクトでコードの難読化を使用する場合は、アプリプロジェクトの proguard-rules.pro ファイルに次の構成を追加します。これにより、SDK 操作が難読化された場合に発生する可能性のある機能の異常を防ぐことができます。

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

SDK の呼び出し

準備が完了したら、次の 3 つのステップに従ってクライアントを統合します。

  1. SDK の初期化 (initWithOptions)

  2. クライアントトークンの取得 (getDeviceToken)

  3. トークンを使用してサーバーにリクエストを送信する

1. SDK の初期化 (initWithOptions)

この関数は、SDK の内部初期化を実行します。アプリケーションの起動時に、できるだけ早くこの関数を呼び出す必要があります。詳細については、「統合フロー」をご参照ください。[時点 1] で initWithOptions 初期化操作を呼び出します。

  • 関数プロトタイプ

    public void initWithOptions(Context ctx, 
                           String userProductKey,
                           Map<String, String> options,
                           FaceSecInitListener securityInitListener);
  • パラメーター

    • ctx: 現在の Application Context または Activity Context。

    • userProductKey: ユーザーを識別するために Alibaba Cloud によって割り当てられたプロダクトの AppKey。これは AccessKey (AK) とは異なります。AppKey を入手するには、ビジネス マネージャーにお問い合わせください。

      重要

      FACE_GUARD を統合するアプリケーションには、成熟した顔認識アルゴリズムと脅威ポリシーを管理するシステムが必要です。ビジネスシナリオに適しているかどうかを評価するために、まずビジネス マネージャーに相談することをお勧めします。

    • options: 情報収集のオプションパラメーターを指定します。このパラメーターはオプションです。オプションパラメーターは次のとおりです。

      説明
      • ID Verification クライアントには、Device Guard セキュリティモジュールが組み込まれています。さまざまなリージョンのデータ収集コンプライアンス要件を満たすために、さまざまなデータレポートサイトを提供します。ユーザー属性に基づいてレポートサイトを指定するために、CustomUrl と CustomHost を設定できます。

        注: 単一のアプリケーションセッションのライフサイクル内で指定できるレポートサイトは 1 つだけです。サーバークエリリージョンはレポートサイトと一致する必要があります。

      • レポートサイトの指定:

        • シンガポールサイト (デフォルト): 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: トークン取得時

      説明

      デフォルトの構成を使用することをお勧めします。

      "1"

      CustomUrl

      データレポートサーバーのドメイン名を設定します。

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

      CustomHost

      データレポートサーバーのホストを設定します。

      "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"); // レポートサイトのホストを設定します。
    
            // 標準呼び出し (推奨)
            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. クライアントトークンの取得 (getDeviceToken)

クライアントトークンを取得します。詳細については、「統合フロー」をご参照ください。[時点 2] でこの操作を呼び出し、トークンをビジネスサーバーにレポートします。次に、サーバーから FACE_GUARDFaceGuardRisk API 操作を呼び出して、クライアントからデバイスのリスク情報を取得します。

重要
  • 統合の詳細については、「統合プロセス」をご参照ください。initWithOptions 初期化インターフェイスは [タイミング 1] で、getDeviceToken インターフェイスは [タイミング 2] で呼び出すことができます。または、initWithOptionsgetDeviceToken インターフェイスの呼び出しの間隔が少なくとも 3 秒であることを確認することもできます。

  • getDeviceToken 操作を呼び出すときに、bizId パラメーターを渡して、トークンを一意のビジネス認証 ID にバインドします。サーバーで結果をクエリするときも、ID を渡す必要があります。クライアントによって渡された bizId がサーバーによって渡された ID と同じであることを確認してください。これにより、トークンの改ざんを防ぐことができます。

  • アプリケーションのサブスレッドで getDeviceToken 操作を呼び出します。これにより、長い操作呼び出し時間による潜在的なクラッシュを防ぐことができます。

  • 関数プロトタイプ

    public SecurityToken getDeviceToken() 
    // bizId を渡します。
    public SecurityToken getDeviceToken(String bizId)
  • パラメーター

    bizId: 顧客のビジネス ID。この ID を使用して、ビジネス ID をトークンに関連付けることができます。デフォルトでは、このパラメーターを渡す必要はありません。

  • 戻り値

    • FaceSecToken オブジェクト。定義は次のとおりです。

      public class FaceSecToken {
          // 操作呼び出しの状態コード。
          public int code;
          
          // サーバーで結果をクエリするために使用されるトークン文字列。
          public String token;
      }
    • code: 操作呼び出しの状態コード。このコードを使用して、呼び出しが成功したかどうかを判断できます。

      code の戻り値

      FaceSecCode

      コード

      注意

      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: トークン文字列。このトークンを使用して、ビジネス用の Alibaba Cloud FACE_GUARD API 操作を呼び出すことができます。

      重要

      token 文字列は、良好なネットワーク環境では約 600 バイトの長さです。ネットワーク環境が悪い場合、返される文字列は約 2.5 KB の長さで、特別な識別子があります。

      • 良好なネットワーク接続: "U0dfTkxxxx"

      • 悪いネットワーク接続: "U0dfUFxxxx"

      ビジネスで多くの長いトークンが生成される場合:

      • まず、クライアントが安定したネットワーク接続を持っていることを確認してください。

      • 次に、「統合フロー」に従います。[時点 1] で initWithOptions 初期化操作を呼び出し、[時点 2]getDeviceToken 操作を呼び出します。または、initWithOptionsgetDeviceToken 操作の呼び出しの間隔が少なくとも 3 秒であることを確認することもできます。

  • new Thread() {
        @Override
        public void run() {
            // deviceToken が改ざんされるのを防ぐために bizId を渡します。
            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. トークンを使用してサーバーにリクエストを送信する

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 を初期化します。
        // アプリのライフサイクルで一度だけこれを呼び出します。
        // 統合フローの時点 1 で initWithOptions 操作を呼び出します。
        doInit();

        // ここでの 3 秒間の待機は、顔認識プロセスをシミュレートするだけです。
        // try {
        //   Thread.sleep(2000);
        // } catch (InterruptedException e) {
        //   e.printStackTrace();
        // }

        // 統合フローの時点 2 で getDeviceToken 操作を呼び出します。
        new Thread() {
            @Override
            public void run() {
                // トークンを取得します。
                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"); // レポートサイトのホストを設定します。
        FaceSecDevice.getInstance().initWithOptions(this, USER_PRODUCT_KEY, options, null);
    }

    private void doGetToken() {
        // deviceToken が改ざんされるのを防ぐために bizId を渡します。
        String bizId = "1234567890abcdef1234567890ab****";
        FaceSecToken deviceToken = FaceSecDevice.getInstance().getDeviceToken(bizId);
        if(null == deviceToken || FaceSecCode.SC_SUCCESS != deviceToken.code){
            Log.e("AliyunFaceGuard", "トークンの取得に失敗しました。コード: " + deviceToken.code);
        } else {
            Log.d("AliyunFaceGuard", "トークンが取得されました。トークン: " + deviceToken.token);
        }
    }
}