From 542c054c6904021e067364914fbf6b3947c5039b Mon Sep 17 00:00:00 2001
From: weimingfei <fei_gaming@sina.com>
Date: 星期一, 15 十二月 2025 15:33:48 +0800
Subject: [PATCH] 指纹钥匙柜

---
 keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java |  966 ++++++++++++++++++++++++++-----------------------------
 1 files changed, 457 insertions(+), 509 deletions(-)

diff --git a/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java b/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
index fe9db72..3470c05 100644
--- a/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
+++ b/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
@@ -565,78 +565,80 @@
 
                     @Override
                     public void run() {
+                        try {
+                            // 鑾峰彇BDFaceCheckConfig閰嶇疆淇℃伅
+                            if (bdFaceCheckConfig == null) {
 
-                        // 鑾峰彇BDFaceCheckConfig閰嶇疆淇℃伅
-                        if (bdFaceCheckConfig == null) {
+                                return;
+                            }
+                            onDetect(
+                                    bdFaceCheckConfig,
+                                    rgbInstance,
+                                    fastFaceInfos,
+                                    livenessModel,
+                                    new DetectListener() {
 
-                            return;
-                        }
-                        onDetect(
-                            bdFaceCheckConfig,
-                            rgbInstance,
-                            fastFaceInfos,
-                            livenessModel,
-                            new DetectListener() {
+                                        @Override
+                                        public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
 
-                                @Override
-                                public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
+                                            try {
 
-                                    // 浜鸿劯id璧嬪��
-                                    if (mLastFaceId != fastFaceInfos[0].faceID) {
-                                        mLastFaceId = fastFaceInfos[0].faceID;
-                                        mRgbLiveList.clear();
-                                        mNirLiveList.clear();
-                                    }
+                                                // 浜鸿劯id璧嬪��
+                                                if (mLastFaceId != fastFaceInfos[0].faceID) {
+                                                    mLastFaceId = fastFaceInfos[0].faceID;
+                                                    mRgbLiveList.clear();
+                                                    mNirLiveList.clear();
+                                                }
 
-                                    if (bdFaceCheckConfig == null) {
+                                                if (bdFaceCheckConfig == null) {
 
-                                        livenessModel.clearIdentifyResults();
-                                        if (faceDetectCallBack != null) {
-                                            faceDetectCallBack.onFaceDetectCallback(livenessModel);
-                                        }
-                                        return;
-                                    }
+                                                    livenessModel.clearIdentifyResults();
+                                                    if (faceDetectCallBack != null) {
+                                                        faceDetectCallBack.onFaceDetectCallback(livenessModel);
+                                                    }
+                                                    return;
+                                                }
 
-                                    // 鏈�浼樹汉鑴告帶鍒�
-                                    if (!onBestImageCheck(livenessModel, bdFaceCheckConfig, faceDetectCallBack)) {
-                                        livenessModel.setQualityCheck(true);
-                                        livenessModel.clearIdentifyResults();
+                                                // 鏈�浼樹汉鑴告帶鍒�
+                                                if (!onBestImageCheck(livenessModel, bdFaceCheckConfig, faceDetectCallBack)) {
+                                                    livenessModel.setQualityCheck(true);
+                                                    livenessModel.clearIdentifyResults();
 
-                                        if (faceDetectCallBack != null) {
-                                            faceDetectCallBack.onFaceDetectCallback(livenessModel);
-                                        }
-                                        return;
-                                    }
+                                                    if (faceDetectCallBack != null) {
+                                                        faceDetectCallBack.onFaceDetectCallback(livenessModel);
+                                                    }
+                                                    return;
+                                                }
 
-                                    // 璐ㄩ噺妫�娴嬫湭閫氳繃,閿�姣丅DFaceImageInstance锛岀粨鏉熷嚱鏁�
+                                                // 璐ㄩ噺妫�娴嬫湭閫氳繃,閿�姣丅DFaceImageInstance锛岀粨鏉熷嚱鏁�
 
-                                    if (!onQualityCheck(
-                                            faceInfos, bdFaceCheckConfig.bdQualityConfig, faceDetectCallBack)) {
-                                        livenessModel.setQualityCheck(true);
-                                        livenessModel.clearIdentifyResults();
+                                                if (!onQualityCheck(
+                                                        faceInfos, bdFaceCheckConfig.bdQualityConfig, faceDetectCallBack)) {
+                                                    livenessModel.setQualityCheck(true);
+                                                    livenessModel.clearIdentifyResults();
 
-                                        if (faceDetectCallBack != null) {
-                                            faceDetectCallBack.onFaceDetectCallback(livenessModel);
-                                        }
-                                        return;
-                                    }
+                                                    if (faceDetectCallBack != null) {
+                                                        faceDetectCallBack.onFaceDetectCallback(livenessModel);
+                                                    }
+                                                    return;
+                                                }
 
-                                    livenessModel.setQualityCheck(false);
-                                    // 鑾峰彇LivenessConfig liveCheckMode 閰嶇疆閫夐」锛氥�愪笉浣跨敤娲讳綋锛�0銆戯紱銆怰GB娲讳綋锛�1銆戯紱銆怰GB+NIR娲讳綋锛�2銆戯紱銆怰GB+Depth娲讳綋锛�3銆戯紱銆怰GB+NIR+Depth娲讳綋锛�4銆�
-                                    // TODO 娲讳綋妫�娴�
-                                    float[] rgbScores = {-1};
-                                    BDLiveConfig bdLiveConfig = bdFaceCheckConfig.bdLiveConfig;
-                                    boolean isLiveCheck = bdFaceCheckConfig.bdLiveConfig != null;
+                                                livenessModel.setQualityCheck(false);
+                                                // 鑾峰彇LivenessConfig liveCheckMode 閰嶇疆閫夐」锛氥�愪笉浣跨敤娲讳綋锛�0銆戯紱銆怰GB娲讳綋锛�1銆戯紱銆怰GB+NIR娲讳綋锛�2銆戯紱銆怰GB+Depth娲讳綋锛�3銆戯紱銆怰GB+NIR+Depth娲讳綋锛�4銆�
+                                                // TODO 娲讳綋妫�娴�
+                                                float[] rgbScores = {-1};
+                                                BDLiveConfig bdLiveConfig = bdFaceCheckConfig.bdLiveConfig;
+                                                boolean isLiveCheck = bdFaceCheckConfig.bdLiveConfig != null;
 
-                                    if (isLiveCheck) {
-                                        long startRgbTime = System.currentTimeMillis();
-                                        rgbScores =
-                                            silentLives(
-                                                rgbInstance,
-                                                BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_RGB,
-                                                faceInfos,
-                                                mRgbLiveList,
-                                                bdLiveConfig.rgbLiveScore);
+                                                if (isLiveCheck) {
+                                                    long startRgbTime = System.currentTimeMillis();
+                                                    rgbScores =
+                                                            silentLives(
+                                                                    rgbInstance,
+                                                                    BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_RGB,
+                                                                    faceInfos,
+                                                                    mRgbLiveList,
+                                                                    bdLiveConfig.rgbLiveScore);
                                         /* if (rgbScores != null){
                                             int size = rgbScores.length;
                                             Log.d("Attend", "score size:" + size);
@@ -645,220 +647,230 @@
                                             }
                                         } */
 
-                                        if (faceInfos.length == 1) {
-                                            livenessModel.setRgbLivenessScore(rgbScores[0]);
-                                        }
-                                        livenessModel.setRgbLivenessScores(rgbScores);
-                                        livenessModel.setRgbLivenessDuration(System.currentTimeMillis() - startRgbTime);
-                                    }
-
-                                    // TODO nir娲讳綋妫�娴�
-                                    float nirScore = -1;
-                                    FaceInfo[] faceInfosIr = null;
-                                    BDFaceImageInstance nirInstance = null;
-                                    boolean isHaveNirImage = nirBDFaceImageConfig != null && isLiveCheck;
-                                    if (isHaveNirImage) {
-                                        // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁YUV-IR锛岃浆涓虹畻娉曟娴嬬殑鍥剧墖BGR
-                                        // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝鎵嬫満鍜屽紑鍙戠増闇�瑕佸姩鎬侀�傞厤
-                                        long nirInstanceTime = System.currentTimeMillis();
-                                        nirInstance = getBdImage(nirBDFaceImageConfig, false);
-
-                                        livenessModel.setBdNirFaceImageInstance(nirInstance.getImage());
-                                        livenessModel.setNirInstanceTime(System.currentTimeMillis() - nirInstanceTime);
-
-                                        // 閬垮厤RGB妫�娴嬪叧閿偣鍦↖R瀵归綈娲讳綋绋冲畾锛屽鍔犵孩澶栨娴�
-                                        long startIrDetectTime = System.currentTimeMillis();
-                                        BDFaceDetectListConf bdFaceDetectListConf = new BDFaceDetectListConf();
-                                        bdFaceDetectListConf.usingDetect = true;
-                                        faceInfosIr =
-                                            faceModel
-                                                .getFaceNirDetect()
-                                                .detect(
-                                                    BDFaceSDKCommon.DetectType.DETECT_NIR,
-                                                    BDFaceSDKCommon.AlignType.BDFACE_ALIGN_TYPE_NIR_ACCURATE,
-                                                    nirInstance,
-                                                    null,
-                                                    bdFaceDetectListConf);
-                                        livenessModel.setIrLivenessDuration(
-                                            System.currentTimeMillis() - startIrDetectTime);
-                                        //                    LogUtils.e(TIME_TAG, "detect ir time = " + livenessModel.getIrLivenessDuration());
-                                        if (faceInfosIr != null && faceInfosIr.length > 0) {
-                                            FaceInfo faceInfoIr = faceInfosIr[0];
-                                            nirScore =
-                                                silentLive(
-                                                    nirInstance,
-                                                    BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_NIR,
-                                                    faceInfoIr.landmarks,
-                                                    mNirLiveList,
-                                                    bdLiveConfig.nirLiveScore);
-                                            livenessModel.setIrLivenessScore(nirScore);
-                                            //                        LogUtils.e(TIME_TAG, "live ir time = " + livenessModel.getIrLivenessDuration());
-                                        }
-                                    }
-
-                                    // TODO depth娲讳綋妫�娴�
-                                    float depthScore = -1;
-                                    boolean isHaveDepthImage = depthBDFaceImageConfig != null && isLiveCheck;
-                                    if (depthBDFaceImageConfig != null) {
-                                        // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝閫傞厤Atlas 闀滃ご锛岀洰鍓嶅鍜岄珮400*640锛屽叾浠栨憚鍍忓ご闇�瑕佸姩鎬佽皟鏁�,浜鸿劯72 涓叧閿偣x 鍧愭爣鍚戝乏绉诲姩80涓儚绱犵偣
-                                        float[] depthLandmark = new float[faceInfos[0].landmarks.length];
-                                        BDFaceImageInstance depthInstance;
-                                        if (bdFaceCheckConfig.cameraType == 1) {
-                                            System.arraycopy(
-                                                faceInfos[0].landmarks,
-                                                0,
-                                                depthLandmark,
-                                                0,
-                                                faceInfos[0].landmarks.length);
-                                            for (int i = 0; i < 144; i = i + 2) {
-                                                depthLandmark[i] -= 80;
-                                            }
-                                        } else {
-                                            depthLandmark = faceInfos[0].landmarks;
-                                        }
-                                        depthInstance = getBdImage(depthBDFaceImageConfig, false);
-                                        livenessModel.setBdDepthFaceImageInstance(depthInstance.getImage());
-                                        // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁Depth
-                                        long startDepthTime = System.currentTimeMillis();
-                                        depthScore =
-                                            faceModel
-                                                .getFaceLive()
-                                                .silentLive(
-                                                    BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_DEPTH,
-                                                    depthInstance,
-                                                    depthLandmark);
-                                        livenessModel.setDepthLivenessScore(depthScore);
-                                        livenessModel.setDepthtLivenessDuration(
-                                            System.currentTimeMillis() - startDepthTime);
-                                        //                    LogUtils.e(TIME_TAG, "live depth time = " + livenessModel.getDepthtLivenessDuration());
-                                        depthInstance.destory();
-                                    }
-
-                                    boolean isRgbScoreCheck = false;
-                                    boolean isNirScoreCheck = false;
-                                    boolean isDepthScoreCheck = false;
-                                    if (isLiveCheck) {
-                                        int size = rgbScores.length;
-                                        for (int i = 0; i < size; i++) {
-                                            if (rgbScores[i] > bdLiveConfig.rgbLiveScore) {
-                                                isRgbScoreCheck = true;
-                                            }
-                                        }
-                                        // isRgbScoreCheck = true; // liujinhui for test
-                                        //   isRgbScoreCheck = (rgbScores[0] > bdLiveConfig.rgbLiveScore);
-                                        isNirScoreCheck =
-                                            (isHaveNirImage ? nirScore > bdLiveConfig.nirLiveScore : true);
-                                        isDepthScoreCheck =
-                                            (isHaveDepthImage ? depthScore > bdLiveConfig.depthLiveScore : true);
-                                    }
-
-                                    // 濡傛灉璁剧疆涓轰笉杩涜娲讳綋妫�娴�
-                                    int liveCheckMode = livenessModel.getLiveType();
-                                    if (liveCheckMode == 0){
-                                        isRgbScoreCheck = true;
-                                    }
-                                    // TODO 鐗瑰緛鎻愬彇+浜鸿劯妫�绱�
-                                    if (!isLiveCheck || (isRgbScoreCheck && isNirScoreCheck && isDepthScoreCheck)) {
-                                        if (livenessModel != null) {
-                                            livenessModel.clearIdentifyResults();
-                                            livenessModel.setUser(null);
-                                        }
-
-                                        synchronized (faceModel.getFaceSearch()) {
-                                            if (faceInfos != null) {
-                                                int size = faceInfos.length;
-
-                                                for (int i = 0; i < size; i++) {
-                                                    // 鐗瑰緛鎻愬彇
-                                                    // 妯$硦缁撴灉杩囨护,鎴村彛缃╂椂鍊欙紝涓嶈繘琛岃繃婊�
-                                                    if (!checkMouthMask) {
-                                                        float blur = faceInfos[i].bluriness;
-                                                        BDFaceOcclusion occlusion = faceInfos[i].occlusion;
-                                                        float leftEye = occlusion.leftEye;
-                                                        // "宸︾溂閬尅"
-                                                        float rightEye = occlusion.rightEye;
-                                                        // "鍙崇溂閬尅"
-                                                        float nose = occlusion.nose;
-                                                        // "榧诲瓙閬尅缃俊搴�"
-                                                        float mouth = occlusion.mouth;
-                                                        // "鍢村反閬尅缃俊搴�"
-                                                        float leftCheek = occlusion.leftCheek;
-                                                        // "宸﹁劯閬尅"
-                                                        float rightCheek = occlusion.rightCheek;
-                                                        // "鍙宠劯閬尅"
-                                                        float chin = occlusion.chin;
-                                                        // 鍔ㄦ�佸簳搴撻檺鍒�
-                                                        faceModel
-                                                                .getFaceSearch()
-                                                                .setNeedJoinDB(
-                                                                        selectQuality(
-                                                                                blur,
-                                                                                leftEye,
-                                                                                rightEye,
-                                                                                nose,
-                                                                                mouth,
-                                                                                leftCheek,
-                                                                                rightCheek,
-                                                                                chin));
+                                                    if (faceInfos.length == 1) {
+                                                        livenessModel.setRgbLivenessScore(rgbScores[0]);
                                                     }
-
-                                                    if (bdLiveConfig != null){
-                                                        onFeatureChecks(
-                                                                i,
-                                                                rgbInstance,
-                                                                bdFaceCheckConfig,
-                                                                faceInfos,
-                                                                faceInfosIr,
-                                                                nirInstance,
-                                                                livenessModel,
-                                                                bdFaceCheckConfig.secondFeature,
-                                                                bdFaceCheckConfig.featureCheckMode,
-                                                                bdFaceCheckConfig.activeModel,
-                                                                rgbScores,
-                                                                bdLiveConfig.rgbLiveScore);
-                                                    } else{
-                                                        onFeatureChecks(
-                                                                i,
-                                                                rgbInstance,
-                                                                bdFaceCheckConfig,
-                                                                faceInfos,
-                                                                faceInfosIr,
-                                                                nirInstance,
-                                                                livenessModel,
-                                                                bdFaceCheckConfig.secondFeature,
-                                                                bdFaceCheckConfig.featureCheckMode,
-                                                                bdFaceCheckConfig.activeModel,
-                                                                rgbScores,
-                                                                -1);
-                                                    }
-
+                                                    livenessModel.setRgbLivenessScores(rgbScores);
+                                                    livenessModel.setRgbLivenessDuration(System.currentTimeMillis() - startRgbTime);
                                                 }
+
+                                                // TODO nir娲讳綋妫�娴�
+                                                float nirScore = -1;
+                                                FaceInfo[] faceInfosIr = null;
+                                                BDFaceImageInstance nirInstance = null;
+                                                boolean isHaveNirImage = nirBDFaceImageConfig != null && isLiveCheck;
+                                                if (isHaveNirImage) {
+                                                    // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁YUV-IR锛岃浆涓虹畻娉曟娴嬬殑鍥剧墖BGR
+                                                    // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝鎵嬫満鍜屽紑鍙戠増闇�瑕佸姩鎬侀�傞厤
+                                                    long nirInstanceTime = System.currentTimeMillis();
+                                                    nirInstance = getBdImage(nirBDFaceImageConfig, false);
+
+                                                    livenessModel.setBdNirFaceImageInstance(nirInstance.getImage());
+                                                    livenessModel.setNirInstanceTime(System.currentTimeMillis() - nirInstanceTime);
+
+                                                    // 閬垮厤RGB妫�娴嬪叧閿偣鍦↖R瀵归綈娲讳綋绋冲畾锛屽鍔犵孩澶栨娴�
+                                                    long startIrDetectTime = System.currentTimeMillis();
+                                                    BDFaceDetectListConf bdFaceDetectListConf = new BDFaceDetectListConf();
+                                                    bdFaceDetectListConf.usingDetect = true;
+                                                    faceInfosIr =
+                                                            faceModel
+                                                                    .getFaceNirDetect()
+                                                                    .detect(
+                                                                            BDFaceSDKCommon.DetectType.DETECT_NIR,
+                                                                            BDFaceSDKCommon.AlignType.BDFACE_ALIGN_TYPE_NIR_ACCURATE,
+                                                                            nirInstance,
+                                                                            null,
+                                                                            bdFaceDetectListConf);
+                                                    livenessModel.setIrLivenessDuration(
+                                                            System.currentTimeMillis() - startIrDetectTime);
+                                                    //                    LogUtils.e(TIME_TAG, "detect ir time = " + livenessModel.getIrLivenessDuration());
+                                                    if (faceInfosIr != null && faceInfosIr.length > 0) {
+                                                        FaceInfo faceInfoIr = faceInfosIr[0];
+                                                        nirScore =
+                                                                silentLive(
+                                                                        nirInstance,
+                                                                        BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_NIR,
+                                                                        faceInfoIr.landmarks,
+                                                                        mNirLiveList,
+                                                                        bdLiveConfig.nirLiveScore);
+                                                        livenessModel.setIrLivenessScore(nirScore);
+                                                        //                        LogUtils.e(TIME_TAG, "live ir time = " + livenessModel.getIrLivenessDuration());
+                                                    }
+                                                }
+
+                                                // TODO depth娲讳綋妫�娴�
+                                                float depthScore = -1;
+                                                boolean isHaveDepthImage = depthBDFaceImageConfig != null && isLiveCheck;
+                                                if (depthBDFaceImageConfig != null) {
+                                                    // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝閫傞厤Atlas 闀滃ご锛岀洰鍓嶅鍜岄珮400*640锛屽叾浠栨憚鍍忓ご闇�瑕佸姩鎬佽皟鏁�,浜鸿劯72 涓叧閿偣x 鍧愭爣鍚戝乏绉诲姩80涓儚绱犵偣
+                                                    float[] depthLandmark = new float[faceInfos[0].landmarks.length];
+                                                    BDFaceImageInstance depthInstance;
+                                                    if (bdFaceCheckConfig.cameraType == 1) {
+                                                        System.arraycopy(
+                                                                faceInfos[0].landmarks,
+                                                                0,
+                                                                depthLandmark,
+                                                                0,
+                                                                faceInfos[0].landmarks.length);
+                                                        for (int i = 0; i < 144; i = i + 2) {
+                                                            depthLandmark[i] -= 80;
+                                                        }
+                                                    } else {
+                                                        depthLandmark = faceInfos[0].landmarks;
+                                                    }
+                                                    depthInstance = getBdImage(depthBDFaceImageConfig, false);
+                                                    livenessModel.setBdDepthFaceImageInstance(depthInstance.getImage());
+                                                    // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁Depth
+                                                    long startDepthTime = System.currentTimeMillis();
+                                                    depthScore =
+                                                            faceModel
+                                                                    .getFaceLive()
+                                                                    .silentLive(
+                                                                            BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_DEPTH,
+                                                                            depthInstance,
+                                                                            depthLandmark);
+                                                    livenessModel.setDepthLivenessScore(depthScore);
+                                                    livenessModel.setDepthtLivenessDuration(
+                                                            System.currentTimeMillis() - startDepthTime);
+                                                    //                    LogUtils.e(TIME_TAG, "live depth time = " + livenessModel.getDepthtLivenessDuration());
+                                                    depthInstance.destory();
+                                                }
+
+                                                boolean isRgbScoreCheck = false;
+                                                boolean isNirScoreCheck = false;
+                                                boolean isDepthScoreCheck = false;
+                                                if (isLiveCheck) {
+                                                    int size = rgbScores.length;
+                                                    for (int i = 0; i < size; i++) {
+                                                        if (rgbScores[i] > bdLiveConfig.rgbLiveScore) {
+                                                            isRgbScoreCheck = true;
+                                                        }
+                                                    }
+                                                    // isRgbScoreCheck = true; // liujinhui for test
+                                                    //   isRgbScoreCheck = (rgbScores[0] > bdLiveConfig.rgbLiveScore);
+                                                    isNirScoreCheck =
+                                                            (isHaveNirImage ? nirScore > bdLiveConfig.nirLiveScore : true);
+                                                    isDepthScoreCheck =
+                                                            (isHaveDepthImage ? depthScore > bdLiveConfig.depthLiveScore : true);
+                                                }
+
+                                                // 濡傛灉璁剧疆涓轰笉杩涜娲讳綋妫�娴�
+                                                int liveCheckMode = livenessModel.getLiveType();
+                                                if (liveCheckMode == 0) {
+                                                    isRgbScoreCheck = true;
+                                                }
+                                                // TODO 鐗瑰緛鎻愬彇+浜鸿劯妫�绱�
+                                                if (!isLiveCheck || (isRgbScoreCheck && isNirScoreCheck && isDepthScoreCheck)) {
+                                                    if (livenessModel != null) {
+                                                        livenessModel.clearIdentifyResults();
+                                                        livenessModel.setUser(null);
+                                                    }
+
+                                                    synchronized (faceModel.getFaceSearch()) {
+                                                        if (faceInfos != null) {
+                                                            int size = faceInfos.length;
+
+                                                            for (int i = 0; i < size; i++) {
+                                                                // 鐗瑰緛鎻愬彇
+                                                                // 妯$硦缁撴灉杩囨护,鎴村彛缃╂椂鍊欙紝涓嶈繘琛岃繃婊�
+                                                                if (!checkMouthMask) {
+                                                                    float blur = faceInfos[i].bluriness;
+                                                                    BDFaceOcclusion occlusion = faceInfos[i].occlusion;
+                                                                    float leftEye = occlusion.leftEye;
+                                                                    // "宸︾溂閬尅"
+                                                                    float rightEye = occlusion.rightEye;
+                                                                    // "鍙崇溂閬尅"
+                                                                    float nose = occlusion.nose;
+                                                                    // "榧诲瓙閬尅缃俊搴�"
+                                                                    float mouth = occlusion.mouth;
+                                                                    // "鍢村反閬尅缃俊搴�"
+                                                                    float leftCheek = occlusion.leftCheek;
+                                                                    // "宸﹁劯閬尅"
+                                                                    float rightCheek = occlusion.rightCheek;
+                                                                    // "鍙宠劯閬尅"
+                                                                    float chin = occlusion.chin;
+                                                                    // 鍔ㄦ�佸簳搴撻檺鍒�
+                                                                    faceModel
+                                                                            .getFaceSearch()
+                                                                            .setNeedJoinDB(
+                                                                                    selectQuality(
+                                                                                            blur,
+                                                                                            leftEye,
+                                                                                            rightEye,
+                                                                                            nose,
+                                                                                            mouth,
+                                                                                            leftCheek,
+                                                                                            rightCheek,
+                                                                                            chin));
+                                                                }
+
+                                                                if (bdLiveConfig != null) {
+                                                                    onFeatureChecks(
+                                                                            i,
+                                                                            rgbInstance,
+                                                                            bdFaceCheckConfig,
+                                                                            faceInfos,
+                                                                            faceInfosIr,
+                                                                            nirInstance,
+                                                                            livenessModel,
+                                                                            bdFaceCheckConfig.secondFeature,
+                                                                            bdFaceCheckConfig.featureCheckMode,
+                                                                            bdFaceCheckConfig.activeModel,
+                                                                            rgbScores,
+                                                                            bdLiveConfig.rgbLiveScore);
+                                                                } else {
+                                                                    onFeatureChecks(
+                                                                            i,
+                                                                            rgbInstance,
+                                                                            bdFaceCheckConfig,
+                                                                            faceInfos,
+                                                                            faceInfosIr,
+                                                                            nirInstance,
+                                                                            livenessModel,
+                                                                            bdFaceCheckConfig.secondFeature,
+                                                                            bdFaceCheckConfig.featureCheckMode,
+                                                                            bdFaceCheckConfig.activeModel,
+                                                                            rgbScores,
+                                                                            -1);
+                                                                }
+
+                                                            }
+                                                        }
+                                                    }
+                                                }
+
+                                                // 娴佺▼缁撴潫,璁板綍鏈�缁堟椂闂�
+                                                livenessModel.setAllDetectDuration(System.currentTimeMillis() - startTime);
+                                                //                LogUtils.e(TIME_TAG, "all process time = " + livenessModel.getAllDetectDuration());
+                                                // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+
+                                                if (nirInstance != null) {
+                                                    nirInstance.destory();
+                                                }
+                                                // 鏄剧ず鏈�缁堢粨鏋滄彁绀�
+                                                if (faceDetectCallBack != null) {
+                                                    faceDetectCallBack.onFaceDetectCallback(livenessModel);
+                                                }
+                                            }catch (RuntimeException e){
+                                                faceDetectCallBack.onTip(1,e.getMessage());
+                                            }catch (Exception e){
+                                                faceDetectCallBack.onTip(1,e.getMessage());
                                             }
                                         }
-                                    }
 
-                                    // 娴佺▼缁撴潫,璁板綍鏈�缁堟椂闂�
-                                    livenessModel.setAllDetectDuration(System.currentTimeMillis() - startTime);
-                                    //                LogUtils.e(TIME_TAG, "all process time = " + livenessModel.getAllDetectDuration());
-                                    // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+                                        @Override
+                                        public void onDetectFail() {
 
-                                    if (nirInstance != null) {
-                                        nirInstance.destory();
-                                    }
-                                    // 鏄剧ず鏈�缁堢粨鏋滄彁绀�
-                                    if (faceDetectCallBack != null) {
-                                        faceDetectCallBack.onFaceDetectCallback(livenessModel);
-                                    }
-                                }
-
-                                @Override
-                                public void onDetectFail() {
-
-                                    if (faceDetectCallBack != null) {
-                                        faceDetectCallBack.onFaceDetectCallback(livenessModel);
-                                    }
-                                }
-                            });
+                                            if (faceDetectCallBack != null) {
+                                                faceDetectCallBack.onFaceDetectCallback(livenessModel);
+                                            }
+                                        }
+                                    });
+                        }catch (RuntimeException e){
+                            faceDetectCallBack.onTip(1,e.getMessage());
+                        }catch (Exception e){
+                            faceDetectCallBack.onTip(1,e.getMessage());
+                        }
                     }
                 });
     }
