本人確認を必要とするモバイルアプリには、ドキュメントスキャンと顔認識のための安全なオンデバイスフローが必要です。Android 用 ID Verification SDK は、install、getMetaInfo、および verify の 3 つのメソッドを通じてこれを提供します。これらのメソッドは、サーバーサイド API と連携して検証を完了します。
クイックスタート
次の例は、SDK を初期化し、検証セッションを開始するための最小限のコードを示しています。
// ステップ 1: SDK を初期化します (アプリの起動時に 1 回呼び出します)
IdentityPlatform.getInstance().install(context);
// ステップ 2: デバイスメタデータを収集し、サーバーに送信します
String metaInfo = IdentityPlatform.getMetaInfo(context);
// ステップ 3: サーバーが metaInfo を使用して Initialize API を呼び出します
// transactionId と protocol を返します
// ステップ 4: 検証を開始します
Map<String, String> extParams = new HashMap<>();
extParams.put(IdentityParams.PROTOCOL, protocol);
IdentityPlatform.getInstance().verify(transactionId, extParams,
new IdentityCallback() {
@Override
public boolean response(final IdentityResponse response) {
if (IdentityResponseCode.IDENTITY_SUCCESS == response.code) {
// 仮合格 -- CheckResult API で確認します
} else {
// エラーまたは失敗を処理します
}
return true;
}
});完全な動作例については、Android デモプロジェクト をダウンロードしてください。
前提条件
開始する前に、以下を確認してください。
Android 4.3 (API レベル 18) 以降をターゲットとするアプリ
ARM ベースのデバイス (x86 はサポートされていません)
サーバーサイドの Initialize API を呼び出して取得した
transactionId
必要な権限
| 権限 | 必須 | 説明 |
|---|---|---|
android.permission.INTERNET | はい | SDK 通信のためのネットワークアクセス |
android.permission.ACCESS_NETWORK_STATE | いいえ (推奨) | ネットワークステータスを検出します |
android.permission.CAMERA | はい | 顔スキャンのためのカメラアクセス。Android 6.0 以降での実行時権限。 |
SDK のダウンロードとセットアップ
Android SDK をダウンロードします。パッケージには AAR (Android Archive) ファイルが含まれています。
パッケージを解凍し、すべての AAR ファイルをプロジェクトの
libsディレクトリにコピーします。次の依存関係を
build.gradleファイルに追加します。xxxを実際の SDK バージョン番号に置き換えてください。リストされているすべてのサードパーティの依存関係は必須です。dependencies { // [必須] コアモジュール implementation files('libs/idv-identityplatform-xxx.aar') implementation files('libs/idv-identityface-xxx.aar') implementation files('libs/idv-identitycrypto-xxx.aar') implementation files('libs/idv-identitybase-sdk-xxx.aar') implementation files('libs/idv-identityservice-sdk-xxx.aar') implementation files('libs/idv-identityblink-sdk-xxx.intl.aar') implementation files('libs/idv-identitymnn-xxx.aar') implementation files('libs/tygerservice-xxx.aar') implementation files('libs/Android-AliyunFaceGuard-xxx.aar') // [eKYC に必須] OCR モジュール implementation files('libs/idv-identityocr-xxx.aar') // [オプション] 自動 OCR スキャン implementation files('libs/idv-identityocrservice-xxx.aar') // [オプション] 顔の品質とオクルージョン検出 implementation files('libs/idv-identityquality-sdk-xxx.aar') // [オプション] NFC ドキュメント読み取り implementation files('libs/IDOCR_PubSDK_Android-1.0.0.aar') implementation files('libs/idv-identitynfc-xxx.intl.aar') // または、すべての AAR ファイルを一度に追加します (すべてのオプションモジュールが含まれます): // implementation fileTree(dir: "libs", includes: ["*.aar"]) // サードパーティの依存関係 implementation "androidx.appcompat:appcompat:1.5.0" implementation "androidx.activity:activity:1.7.0" implementation "androidx.recyclerview:recyclerview:1.0.0" implementation 'com.squareup.okhttp3:okhttp:4.9.3' implementation 'com.squareup.okio:okio:2.8.0' implementation 'com.aliyun.dpa:oss-android-sdk:2.9.21' implementation 'com.alibaba:fastjson:1.1.72.android' }
統合ワークフロー
SDK は、IdentityPlatform クラスを通じて 3 つのメソッド (install、getMetaInfo、および verify) を公開しています。
1. install() SDK を初期化します
|
2. getMetaInfo() デバイスメタデータを収集し、サーバーに送信します
|
3. サーバーサイド MetaInfo を使用して Initialize API を呼び出し、transactionId と protocol を取得します
|
4. verify() transactionId を使用して検証を開始します
|
5. コールバック IdentityResponse の結果を処理しますSDK の初期化
アプリの起動時に install を 1 回呼び出します。これにより、SDK 環境と組み込みの Device Guard セキュリティモジュールがセットアップされます。
// 基本的な初期化
IdentityPlatform.getInstance().install(context);
// オプション付きの初期化
Map<String, String> options = new HashMap<>();
options.put("CustomUrl", "https://cloudauth-device.ap-southeast-1.aliyuncs.com");
options.put("CustomHost", "cloudauth-device.ap-southeast-1.aliyuncs.com");
IdentityPlatform.getInstance().install(context, options);メソッドシグネチャ:
public void install(Context context);
public void install(Context context, Map<String, String> options);オプションパラメーター:
| キー | 説明 | デフォルト | 例 |
|---|---|---|---|
IPv6 | デバイスデータレポートに IPv6 ドメインを使用します。"0" = IPv4、"1" = IPv6。 | "0" | "1" |
DataSwitch | デバイスデータをレポートするタイミング。"0" = 初期化時、"1" = トークン取得時。 | "0" | "1" |
CustomUrl | データレポートサーバー URL。 | シンガポールエンドポイント | "https://cloudauth-device.ap-southeast-1.aliyuncs.com" |
CustomHost | データレポートサーバーホスト。 | シンガポールエンドポイント | "cloudauth-device.ap-southeast-1.aliyuncs.com" |
アプリケーションセッションごとに設定できるレポートサイトは 1 つだけです。サーバークエリリージョンはレポートサイトと一致している必要があります。
利用可能なレポートサイト:
| リージョン | エンドポイント URL |
|---|---|
| シンガポール (デフォルト) | 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 |
サポートされているすべてのリージョンについては、「サポートされているリージョン」をご参照ください。
デバイスメタデータの収集
デバイス環境データを収集するには、getMetaInfo を呼び出します。返された JSON 文字列をサーバーに送信し、サーバーがそれをサーバーサイドの Initialize API に渡します。
String metaInfo = IdentityPlatform.getMetaInfo(context);
// metaInfo をサーバーに送信しますメソッドシグネチャ:
public static String getMetaInfo(Context context);戻り値: デバイスコンテキストを含む JSON 文字列:
{
"apdidToken": "",
"appName": "com.aliyun.identity.platform",
"appVersion": "1.0.1",
"bioMetaInfo": "5.1.0:11501568,4",
"deviceBrand": "xxx",
"deviceManufacturer": "xxx",
"deviceModel": "xxx",
"deviceType": "android",
"identityVer": "1.0.0",
"osVersion": "10",
"sdkVersion": "1.0.9"
}起動確認
サーバーが Initialize API を呼び出し、transactionId (およびオプションで protocol 値) を返した後、verify を呼び出して検証フローを開始します。
各 transactionId は単一使用です。verify を呼び出す前に、新しいものを取得してください。
Map<String, String> extParams = new HashMap<>();
extParams.put(IdentityParams.PROTOCOL, protocol);
IdentityPlatform.getInstance().verify(transactionId, extParams,
new IdentityCallback() {
@Override
public boolean response(final IdentityResponse response) {
if (IdentityResponseCode.IDENTITY_SUCCESS == response.code) {
// 仮合格 -- CheckResult API で確認します
} else {
// エラーまたは失敗を処理します
}
return true;
}
});メソッドシグネチャ:
public void verify(String transactionId, Map<String, String> extParams, IdentityCallback callback);パラメーター:
| 名前 | タイプ | 説明 |
|---|---|---|
transactionId | String | サーバーサイドの Initialize API からの一意の ID。単一使用。 |
extParams | Map<String, String> | UI カスタマイズと SDK の動作のための拡張パラメーター。カスタマイズが不要な場合は null を渡します。 |
callback | IdentityCallback | 検証結果を code と message を含む IdentityResponse として受け取ります。 |
コールバックインターフェース:
public class IdentityResponse {
public int code; // 結果コード (結果コード表を参照)
public String message; // 結果の説明
}
public interface IdentityCallback {
boolean response(IdentityResponse response);
}検証フローのカスタマイズ
SDK の動作をカスタマイズするには、これらのキーを extParams マップに渡します。
UI カスタマイズ
| キー | 説明 | デフォルト | 例 |
|---|---|---|---|
IdentityParams.OcrResultButtonColor | OCR 結果ページのボタンの色。 | -- | "#FF0000" |
IdentityParams.RoundProgressColor | 顔スキャン中の円の色。 | -- | "#FF0000" |
IdentityParams.CloseButtonLayout | 閉じるボタンの位置: "left" または "right"。 | "left" | "right" |
IdentityParams.WaterMark | OCR スキャン成功後に表示される透かしテキスト。 | -- | "SAMPLE" |
動作設定
| キー | 説明 | デフォルト | 範囲 |
|---|---|---|---|
IdentityParams.ShowAlbumIcon | OCR ステップでアルバムアップロードオプションを表示します。"1" = 表示、"0" = 非表示。 | "1" | "0" / "1" |
IdentityParams.ShowOcrResult | OCR 結果ページを表示します。"1" = 表示、"0" = 非表示。 | "1" | "0" / "1" |
IdentityParams.EditOcrResult | OCR 結果ページでの編集を許可します。"1" = 編集可能、"0" = 読み取り専用。 | "1" | "0" / "1" |
IdentityParams.MaxErrorTimes | 最大リトライ回数。 | "10" | 3--10 |
IdentityParams.CardOcrTimeOutPeriod | OCR ステップのタイムアウト (秒)。 | "20" | 20--60 |
IdentityParams.FaceVerifyTimeOutPeriod | 生体検知のタイムアウト (秒)。 | "20" | 20--60 |
IdentityParams.OcrResultTimeOutPeriod | OCR 結果ページが編集可能な期間 (秒)。 | 制限なし | カスタム |
IdentityParams.SdkLanguage | SDK 表示言語をオーバーライドします。デフォルトでは、SDK はデバイスのシステム言語を使用します。「Android および iOS SDK のカスタム言語」をご参照ください。 | デバイス言語 | "zh-Hans" |
プロトコル
| キー | 説明 | デフォルト |
|---|---|---|
IdentityParams.Protocol | サーバーサイドの Initialize API からの SDK プロトコルデータ。これを渡すことで、内部 API 呼び出しが減少し、ネットワークパフォーマンスが向上します。 | -- |
結果コード
IdentityResponse.code の値は、検証結果を示します。コード 1000 および 1001 のみが課金対象となります。
コード 1000 および 1001 は予備的な結果です。最終的な検証結果を取得するには、常にサーバーサイドの CheckResult API を呼び出してください。
課金対象の結果コード
| コード | 説明 | 操作 |
|---|---|---|
| 1000 | 検証成功 (仮合格)。 | 最終結果については CheckResult API を呼び出してください。 |
| 1001 | 検証に失敗した (予備)。 | 失敗理由については CheckResult API を呼び出してください。 |
非課金対象のエラーコード
| コード | 説明 | トラブルシューティング |
|---|---|---|
| 1002 | システムエラー。 | 検証をリトライしてください。 |
| 1003 | SDK の初期化に失敗しました。 | install() が verify() の前に呼び出されていることを確認してください。 |
| 1004 | カメラ権限エラー。 | カメラ権限を付与し、エラーが続く場合はアプリのキャッシュをクリアしてください。 |
| 1005 | ネットワークエラー。 | デバイスのネットワーク接続を確認してください。 |
| 1006 | ユーザーが検証フローを終了しました。 | 操作は不要です。 |
| 1007 | 無効な transactionId。 | [Initialize] API から新しい transactionId を取得します。 |
| 1009 | クライアントタイムスタンプエラー。 | デバイスの時刻を同期してください。 |
| 1011 | 誤ったドキュメントタイプが送信されました。 | ドキュメントタイプがフロー構成と一致していることを確認してください。 |
| 1012 | スキャンされたドキュメントに主要な情報が不足しているか、フォーマット検証に失敗しました。 | より良い照明で再スキャンするようユーザーに依頼してください。 |
| 1013 | 画像品質が低い。 | 明るい環境で写真を撮り直すようユーザーに依頼してください。 |
| 1014 | リトライ制限を超過しました。 | 新しい検証セッションを開始してください。 |
| 1015 | Android バージョンが低すぎます。 | デバイスは Android 4.3 以降を実行している必要があります。 |
| 1016 | カメラ権限が付与されていません。 | システム設定でカメラ権限を付与するようユーザーに促してください。 |
完全なコード例
public class MainActivity extends AppCompatActivity {
private String transactionId = "";
private String protocol = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ステップ 1: SDK を初期化します
IdentityPlatform.getInstance().install(MainActivity.this);
// ステップ 2: デバイスメタデータを収集します
String metaInfo = IdentityPlatform.getMetaInfo(MainActivity.this);
// ステップ 3: metaInfo をサーバーに送信します。
// サーバーが Initialize API を呼び出し、transactionId と protocol を返します。
// transactionId = getTransactionIdFromServer(metaInfo).transactionId;
// protocol = getTransactionIdFromServer(metaInfo).protocol;
// ステップ 4: 拡張パラメーターを設定します
Map<String, String> extParams = new HashMap<>();
extParams.put(IdentityParams.PROTOCOL, protocol);
extParams.put(IdentityParams.SdkLanguage, "en");
// ステップ 5: 検証を開始します
IdentityPlatform.getInstance().verify(transactionId, extParams,
new IdentityCallback() {
@Override
public boolean response(final IdentityResponse response) {
if (IdentityResponseCode.IDENTITY_SUCCESS == response.code) {
Toast.makeText(MainActivity.this,
"Verification passed", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this,
"Verification failed ([" + response.code + "] " +
response.message + ")",
Toast.LENGTH_LONG).show();
}
return true;
}
});
}
}transactionIdとprotocolの値はサーバーから取得する必要があります。コメントアウトされているgetTransactionIdFromServer()呼び出しを、実際のサーバー通信ロジックに置き換えてください。
ProGuard および R8 難読化ルール
プロジェクトでコードの縮小に ProGuard または R8 を使用している場合は、次のルールを ProGuard 設定ファイルに追加してください。
# ID Verification SDK コア
-verbose
-keep class com.idv.identity.platform.api.** {*;}
-keep class com.idv.identity.platform.log.** {*;}
-keep class com.idv.identity.util.IdentityUtils {*;}
-keep class com.idv.identity.ocr.IdentityOcrApi {*;}
-keep class com.idv.identity.platform.model.** {*;}
-keep class com.idv.identity.platform.config.** {*;}
-keep class com.idv.identity.face.IdentityFaceApi {*;}
# 顔検証と Device Guard
-keep class com.face.verify.intl.** {*;}
-keep class com.alibaba.fastjson.** {*;}
-keep class face.security.device.api.** {*;}
-keep class net.security.device.api.** {*;}
-keep class com.dtf.toyger.** { *; }
-dontwarn net.security.device.api.**
-dontwarn face.security.device.api.**
# 生体検知と品質検出
-keep class com.idv.identity.service.algorithm.** {*;}
-keep class com.idv.identity.base.algorithm.** {*;}
-keep class com.idv.identity.quality.QualityRouter {*;}
-keep class com.idv.identity.blink.BlinkRouter {*;}
-keep class com.idv.identity.service.IdentityFaceService {*;}
-keep class com.idv.identity.service.ocr.IdentityDocService {*;}
# OSS SDK
-keep class com.alibaba.sdk.android.oss.** { *; }
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**
# NFC (NFC モジュールがトリミングされている場合は削除)
-keep class com.idv.identity.nfc.IdentityNfcApi { *; }
-keep class org.jmrtd.** {*;}
-keep class net.sf.**{*;}
-keep class org.**{*;}
-keep class cn.**{*;}
# バンドルされた依存関係の警告を抑制
-dontwarn com.fasterxml.**
-dontwarn com.google.**
-dontwarn java.applet.Applet
-dontwarn java.awt.**
-dontwarn javax.**
-dontwarn org.**
-dontwarn retrofit2.**
-dontwarn springfox.documentation.spring.web.json.Json
# (オプション) リリースビルドでデバッグログを削除
-assumenosideeffects class android.util.Log {
public static *** d(...);
}モジュールのトリミング
アプリサイズを削減するために、オプションモジュールを削除します。
必須モジュール
| モジュール | 説明 | 合計サイズ | ARM64 | ARMv7 |
|---|---|---|---|---|
| idv-identitybase-sdk-[version].aar | ベースモジュール | 16.3 KB | -- | -- |
| idv-identityplatform-[version].aar | ベースモジュール | 140.9 KB | -- | -- |
| idv-identitycrypto-[version].aar | ベースモジュール | 508.1 KB | 295.3 KB | 212.8 KB |
| idv-identityface-[version].aar | 顔認識 UI | 173.58 KB | -- | -- |
| tygerservice-[version].aar | 顔認識エンジン | 2.6 MB | 1.67 MB | 1.4 MB |
| idv-identitymnn-[version].aar | 生体検知、顔の品質、および自動 OCR スキャンのためのベースコンポーネント | 1405.1 KB | 853 KB | 552.1 KB |
| idv-identityservice-sdk-[version].aar | 顔生体検知 | 969 KB | 729.8 KB | 514.8 KB |
| idv-identityblink-sdk-[version].intl.aar | まばたき検出 | 352 KB | -- | -- |
| Android-AliyunFaceGuard-[version].aar | Device Guard セキュリティモジュール | 2.315 MB | 1.330 MB | 1.015 MB |
トリミング可能なモジュール
| モジュール | 説明 | トリミングの影響 | 合計サイズ | ARM64 | ARMv7 |
|---|---|---|---|---|---|
| idv-identityquality-sdk-[version].aar | 顔の品質とオクルージョン検出 | 顔品質チェックが利用できなくなります。 | 271 KB | -- | -- |
| idv-identityocr-[version].aar | OCR モジュール | eKYC 検証のためにトリミングしないでください。 | 336.3 KB | -- | -- |
| idv-identityocrservice-[version].aar | 自動 OCR スキャン | 自動ドキュメントスキャンが利用できなくなります。 | 700.8 KB | 509.4 KB | 487 KB |
| IDOCR_PubSDK_Android-1.0.0.aar | NFC サービス | NFC ドキュメント読み取りが利用できなくなります。 | 5.2 MB | -- | -- |
| idv-identitynfc-[version].intl.aar | NFC ビジネスロジック | NFC ドキュメント読み取りが利用できなくなります。 | 172 KB | -- | -- |
NFC モジュール (IDOCR_PubSDK_Android-1.0.0.aarおよびidv-identitynfc-[version].intl.aar) は合計で 5 MB を超えます。検証フローで NFC ドキュメント読み取りが不要な場合は、これらを削除してください。