若无火山引擎销售人员与您对接,请点击此处申请试用,咨询问题请注明为身份认证。
请先参照开通服务页流程获得身份认证服务授权,再下载SDK包进行使用。
repositories { flatDir{ dirs 'libs' } } dependencies { //本地依赖 implementation(name:'BytedCertSdk-release', ext:'aar') //远程依赖 implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.10" implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.squareup.okhttp3:okhttp:3.4.1' implementation 'com.amazonaws:aws-android-sdk-s3:2.12.7' }
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA" />
-keep class com.bytedance.** {*;} #amazonaws s3 -keepnames class com.amazonaws.** -keepnames class com.amazon.** # Enums are not obfuscated correctly in combination with Gson -keepclassmembers enum * { *; } # Request handlers defined in request.handlers -keep class com.amazonaws.services.**.*Handler # The following are referenced but aren't required to run -dontwarn com.fasterxml.jackson.** # Android 6.0 release removes support for the Apache HTTP client -dontwarn org.apache.http.** # The SDK has several references of Apache HTTP client -dontwarn com.amazonaws.http.** -dontwarn com.amazonaws.metrics.**
本 Android SDK 基于 Java8 构建,支持的 minSDK 版本为 API 21。对于 minSDK 版本低于 API 26(不包括26)的 Android 应用,需额外进行如下设置才能正常运行
Gradle 6.1.1 或更高版本
Android Gradle 插件 4.0.0 或更高版本
在您的安卓应用模块(通常在 app 目录下)的 build.gradle 文件中,添加如下代码
android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
/** * @return BytedFaceLiveManager单例对象 */ public static BytedFaceLiveManager getInstance()
/** * @param context: Android上下文 * @param stsToken: 鉴权配置 使用临时密钥需要传入ststoken, 使用长期密钥时传null,强烈推荐使用临时密钥的方式,安全性更强 * @param accessKey: 密钥ak * @param secretAccessKey: 密钥sk * @return void */ public void setSignAccessKeySecretAccessKey(Context appContext, String stsToken, String accessKey, String secretAccessKey)
/** * @param tosInfo: tos配置,可空,当传空时,默认使用服务端端配置。 * @param callback: 视频上传callback, 注意:返回非主线程 * @return void */ public void configRecordeAndUploadParams(BytedCertTosInfo tosInfo, SDKCallBack.UploadVideoCallback callback)
Example:
BytedCertTosInfo bytedTosInfo = BytedCertTosInfo.createTosInfo("ak", "sk", "sts_token", "bucket", "tos-cn-beijing.volces.com", "cjq-test.tos-cn-beijing.volces.com"); BytedFaceLiveManager.getInstance().configRecordeAndUploadParams(bytedTosInfo, new SDKCallBack.UploadVideoCallback() { @Override public void onUploadFinsh(String bytedToken, final int errorCode, final String errorMsg, final String filePath) { bytedCertManager.executeInMainThread(new Runnable() { @Override public void run() { mUploadLog.setVisibility(View.VISIBLE); if (errorCode == 0) { mUploadLog.setText("上传视频成功:" + filePath); FileUtils.deleteFileByPath(filePath); }else { mUploadLog.setText(String.format("上传视频失败(%d): %s", errorCode, errorMsg)); } } }); } });
/** * @param context: Android上下文 * @param ocrCallback: ocr识别结果回调,详细参数见2.2 SDKCallBack.OcrCallback介绍 * @return void */ public void doOCRH5(Context context, SDKCallBack.OcrCallback ocrCallback)
Example :
BytedFaceLiveManager.getInstance().doOCRH5(mContext, new SDKCallBack.OcrCallback(){ @Override public void onOcrFinish(final int errorCode, final String errorMsg, final String identityCode, final String identityName) { runOnUiThread(new Runnable() { @Override public void run() { if (errorCode == 0) { Toast.makeText(mContext, "ocr识别成功, 姓名:" + identityName, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(mContext, "ocr识别失败, " + errorMsg, Toast.LENGTH_SHORT).show(); } } }); } });
/** * @param refSource: true为有源比对,false为无源比对 * @param params: 活体配置参数,具体取值如下: * idcard_name: 身份证名称, 有源比对为必传 * idcard_no: 身份证id,有源比对为必传 * motion_list:活体动作列表,以','隔开,例"0,1,2" //0:"眨眼",1:"张嘴",2:"点头",3:"摇头" * motion_count:需要的活体动作个数,从motion_list中选择motion_count个,需要小于等于 * motion_list中的个数 * liveness_timeout: 端上活体超时时长,可选范围: [5, 60],默认:10 * fixed_motion_list: 固定一定需要下发的动作列表, 取值同motion_list * max_liveness_trial: 端上动作活体最大尝试次数, 可选范围:[1, 100],默认:10 * @param callback: 返回token结果的callback,详细参数见2.4 SDKCallBack.BytedTokenCallback介绍 * @return void */ public void startBytedToken(boolean refSource, Map<String, String> params, SDKCallBack.BytedTokenCallback callback)
Example:
//无源比对 HashMap<String, String> params = new HashMap<>(); params.put("risk_motion_list", ""risk_motion_list":{"free":["0","1","2","3"],"low":["0","1","2","3"], "medium":["0","1","2","3"],"high":["0","1","2","3"]}"); params.put("risk_motion_count", ""risk_motion_count":"free":2,"low":2,"medium":3,"high":4}"); params.put("liveness_timeout", 10); params.put("risk_fixed_motion_list", ""risk_fixed_motion_list":{"free":["0","1","2","3"],"low":["0","1","2","3"], "medium":["0","1","2","3"],"high":["0","1","2","3"]}"); params.put("max_liveness_trial", mMaxLivenessTrial); //如果为有源比对的话,refSource为true。 BytedFaceLiveManager.getInstance().startBytedToken(false, params, new SDKCallBack.BytedTokenCallback() { @Override public void onBytedTokenFinish(int errorCode, String errorMsg, String bytedToken, String clientConfig) { if (errorCode == 0 && !bytedToken.isEmpty() && !clientConfig.isEmpty()) { mBytedToken = bytedToken; mClientConfig = clientConfig } } });
/** * 认证相关配置 * @param refSource: true为有源比对,false为无源比对 * @param textSpeech: 文本播报功能 默认值为false,表示不进行语音播报。 */ class CertConfig( boolean refSource, boolean textSpeech) /** * @param context: Android上下文 * @param certConfig: 认证相关配置 * @param bytedToken: 通过1.5的startBytedToken接口获取,或者通过服务端中TokenPro中获取。一般使用后者方式获取。 * @param clientConfig: 从startBytedToken获取,同时也可以使用服务端中TokenPro中返回的clientConfig * @param callback: 返回token结果的callback,详细参数见2.3 SDKCallBack.ResultCallback介绍 * @return void */ public void startFaceCert(Context context, CertConfig certConfig, String byteToken, String clientConfig, SDKCallBack.ResultCallback callback)
Example:
//有源比对 BytedFaceLiveManager.getInstance().startFaceCert(NativeFLN.this, new CertConfig(true, false), bytedToken, clientConfig, new SDKCallBack.ResultCallback(){ @Override public void onResultFinish(int errorCode, String errorMsg, JSONObject jsonData) { if (loadingDialog != null) { loadingDialog.dismiss(); } if (errorCode == 0) { Toast.makeText(mContext, "活体成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(mContext, "活体失败:" + errorMsg, Toast.LENGTH_SHORT).show(); } } });
/** * 认证相关配置 * @param refSource: true为有源比对,false为无源比对 * @param textSpeech: 文本播报功能 默认值为false,表示不进行语音播报。 */ class CertConfig( boolean refSource, boolean textSpeech) /** * @param context: Android上下文 * @param certConfig: 认证相关配置 * @param params: 活体配置参数,具体取值见3.params 活体配置参数介绍介绍 * @param callback: 返回token结果的callback,详细参数见2.3 SDKCallBack.ResultCallback介绍 * @return void */ public void beginAuthorizationWithParams(Context context, CertConfig certConfig, Map<String, String> params, SDKCallBack.ResultCallback callback)
Example:
HashMap<String, String> params = new HashMap<>(); params.put("motion_list", mMotionlist.getText().toString()); params.put("liveness_timeout", mLivenessTimeOut.getText().toString()); params.put("fixed_motion_list", mFixedmMotionlist.getText().toString()); params.put("max_liveness_trial", mMaxLivenessTrial.getText().toString()); BytedFaceLiveManager.getInstance().beginAuthorizationWithParams(WelcomeActivity.this, certConfig, params, new SDKCallBack.ResultCallback(){ @Override public void onResultFinish(int errorCode, String errorMsg, JSONObject jsonData) { if (errorCode == 0) { Toast.makeText(mContext, "活体成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(mContext, "活体成功失败:" + errorMsg, Toast.LENGTH_SHORT).show(); } } });
/** * @param title: 协议标题 * @param linker: 协议链接SDKCallBack.ResultCallback介绍 * @return void */ public void setUserProtocol(String title, String linker)
public ThemeConfig getThemeConfig()
public interface ThemeConfig { //活体页面进度条进度颜色 void setFaceLiveProgressColor(int faceLiveProgressColor); // 活体页面进度条背景色 void setFaceLiveProgressBgColor(int color); //活体页面进度条的宽度, 传px void setFaceLiveProgressWidth(float width); //活体页面进度条和圆中间的缝隙, 传px void setFaceLiveProgressGap(float gap); //活体页面背景颜色 void setFaceLiveScreenBgColor(int color); //活体页面文字颜色 void setFaceLiveTextColor(int color); //活体页面文字大小 void setFaceLiveTextSize(float size); //活体页面返回按钮图片,没有设置则使用默认图片 void setFaceLiveBackImage(Drawable image); //设置是否使用引导页, true使用,false不使用 void setUseGuidePage(Boolean bUseGuidePage); //设置引导页用户协议,title为标题,linker为链接 void setGuidePageProtocol(String title, String linker); //设置引导页导航栏,showNav是否显示,navTitle导航栏标题 void setGuidePageProtocolNav(boolean showNav, String navTitle); //设置身份证页用户协议,title为标题,linker为链接 void setOcrPageProtocol(String title, String linker); //设置身份证页导航栏,showNav是否显示,navTitle导航栏标题 void setOcrPageProtocolNav(boolean showNav, String navTitle); //设置h5页面的样式,key-value格式,详细格式查看1.9.3(包括引导页以及身份证识别页面) void setH5PageStyle(Map<String, String> map); }
* 主题色 --theme: rgba(136, 91, 210, 1) --theme-btn_color: #fff * 遮罩背景色 --mask_bg-color: rgba(56, 0, 128, 0.4) * 引导页 --guide-btn_color: $theme-btn_color --guide-btn_bg-color: $theme --guide-sub-btn_color: $theme-btn_color --guide-sub-btn_bg-color: #2b2b2c --guide-protocol_color: $theme; * OCR上传身份证页面 --ocr-camera-icon_color: $theme-btn_color; --ocr-camera-icon_bg-color: $theme; --ocr-btn_color: $theme-btn_color; --ocr-btn_bg-color: $theme;
ThemeConfig themeConfig = BytedFaceLiveManager.getInstance().getThemeConfig(); //使用引导页 themeConfig.setUseGuidePage(true); //设置引导页用户协议 themeConfig.setGuidePageProtocol("自定义协议","https://www.baidu.com"); //设置倒计时背景色 themeConfig.setFaceLiveProgressBgColor(Color.parseColor("#E8E8E8")); //设置倒计时进度条颜色 themeConfig.setFaceLiveProgressColor(Color.parseColor("#2A90D7")); //设置引导页和身份证页面样式 HashMap<String, String> h5PageStyleMap = new HashMap<>(); h5PageStyleMap.put("--theme", "rgba(136, 91, 210, 1)"); h5PageStyleMap.put("--theme-btn_color", "#fff"); themeConfig.setH5PageStyle(h5PageStyle);
/** * @param SDKCallBack.RequestPermissionsCallback: 权限请求的回调函数 * @return void */ public void setRequestPermissionsCallback(SDKCallBack.RequestPermissionsCallback callback)
Example:
BytedFaceLiveManager.getInstance().setRequestPermissionsCallback(new SDKCallBack.RequestPermissionsCallback() { @Override public void requestPermissions(Activity content, String[] permissions, SDKCallBack.RequestPermissionsResultCallback resultCallback) { Toast.makeText(mContext, "自定义权限请求", Toast.LENGTH_SHORT).show(); PermissionUtils.checkPermissionAndStartFaceLive(content, new PermissionCallback() { @Override public void allow() { Toast.makeText(mContext, "自定义权限请求成功", Toast.LENGTH_SHORT).show(); resultCallback.allow(); } @Override public void deny() { Toast.makeText(mContext, "自定义权限请求拒绝", Toast.LENGTH_SHORT).show(); resultCallback.deny(); } }); } });
/** * onUploadFinsh参数 * @param bytedToken: 视频对应的bytedToken * @param errorCode: 错误码, 成功的话为0 * @param errorMsg: 错误信息 成功的话为"" * @param filePath: 录制的视频路径 失败的话为"" */ interface UploadVideoCallback { void onUploadFinsh(String bytedToken, int errorCode, String errorMsg, String filePath); }
/** * onOcrFinish参数 * @param errorCode 错误码 * @param errorMsg 错误信息 * @param identityCode 身份证id * @paramd entityName 姓名 */ interface OcrCallback { void onOcrFinish(int errorCode, String errorMsg, String identityCode, String identityName); }
返回数据jsonData的数据格式参考SDK返回内容说明中"服务端认证返回数据"章节的'jsonData'字段。
注意:这里已把jsonData字符串解析成了JSONObject格式
/** * onResultFinish * errorCode, 错误码 * errorMsg, 错误信息 * jsonData, 返回数据, 详细数据格式参考人脸核身服务端api的返回字段中的"resp_data" */ interface ResultCallback { void onResultFinish(int errorCode, String errorMsg, JSONObject jsonData); }
/** * onResultFinish参数 * @param errorCode 错误码 * @param errorMsg 错误信息 * @param bytedToken, 返回的bytenToken值 * @paramd client_config 客户端配置,原样传给startFaceCert即可 */ interface BytedTokenCallback { void onResultFinish(int errorCode, String errorMsg, String bytedToken, String client_config); }
//权限回调结果 interface RequestPermissionsResultCallback { //权限允许 void allow(); //权限拒绝 void deny(); } //权限回调 interface RequestPermissionsCallback { //content 上下文 //permissions 需要请求的权限 //resultCallback 请求结果回调 void requestPermissions(Activity content, String[] permissions, RequestPermissionsResultCallback resultCallback); }
key | 说明 |
---|---|
motion_list | 活体动作列表,以','隔开,例"0,1,2" //0:"眨眼",1:"张嘴",2:"点头",3:"摇头" |
motion_count | 需要的活体动作个数,从motion_list中选择motion_count个,需要小于等于 motion_list中的个数 |
liveness_timeout | 端上活体超时时长,可选范围: [5, 60],默认:10 |
fixed_motion_list | 固定一定需要下发的动作列表, 取值同motion_list |
max_liveness_trial | 端上动作活体最大尝试次数, 可选范围:[1, 100],默认:10 |
特别说明:50000+以上的为服务端透传的错误码,具体可以查看服务端错误码
错误代码 | 说明 |
---|---|
0 | 成功 |
-2 | 客户端上内部错误。一般出现在集成阶段,需检查logcat运行时的日志排查问题原因。 |
-4 | 您手动退出或因识别失败次数大于4次,导致客户端默认退出。 |
-1000 | 网络异常,请稍后再试 |
-1001 | 未知错误 |
-1002 | 活体中断 |
-1003 | 活体识别失败,请再试一次 |
-1004 | 算法初始化失败 |
-1005 | 活体参数设置失败 |
-1006 | 用户取消操作 |
-1007 | 用户取消证件识别 |
-1101 | 超过活体最大次数 |
-3001 | 网络数据包解析失败 |
-3002 | 请退出多屏模式,再重试一次 |
-3003 | 无法使用相机,请检查是否打开相机权限 |
-3006 | 相册图片获取失败 |
-3007 | 拍照失败 |
-5021 | 比对失败,请确认是本人 |
50000+ | 50000以上错误码,为透传服务端的错误码,请参考人脸核身服务端api的错误码说明 |