下載實人認證Android SDK的ZIP壓縮包后,您可以參照本文內容將Android SDK集成到您的Android應用中。
背景信息
關于開發環境IDE,Android Studio是Google官方推出并集成了多個便捷的開發插件的Android開發平臺,本文將基于Android Studio(以下簡稱AS)介紹相關操作。關于Android Studio的更多信息,請參見Android Studio。
在工程中導入SDK
在控制臺成功上傳APK包后,您可以下載并獲取到一個名為阿里云認證SDK-ANDROID.zip
的ZIP壓縮包。
關于SDK包
解壓ZIP包后,您將看到一系列SDK相關的依賴包,下表介紹了這些SDK包、文件的說明。其中,xxx
表示版本號。
名稱 | 描述 |
---|---|
Sample/ |
可參考的Demo工程,打上TODO標簽的內容表示需要注意的點。 |
SDK包/rpsdk-xxx.aar |
活體、認證SDK。 |
SDK包/SecurityGuardSDK-external-xxx-xxx.aar |
安全加固依賴包。
說明 如果工程已集成阿里體系的其他產品(如阿里百川等)并含有該包,需判斷哪個版本較新,并使用較新的版本。
|
SDK包/SecurityBodySDK-external-xxx-xxx.aar |
安全加固依賴包。
說明 如果工程已集成阿里體系的其他產品(如阿里百川等)并含有該包,需判斷哪個版本較新,并使用較新的版本。
|
SDK包/MiddleTierSDK-external-xxx-xxx.aar |
安全加固依賴包。
說明 如果工程已集成阿里體系的其他產品(如阿里百川等)并含有該包,需判斷哪個版本較新,并使用較新的版本。
|
SDK包/jniLibs-libc++_shared.zip |
包含需要額外加入的SO公共依賴庫文件*libc++_shared.so* 。
Google官方建議存在多個SO時,在編譯生成C++ SO文件時選擇STL類型為c++_shared,保證擴展性。更多內容,請參見NDK編譯—C++ 庫支持。 RPSDK從3.2.0.0版本開始采用此種編譯方式。您也可在Android NDK(建議使用ndk-18)包、目錄(ndk-bundle)下的 |
SDK包/jniLibs-armeabi.zip |
為節省包體積,RPSDK從3.2.0.0版本開始已不再默認打入兼容armeabi的SO文件。
說明 ARM v5(對應ABI類型armeabi)已經是Android系統相當老舊的CPU架構版本。目前主流的版本是ARM v7(對應ABI類型armeabi-v7a),從Android
2.2開始支持。
如果您不需要考慮比之更低的版本,可忽略該ZIP文件。反之,或如果您應用的其他依賴包尚未提供兼容armeabi-v7a的支持包,必須要求armeabi,可在工程 |
libs
(已有則忽略),根據上述介紹將SDK包拷入工程的libs
目錄下。jniLibs.zip
壓縮包內容后,需要將內容拷至src/main/jniLibs
(默認JNI依賴SO文件目錄)下。src/main/jniLibs
并不是固定的,這和您定義的默認源集配置(sourceSets)有關。更多內容,請參見Google官方文檔更改默認源集配置。默認情況下,jni的SO庫文件在src/main/jniLibs
下。
在工程中集成SDK
當SDK在4.13.0及以上版本,SDK不再強制校驗應用的包名和簽名,且簽名圖片已經自動合并到rpsdk_xxx.aar中,所以建議您刪除存放在本地的yw_1222_*.jpg圖片(該建議主要針對集成4.13.0之前版本的用戶)。
基于包體積考慮,SDK在4.13.0及以上版本已經去除windvane、oss、okhttp等相關三方包依賴。所以客戶可以基于自己實際的業務選擇是否刪除相關依賴。
添加SDK包依賴
以直接在應用下進行集成為例,在應用module下的build.gradle
文件內,聲明flatDir
路徑(如果已有則忽略):
apply plugin: 'com.android.application'
repositories {
flatDir {
dirs '../libs'
}
}
以gradle版本大于等于3.0.0(非gradle tools版本,gradle版本可在gradle/wrapper/gradle-wrapper.properties
下查看)為例,在應用module下的build.gradle
文件內聲明SDK包依賴:
dependencies {
implementation fileTree(dir: '../libs', include: ['*.jar'])
implementation (name:'rpsdk-4.13.2', ext:'aar')
implementation (name:'SecurityGuardSDK-external-release-5.5.15071059', ext:'aar')
implementation (name:'SecurityBodySDK-external-release-5.5.15071314', ext:'aar')
implementation (name:'MiddleTierSDK-external-release-5.5.13874142', ext:'aar')
}
關于ABI類型
build.gradle
文件內,添加abiFilters
配置,示例: android {
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
}
關于簽名配置
實人認證SDK要求必須存在V1簽名,否則實人認證SDK無法正常工作。關于如何檢測APK是否存在V1簽名,請參考官方文檔檢查apk是否包含V1簽名。
v1SigningEnabled true
關于混淆配置
如果您的應用使用了ProGuard進行代碼混淆,為了保證實人認證服務需要的一些類不被混淆,需要在ProGuard配置文件中添加相關指令。
build.gradle
文件內,如果配置了proguardFiles
,并且啟用了minifyEnabled
,則表明已使用指定的配置文件(一般為proguard-rules.pro
)進行了代碼混淆,示例: android {
...
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
proguard-rules.pro
)中添加以下配置信息,保證實人認證服務需要的類不被混淆,示例:-keep class com.alibaba.security.**{*;}
-keep class com.taobao.dp.**{*;}
-keep class com.taobao.wireless.security.**{*;}
-keep class com.alibaba.wireless.security.**{*;}
-keep class android.taobao.windvane.**{*;}
-keep class android.webkit.JavascriptInterface
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@drawable/yw_1222_*, @layout/rp_*, @drawable/rp_*" />
目前暫未支持gradle plugin version為7.0及以上版本。
如果您想了解關于資源壓縮的更多內容,請參見Andriod官方文檔Shrink your app。其中,《壓縮資源》章節介紹了如何使用shrinkResources壓縮資源、配置keep.xml、自定義要保留的資源。更多內容,請參見壓縮資源。
關于權限配置
AndroidManifest.xml
中添加以下權限聲明(已有則忽略): <uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Sample示例工程
壓縮包內包含了可參考的樣例工程(目錄是Sample
)。打上TODO標簽的內容表示接入時需要注意的點。請您按照TODO標簽的注意點,修改您業務的包名、簽名和安全圖片后,加上token就可以正常運行該工程。
使用SDK
初始化
RPVerify
的初始化接口。示例: import android.app.Application;
import android.content.Context;
import com.alibaba.security.realidentity.RPVerify;
public class DemoApplication extends Application {
private Context appContext;
@Override
public void onCreate() {
super.onCreate();
appContext = this.getApplicationContext();
// 初始化實人認證SDK。
RPVerify.init(appContext);
}
}
上述寫法并不是必須的,您可以在調用RPVerify
其他接口前的任意位置調用初始化,但為了方便維護和管理,建議您按照示例操作。
調用實人認證
調用開始實人認證的接口前,需要您提前獲取verifyToken
(verifyToken
由您的服務端調用發起認證請求接口DescribeVerifyToken獲取),將其傳入接口。
RPVerify.start(DemoActivity.this, "", new RPEventListener() {
@Override
public void onFinish(RPResult auditResult, String code, String msg) {
if (auditResult == RPResult.AUDIT_PASS) {
// 認證通過。建議接入方調用實人認證服務端接口DescribeVerifyResult來獲取最終的認證狀態,并以此為準進行業務上的判斷和處理。
// do something
} else if (auditResult == RPResult.AUDIT_FAIL) {
// 認證不通過。建議接入方調用實人認證服務端接口DescribeVerifyResult來獲取最終的認證狀態,并以此為準進行業務上的判斷和處理。
// do something
} else if (auditResult == RPResult.AUDIT_NOT) {
// 未認證,具體原因可通過code來區分(code取值參見錯誤碼說明),通常是用戶主動退出或者姓名身份證號實名校驗不匹配等原因,導致未完成認證流程。
// do something
}
}
});
RPVerify.start
接口支持除RPMin外的所有認證方案,該接口會以加載H5的方式顯示頁面,如果您選擇的認證方案只包含活體檢測步驟,并對調起實人認證的速度有較高的要求,可以使用RPVerify.startByNative
接口: RPVerify.startByNative(DemoActivity.this, "", new RPEventListener() {
@Override
public void onFinish(RPResult auditResult, String code, String msg) {
Toast.makeText(DemoActivity.this, auditResult + "", Toast.LENGTH_SHORT).show();
if (auditResult == RPResult.AUDIT_PASS) {
// 認證通過。建議接入方調用實人認證服務端接口DescribeVerifyResult來獲取最終的認證狀態,并以此為準進行業務上的判斷和處理。
// do something
} else if (auditResult == RPResult.AUDIT_FAIL) {
// 認證不通過。建議接入方調用實人認證服務端接口DescribeVerifyResult來獲取最終的認證狀態,并以此為準進行業務上的判斷和處理。
// do something
} else if (auditResult == RPResult.AUDIT_NOT) {
// 未認證,具體原因可通過code來區分(code取值參見錯誤碼說明),通常是用戶主動退出或者姓名身份證號實名校驗不匹配等原因,導致未完成認證流程。
// do something
}
}
});
- code取值請參見錯誤碼說明。
startByNative
接口僅支持活體檢測認證方案(如RPBioOnly、FDBioOnly、FVBioOnly),包含身份證件拍攝等其他步驟的認證方案需要使用start
接口。
無論是start
接口還是startByNative
接口,在開始實人認證的接口中,verifyToken
參數由接入方的服務端調用實人認證服務的DescribeVerifyToken
接口獲得。
錯誤碼說明
auditResult | code | code釋義 |
---|---|---|
RPResult.AUDIT_PASS |
1 | 認證通過。 |
RPResult.AUDIT_FAIL |
2~12 | 表示認證不通過,具體原因可以調用DescribeVerifyResult接口,查看服務端的認證結果(接口文檔中認證狀態的表格說明)。 |
RPResult.AUDIT_NOT |
-1 | 未完成認證。原因:用戶在認證過程中,主動退出。 |
-2 | 未完成認證。原因:由網絡問題引起的客戶端認證異常。 | |
-10 | 未完成認證。原因:設備問題,如設備無攝像頭、無攝像頭權限、攝像頭初始化失敗、當前手機不支持端活體算法等。 | |
-20 | 未完成認證。原因:端活體算法異常,如算法初始化失敗、算法檢測失敗等。 | |
-30 | 未完成認證。原因:網絡問題導致的異常,如網絡鏈接錯誤、網絡請求失敗等。需要您檢查網絡并關閉代理。 | |
-40 | 未完成認證。原因:SDK異常,原因包括SDK初始化失敗、SDK調用參數為空、活體檢測被中斷(如電話打斷),重復認證等。 | |
-50 | 未完成認證。原因:用戶活體檢測失敗次數超過限制。 | |
-60 | 未完成認證。原因:手機的本地時間和網絡時間不同步。 | |
-10000 | 未完成認證。原因:客戶端發生未知錯誤。 | |
3001 | 未完成認證。原因:認證token無效或已過期。 | |
3101 | 未完成認證。原因:用戶姓名身份證實名校驗不匹配。 | |
3102 | 未完成認證。原因:實名校驗身份證號不存在。 | |
3103 | 未完成認證。原因:實名校驗身份證號不合法。 | |
3104 | 未完成認證。原因:認證已通過,重復提交。 | |
3203 | 未完成認證。原因:設備不支持刷臉。 | |
3204 | 未完成認證。原因:非本人操作。 | |
3206 | 未完成認證。原因:非本人操作。 | |
3208 | 未完成認證。原因:公安底照不存在。 |
UI定制
實人認證服務為您提供UI定制功能,您可以根據實際需要自定義實人認證頁面的按鈕顏色、文案顏色、文案字體大小和圖片資源等信息。UI定制功能僅適用于實人認證Android SDK版本在4.6.2版本及以上。更多內容,請參見UI定制。
// 設置UI自定義皮膚路徑。
public RPConfig.Builder setSkinPath(String path);
// 設置皮膚是否內置。
public RPConfig.Builder setSkinInAssets(boolean b);
自定義配置
- 設置可配置項
可通過RPConfig.Builder創建一個RPConfig類實例。
// 退出彈框是否需要確認。 public RPConfig.Builder setShouldAlertOnExit(boolean shouldAlertOnExit); // 轉場動畫。 public RPConfig.Builder setTransitionMode(TransitionMode transitionMode); // 是否需要聲音。 public RPConfig.Builder setNeedSound(boolean needSound);
- 傳入配置項
可通過初始化接口設置你需要的UI樣式。
RPVerify.start(android.content.Context, String verifyToken, com.alibaba.security.realidentity.RPConfig config, RPEventListener listener)
常見問題
請參見Android集成常見問題。