@@ -884,82 +896,6 @@
             }
         }
         return isBestImageCheck;
-    }
-
-    /**
-     * 鐗瑰緛鎻愬彇-浜鸿劯璇嗗埆姣斿
-     *
-     * @param rgbInstance      鍙鍏夊簳灞傞�佹瀵硅薄
-     * @param landmark         妫�娴嬬溂鐫涳紝鍢村反锛岄蓟瀛愶紝72涓叧閿偣
-     * @param faceInfos        nir浜鸿劯鏁版嵁
-     * @param nirInstance      nir 鍥惧儚鍙ユ焺
-     * @param livenessModel    妫�娴嬬粨鏋滄暟鎹泦鍚�
-     * @param featureCheckMode 鐗瑰緛鎶藉彇妯″紡銆愪笉鎻愬彇鐗瑰緛锛�1銆戯紱銆愭彁鍙栫壒寰侊細2銆戯紱銆愭彁鍙栫壒寰�+1锛歂妫�绱細3銆戯紱
-     * @param featureType      鐗瑰緛鎶藉彇妯℃�佹墽琛� 銆愮敓娲荤収锛�1銆戯紱銆愯瘉浠剁収锛�2銆戯紱銆愭贩鍚堟ā鎬侊細3銆戯紱
-     */
-    private void onFeatureCheck(
-        BDFaceImageInstance rgbInstance,
-        BDFaceCheckConfig bdFaceCheckConfig,
-        float[] landmark,
-        FaceInfo[] faceInfos,
-        BDFaceImageInstance nirInstance,
-        LivenessModel livenessModel,
-        byte[] secondFeature,
-        final int featureCheckMode,
-        final int featureType) {
-        // 濡傛灉涓嶆娊鍙栫壒寰侊紝鐩存帴杩斿洖
-        if (featureCheckMode == 1) {
-            return;
-        }
-        byte[] feature = new byte[512];
-        if (featureType == 3) {
-            // todo: 娣峰悎妯℃�佷娇鐢ㄦ柟寮忔槸鏍规嵁鍥剧墖鐨勬洕鍏夋潵閫夋嫨闇�瑕佷娇鐢ㄧ殑type锛屽厜鐓х殑鍙栧�艰寖鍥翠负锛�0~1涔嬮棿
-            AtomicInteger atomicInteger = new AtomicInteger();
-            FaceSDKManager.getInstance().getImageIllum().imageIllum(rgbInstance, atomicInteger);
-            int illumScore = atomicInteger.get();
-            BDQualityConfig bdQualityConfig = bdFaceCheckConfig.bdQualityConfig;
-            boolean isIllum = bdQualityConfig != null ? illumScore < bdQualityConfig.illum : false;
-            BDFaceSDKCommon.FeatureType type =
-                isIllum
-                    ? BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_NIR
-                    : BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO;
-            BDFaceImageInstance bdFaceImageInstance = isIllum ? nirInstance : rgbInstance;
-            float[] landmarks = isIllum ? faceInfos[0].landmarks : landmark;
-
-            long startFeatureTime = System.currentTimeMillis();
-            float featureSize = faceModel.getFaceFeature().feature(type, bdFaceImageInstance, landmarks, feature);
-            livenessModel.setFeatureDuration(System.currentTimeMillis() - startFeatureTime);
-            livenessModel.setFeature(feature);
-            // 浜鸿劯妫�绱�
-            featureSearch(
-                featureCheckMode,
-                livenessModel,
-                bdFaceCheckConfig,
-                feature,
-                secondFeature,
-                featureSize,
-                BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
-        } else {
-            // 鐢熸椿鐓ф绱�
-            long startFeatureTime = System.currentTimeMillis();
-            float featureSize =
-                faceModel
-                    .getFaceFeature()
-                    .feature(
-                        BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO, rgbInstance, landmark, feature);
-            livenessModel.setFeatureDuration(System.currentTimeMillis() - startFeatureTime);
-            livenessModel.setFeature(feature);
-            livenessModel.setFeatureDuration(System.currentTimeMillis() - startFeatureTime);
-            // 浜鸿劯妫�绱�
-            featureSearch(
-                featureCheckMode,
-                livenessModel,
-                bdFaceCheckConfig,
-                feature,
-                secondFeature,
-                featureSize,
-                BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
-        }
     }
 
     /**
@@ -1384,183 +1320,195 @@
 
                     @Override
                     public void run() {
-                        onDetect(
-                            bdFaceCheckConfig,
-                            rgbInstance,
-                            fastFaceInfos,
-                            livenessModel,
-                            new DetectListener() {
-                                @Override
-                                public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
-                                    // 浜鸿劯id璧嬪��
-                                    if (mLastFaceId != fastFaceInfos[0].faceID) {
-                                        mLastFaceId = fastFaceInfos[0].faceID;
-                                        mRgbLiveList.clear();
-                                        mNirLiveList.clear();
-                                    }
-                                    if (bdFaceCheckConfig == null) {
-
-                                        if (faceDetectCallBack != null) {
-                                            faceDetectCallBack.onFaceDetectCallback(livenessModel);
-                                        }
-                                        return;
-                                    }
-                                    // 鏈�浼樹汉鑴告帶鍒�
-                                    if (!onBestImageCheck(livenessModel, bdFaceCheckConfig, faceDetectCallBack)) {
-                                        livenessModel.setQualityCheck(true);
-
-                                        if (faceDetectCallBack != null) {
-                                            faceDetectCallBack.onFaceDetectCallback(livenessModel);
-                                        }
-                                        return;
-                                    }
-                                    onQualityCheck(
-                                        faceInfos,
-                                        bdFaceCheckConfig.bdQualityConfig,
-                                        faceDetectCallBack,
-                                        new QualityListener() {
-                                            @Override
-                                            public void onQualitySuccess() {
-                                                livenessModel.setQualityCheck(false);
-                                                // 鑾峰彇LivenessConfig liveCheckMode 閰嶇疆閫夐」锛氥�愪笉浣跨敤娲讳綋锛�0銆戯紱銆怰GB娲讳綋锛�1銆戯紱銆怰GB+NIR娲讳綋锛�2銆戯紱銆怰GB+Depth娲讳綋锛�3銆戯紱銆怰GB+NIR+Depth娲讳綋锛�4銆�
-                                                // TODO 娲讳綋妫�娴�
-                                                BDLiveConfig bdLiveConfig = bdFaceCheckConfig.bdLiveConfig;
-                                                boolean isLiveCheck = bdFaceCheckConfig.bdLiveConfig != null;
-                                                if (isLiveCheck) {
-                                                    long startRgbTime = System.currentTimeMillis();
-                                                    boolean rgbLiveStatus =
-                                                        faceModel
-                                                            .getFaceLive()
-                                                            .strategySilentLive(
-                                                                BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_RGB,
-                                                                rgbInstance,
-                                                                faceInfos[0],
-                                                                bdLiveConfig.framesThreshold,
-                                                                bdLiveConfig.rgbLiveScore);
-                                                    livenessModel.setRGBLiveStatus(rgbLiveStatus);
-                                                    livenessModel.setRgbLivenessDuration(
-                                                        System.currentTimeMillis() - startRgbTime);
+                        try {
+                            onDetect(
+                                    bdFaceCheckConfig,
+                                    rgbInstance,
+                                    fastFaceInfos,
+                                    livenessModel,
+                                    new DetectListener() {
+                                        @Override
+                                        public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
+                                            try {
+                                                // 浜鸿劯id璧嬪��
+                                                if (mLastFaceId != fastFaceInfos[0].faceID) {
+                                                    mLastFaceId = fastFaceInfos[0].faceID;
+                                                    mRgbLiveList.clear();
+                                                    mNirLiveList.clear();
                                                 }
-                                                // TODO nir娲讳綋妫�娴�
-                                                BDFaceImageInstance nirInstance = null;
-                                                boolean isHaveNirImage = nirBDFaceImageConfig != null && isLiveCheck;
-                                                if (isHaveNirImage) {
+                                                if (bdFaceCheckConfig == null) {
 
-                                                    // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁YUV-IR锛岃浆涓虹畻娉曟娴嬬殑鍥剧墖BGR
-                                                    // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝鎵嬫満鍜屽紑鍙戠増闇�瑕佸姩鎬侀�傞厤
-                                                    nirInstance = getBdImage(nirBDFaceImageConfig, false);
-                                                    livenessModel.setBdNirFaceImageInstance(nirInstance.getImage());
-
-                                                    // 閬垮厤RGB妫�娴嬪叧閿偣鍦↖R瀵归綈娲讳綋绋冲畾锛屽鍔犵孩澶栨娴�
-                                                    long startIrDetectTime = System.currentTimeMillis();
-                                                    BDFaceDetectListConf bdFaceDetectListConf =
-                                                        new BDFaceDetectListConf();
-                                                    bdFaceDetectListConf.usingDetect = true;
-                                                    FaceInfo[] faceInfosIr =
-                                                        faceModel
-                                                            .getFaceNirDetect()
-                                                            .detect(
-                                                                BDFaceSDKCommon.DetectType.DETECT_NIR,
-                                                                BDFaceSDKCommon.AlignType
-                                                                    .BDFACE_ALIGN_TYPE_NIR_ACCURATE,
-                                                                nirInstance,
-                                                                null,
-                                                                bdFaceDetectListConf);
-                                                    bdFaceDetectListConf.usingDetect = false;
-                                                    livenessModel.setIrLivenessDuration(
-                                                        System.currentTimeMillis() - startIrDetectTime);
-                                                    //                    LogUtils.e(TIME_TAG, "detect ir time = " + livenessModel.getIrLivenessDuration());
-
-                                                    if (faceInfosIr != null && faceInfosIr.length > 0) {
-                                                        FaceInfo faceInfoIr = faceInfosIr[0];
-                                                        long startNirTime = System.currentTimeMillis();
-                                                        boolean nirLiveStatus =
-                                                            faceModel
-                                                                .getFaceLive()
-                                                                .strategySilentLive(
-                                                                    BDFaceSDKCommon.LiveType
-                                                                        .BDFACE_SILENT_LIVE_TYPE_NIR,
-                                                                    nirInstance,
-                                                                    faceInfoIr,
-                                                                    bdLiveConfig.framesThreshold,
-                                                                    bdLiveConfig.nirLiveScore);
-                                                        livenessModel.setNIRLiveStatus(nirLiveStatus);
-                                                        livenessModel.setIrLivenessDuration(
-                                                            System.currentTimeMillis() - startNirTime);
+                                                    if (faceDetectCallBack != null) {
+                                                        faceDetectCallBack.onFaceDetectCallback(livenessModel);
                                                     }
-
-                                                    nirInstance.destory();
+                                                    return;
                                                 }
-                                                // TODO depth娲讳綋妫�娴�
-                                                if (depthBDFaceImageConfig != null) {
-                                                    fastFaceInfos[0].landmarks = faceInfos[0].landmarks;
-                                                    // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝閫傞厤Atlas 闀滃ご锛岀洰鍓嶅鍜岄珮400*640锛屽叾浠栨憚鍍忓ご闇�瑕佸姩鎬佽皟鏁�,浜鸿劯72 涓叧閿偣x 鍧愭爣鍚戝乏绉诲姩80涓儚绱犵偣
-                                                    float[] depthLandmark = new float[faceInfos[0].landmarks.length];
-                                                    BDFaceImageInstance depthInstance;
-                                                    if (bdFaceCheckConfig.cameraType == 1) {
-                                                        System.arraycopy(
-                                                            faceInfos[0].landmarks,
-                                                            0,
-                                                            depthLandmark,
-                                                            0,
-                                                            faceInfos[0].landmarks.length);
-                                                        for (int i = 0; i < 144; i = i + 2) {
-                                                            depthLandmark[i] -= 80;
-                                                        }
-                                                        fastFaceInfos[0].landmarks = depthLandmark;
+                                                // 鏈�浼樹汉鑴告帶鍒�
+                                                if (!onBestImageCheck(livenessModel, bdFaceCheckConfig, faceDetectCallBack)) {
+                                                    livenessModel.setQualityCheck(true);
+
+                                                    if (faceDetectCallBack != null) {
+                                                        faceDetectCallBack.onFaceDetectCallback(livenessModel);
                                                     }
-
-                                                    depthInstance = getBdImage(depthBDFaceImageConfig, false);
-                                                    livenessModel.setBdDepthFaceImageInstance(depthInstance.getImage());
-                                                    // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁Depth
-                                                    long startDepthTime = System.currentTimeMillis();
-                                                    boolean depthLiveStatus =
-                                                        faceModel
-                                                            .getFaceLive()
-                                                            .strategySilentLive(
-                                                                BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_DEPTH,
-                                                                depthInstance,
-                                                                fastFaceInfos[0],
-                                                                bdLiveConfig.framesThreshold,
-                                                                bdLiveConfig.nirLiveScore);
-                                                    livenessModel.setDepthLiveStatus(depthLiveStatus);
-                                                    livenessModel.setDepthtLivenessDuration(
-                                                        System.currentTimeMillis() - startDepthTime);
-                                                    depthInstance.destory();
+                                                    return;
                                                 }
-                                                // 娴佺▼缁撴潫,璁板綍鏈�缁堟椂闂�
-                                                livenessModel.setAllDetectDuration(
-                                                    System.currentTimeMillis() - startTime);
-                                                //                LogUtils.e(TIME_TAG, "all process time = " + livenessModel.getAllDetectDuration());
-                                                // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+                                                onQualityCheck(
+                                                        faceInfos,
+                                                        bdFaceCheckConfig.bdQualityConfig,
+                                                        faceDetectCallBack,
+                                                        new QualityListener() {
+                                                            @Override
+                                                            public void onQualitySuccess() {
+                                                                livenessModel.setQualityCheck(false);
+                                                                // 鑾峰彇LivenessConfig liveCheckMode 閰嶇疆閫夐」锛氥�愪笉浣跨敤娲讳綋锛�0銆戯紱銆怰GB娲讳綋锛�1銆戯紱銆怰GB+NIR娲讳綋锛�2銆戯紱銆怰GB+Depth娲讳綋锛�3銆戯紱銆怰GB+NIR+Depth娲讳綋锛�4銆�
+                                                                // TODO 娲讳綋妫�娴�
+                                                                BDLiveConfig bdLiveConfig = bdFaceCheckConfig.bdLiveConfig;
+                                                                boolean isLiveCheck = bdFaceCheckConfig.bdLiveConfig != null;
+                                                                if (isLiveCheck) {
+                                                                    long startRgbTime = System.currentTimeMillis();
+                                                                    boolean rgbLiveStatus =
+                                                                            faceModel
+                                                                                    .getFaceLive()
+                                                                                    .strategySilentLive(
+                                                                                            BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_RGB,
+                                                                                            rgbInstance,
+                                                                                            faceInfos[0],
+                                                                                            bdLiveConfig.framesThreshold,
+                                                                                            bdLiveConfig.rgbLiveScore);
+                                                                    livenessModel.setRGBLiveStatus(rgbLiveStatus);
+                                                                    livenessModel.setRgbLivenessDuration(
+                                                                            System.currentTimeMillis() - startRgbTime);
+                                                                }
+                                                                // TODO nir娲讳綋妫�娴�
+                                                                BDFaceImageInstance nirInstance = null;
+                                                                boolean isHaveNirImage = nirBDFaceImageConfig != null && isLiveCheck;
+                                                                if (isHaveNirImage) {
 
-                                                // 鏄剧ず鏈�缁堢粨鏋滄彁绀�
-                                                if (faceDetectCallBack != null) {
-                                                    faceDetectCallBack.onFaceDetectCallback(livenessModel);
-                                                }
+                                                                    // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁YUV-IR锛岃浆涓虹畻娉曟娴嬬殑鍥剧墖BGR
+                                                                    // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝鎵嬫満鍜屽紑鍙戠増闇�瑕佸姩鎬侀�傞厤
+                                                                    nirInstance = getBdImage(nirBDFaceImageConfig, false);
+                                                                    livenessModel.setBdNirFaceImageInstance(nirInstance.getImage());
+
+                                                                    // 閬垮厤RGB妫�娴嬪叧閿偣鍦↖R瀵归綈娲讳綋绋冲畾锛屽鍔犵孩澶栨娴�
+                                                                    long startIrDetectTime = System.currentTimeMillis();
+                                                                    BDFaceDetectListConf bdFaceDetectListConf =
+                                                                            new BDFaceDetectListConf();
+                                                                    bdFaceDetectListConf.usingDetect = true;
+                                                                    FaceInfo[] faceInfosIr =
+                                                                            faceModel
+                                                                                    .getFaceNirDetect()
+                                                                                    .detect(
+                                                                                            BDFaceSDKCommon.DetectType.DETECT_NIR,
+                                                                                            BDFaceSDKCommon.AlignType
+                                                                                                    .BDFACE_ALIGN_TYPE_NIR_ACCURATE,
+                                                                                            nirInstance,
+                                                                                            null,
+                                                                                            bdFaceDetectListConf);
+                                                                    bdFaceDetectListConf.usingDetect = false;
+                                                                    livenessModel.setIrLivenessDuration(
+                                                                            System.currentTimeMillis() - startIrDetectTime);
+                                                                    //                    LogUtils.e(TIME_TAG, "detect ir time = " + livenessModel.getIrLivenessDuration());
+
+                                                                    if (faceInfosIr != null && faceInfosIr.length > 0) {
+                                                                        FaceInfo faceInfoIr = faceInfosIr[0];
+                                                                        long startNirTime = System.currentTimeMillis();
+                                                                        boolean nirLiveStatus =
+                                                                                faceModel
+                                                                                        .getFaceLive()
+                                                                                        .strategySilentLive(
+                                                                                                BDFaceSDKCommon.LiveType
+                                                                                                        .BDFACE_SILENT_LIVE_TYPE_NIR,
+                                                                                                nirInstance,
+                                                                                                faceInfoIr,
+                                                                                                bdLiveConfig.framesThreshold,
+                                                                                                bdLiveConfig.nirLiveScore);
+                                                                        livenessModel.setNIRLiveStatus(nirLiveStatus);
+                                                                        livenessModel.setIrLivenessDuration(
+                                                                                System.currentTimeMillis() - startNirTime);
+                                                                    }
+
+                                                                    nirInstance.destory();
+                                                                }
+                                                                // TODO depth娲讳綋妫�娴�
+                                                                if (depthBDFaceImageConfig != null) {
+                                                                    fastFaceInfos[0].landmarks = faceInfos[0].landmarks;
+                                                                    // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝閫傞厤Atlas 闀滃ご锛岀洰鍓嶅鍜岄珮400*640锛屽叾浠栨憚鍍忓ご闇�瑕佸姩鎬佽皟鏁�,浜鸿劯72 涓叧閿偣x 鍧愭爣鍚戝乏绉诲姩80涓儚绱犵偣
+                                                                    float[] depthLandmark = new float[faceInfos[0].landmarks.length];
+                                                                    BDFaceImageInstance depthInstance;
+                                                                    if (bdFaceCheckConfig.cameraType == 1) {
+                                                                        System.arraycopy(
+                                                                                faceInfos[0].landmarks,
+                                                                                0,
+                                                                                depthLandmark,
+                                                                                0,
+                                                                                faceInfos[0].landmarks.length);
+                                                                        for (int i = 0; i < 144; i = i + 2) {
+                                                                            depthLandmark[i] -= 80;
+                                                                        }
+                                                                        fastFaceInfos[0].landmarks = depthLandmark;
+                                                                    }
+
+                                                                    depthInstance = getBdImage(depthBDFaceImageConfig, false);
+                                                                    livenessModel.setBdDepthFaceImageInstance(depthInstance.getImage());
+                                                                    // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁Depth
+                                                                    long startDepthTime = System.currentTimeMillis();
+                                                                    boolean depthLiveStatus =
+                                                                            faceModel
+                                                                                    .getFaceLive()
+                                                                                    .strategySilentLive(
+                                                                                            BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_DEPTH,
+                                                                                            depthInstance,
+                                                                                            fastFaceInfos[0],
+                                                                                            bdLiveConfig.framesThreshold,
+                                                                                            bdLiveConfig.nirLiveScore);
+                                                                    livenessModel.setDepthLiveStatus(depthLiveStatus);
+                                                                    livenessModel.setDepthtLivenessDuration(
+                                                                            System.currentTimeMillis() - startDepthTime);
+                                                                    depthInstance.destory();
+                                                                }
+                                                                // 娴佺▼缁撴潫,璁板綍鏈�缁堟椂闂�
+                                                                livenessModel.setAllDetectDuration(
+                                                                        System.currentTimeMillis() - startTime);
+                                                                //                LogUtils.e(TIME_TAG, "all process time = " + livenessModel.getAllDetectDuration());
+                                                                // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+
+                                                                // 鏄剧ず鏈�缁堢粨鏋滄彁绀�
+                                                                if (faceDetectCallBack != null) {
+                                                                    faceDetectCallBack.onFaceDetectCallback(livenessModel);
+                                                                }
+                                                            }
+
+                                                            @Override
+                                                            public void onQualityFail(String detectFail, String occlusionFail) {
+                                                                livenessModel.setQualityOcclusion(occlusionFail);
+                                                                livenessModel.setQualityDetect(detectFail);
+                                                                livenessModel.setQualityCheck(true);
+
+                                                                if (faceDetectCallBack != null) {
+                                                                    faceDetectCallBack.onFaceDetectCallback(livenessModel);
+                                                                }
+                                                            }
+                                                        });
+                                            }catch (RuntimeException e){
+                                                faceDetectCallBack.onTip(1,e.getMessage());
+                                            }catch (Exception e){
+                                                faceDetectCallBack.onTip(1,e.getMessage());
                                             }
+                                        }
 
-                                            @Override
-                                            public void onQualityFail(String detectFail, String occlusionFail) {
-                                                livenessModel.setQualityOcclusion(occlusionFail);
-                                                livenessModel.setQualityDetect(detectFail);
-                                                livenessModel.setQualityCheck(true);
+                                        @Override
+                                        public void onDetectFail() {
 
-                                                if (faceDetectCallBack != null) {
-                                                    faceDetectCallBack.onFaceDetectCallback(livenessModel);
-                                                }
+                                            if (faceDetectCallBack != null) {
+                                                faceDetectCallBack.onFaceDetectCallback(livenessModel);
                                             }
-                                        });
-                                }
-
-                                @Override
-                                public void onDetectFail() {
-
-                                    if (faceDetectCallBack != null) {
-                                        faceDetectCallBack.onFaceDetectCallback(livenessModel);
-                                    }
-                                }
-                            });
+                                        }
+                                    });
+                        }catch (RuntimeException e){
+                            faceDetectCallBack.onTip(1,e.getMessage());
+                        }catch (Exception e){
+                            faceDetectCallBack.onTip(1,e.getMessage());
+                        }
                     }
                 });
     }

--
Gitblit v1.9.3