From 4a8ff39b0fab0627ef8f7459587d514cc01c3676 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期一, 20 十月 2025 10:52:02 +0800
Subject: [PATCH] Merge branch 'wuhuyancao' of http://139.186.142.91:10010/r/productDev/dmvisit into wuhuyancao

---
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java |  526 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 526 insertions(+), 0 deletions(-)

diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
new file mode 100644
index 0000000..a1e6dba
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
@@ -0,0 +1,526 @@
+package com.doumee.keyCabinet.ui.face;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.hardware.Camera;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+import android.view.View;
+
+import com.baidu.idl.main.facesdk.model.BDFaceSDKCommon;
+import com.doumee.keyCabinet.MApplication;
+import com.doumee.keyCabinet.R;
+import com.doumee.keyCabinet.base.MyBaseActivity;
+import com.doumee.keyCabinet.databinding.FaceActivityBinding;
+import com.doumee.keyCabinet.event.TimeClockEvent;
+import com.doumee.keyCabinet.ui.keyCabinet.KeyCabinetActivity;
+import com.doumee.keyCabinet.utils.BraceletLogUtils;
+import com.doumee.keyCabinet.utils.face.FaceUtils;
+import com.doumee.keyCabinet.utils.face.model.SingleBaseConfig;
+import com.doumee.lib_coremodel.bean.event.ActionEventData;
+import com.doumee.lib_coremodel.util.SpUtil;
+import com.example.datalibrary.callback.CameraDataCallback;
+import com.example.datalibrary.callback.FaceDetectCallBack;
+import com.example.datalibrary.gatecamera.CameraPreviewManager;
+import com.example.datalibrary.gl.view.GlMantleSurfacView;
+import com.example.datalibrary.manager.FaceSDKManager;
+import com.example.datalibrary.model.BDFaceCheckConfig;
+import com.example.datalibrary.model.BDFaceImageConfig;
+import com.example.datalibrary.model.LivenessModel;
+import com.example.datalibrary.model.User;
+import com.example.datalibrary.utils.FaceOnDrawTexturViewUtil;
+
+import org.greenrobot.eventbus.Subscribe;
+
+import dagger.hilt.android.AndroidEntryPoint;
+
+@AndroidEntryPoint
+public class FaceActivity extends MyBaseActivity<FaceVM, FaceActivityBinding> implements View.OnClickListener{
+
+    /*鍥剧墖瓒婂ぇ锛屾�ц兘娑堣�楄秺澶э紝涔熷彲浠ラ�夋嫨640*480锛� 1280*720*/
+    private static final int PREFER_WIDTH = SingleBaseConfig.getBaseConfig().getRgbAndNirWidth();
+    private static final int PERFER_HEIGH = SingleBaseConfig.getBaseConfig().getRgbAndNirHeight();
+    private Context mContext;
+    private boolean isCompareCheck = true;
+
+    private User mUser;
+
+    private GlMantleSurfacView glMantleSurfacView;
+    private BDFaceImageConfig bdFaceImageConfig;
+    private BDFaceCheckConfig bdFaceCheckConfig;
+    //0锛氬彇锛�1锛氳繕
+    private int flag ;
+    private int status;
+
+    @Override
+    public int getLayoutId() {
+        return R.layout.face_activity;
+    }
+
+    @Override
+    public void initView(@Nullable Bundle savedInstanceState) {
+        isToGuild = false;
+        normalConfig();
+        getDB().setModel(getVM());
+        mContext = this;
+        flag = MApplication.getLoginBean().getFlag();
+        statusFsm(flag==0?0:2);
+        //todo wmf 瑙e紑
+        /*FaceSDKManager.getInstance().initDataBases(this);
+        initFaceCheck();*/
+        initView();
+    }
+
+    @Override
+    public void initData(@Nullable Bundle savedInstanceState) {
+        //getPermission();
+    }
+
+    @Override
+    protected void timeChange(String djs) {
+        getDB().tvDjs.setText(djs);
+    }
+
+    private void statusFsm(int toStatus){
+        status = toStatus;
+        switch (status){
+            case 0:
+                //鍙�-绠$悊鍛樹汉鑴搁獙璇�
+                getDB().clLogin.setVisibility(View.VISIBLE);
+                getDB().tvTitle.setText("绠$悊鍛樿韩浠介獙璇�");
+                getDB().vSl.setBackgroundResource(R.mipmap.ic_viewfinder);
+                getDB().tvTip.setText("璇蜂繚鎸佹鑴稿湪鍙栨櫙妗嗕腑锛屽苟鏍规嵁鎸囩ず瀹屾垚璇嗗埆");
+                getDB().clRemind.setVisibility(View.VISIBLE);
+                getDB().btSk.setVisibility(View.VISIBLE);
+
+                getDB().clSjRl.setVisibility(View.GONE);
+                getDB().clSjSk.setVisibility(View.GONE);
+                getDB().clTip1.setVisibility(View.GONE);
+                break;
+            case 1:
+                //鍙�-绠$悊鍛樺埛鍗¢獙璇�
+                getDB().clLogin.setVisibility(View.VISIBLE);
+                getDB().tvTitle.setText("绠$悊鍛樿韩浠介獙璇�");
+                getDB().vSl.setBackgroundResource(R.mipmap.ic_shuaka2);
+                getDB().tvTip.setText("璇峰皢IC鍗¤创杩戝埛鍗″尯锛屽仠鐣�1-2绉�");
+                getDB().clRemind.setVisibility(View.GONE);
+                getDB().btSk.setVisibility(View.GONE);
+
+                getDB().clSjRl.setVisibility(View.GONE);
+                getDB().clSjSk.setVisibility(View.VISIBLE);
+                getDB().clTip1.setVisibility(View.GONE);
+                break;
+            case 5:
+                //鍙�-鍙告満楠岃瘉鏂瑰紡閫夋嫨椤�
+                getDB().clLogin.setVisibility(View.VISIBLE);
+                getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
+                getDB().vSl.setBackgroundResource(R.mipmap.ic_face);
+                getDB().tvTip.setText("璇蜂繚鎸佹鑴稿湪鍙栨櫙妗嗕腑锛屽苟鏍规嵁鎸囩ず瀹屾垚璇嗗埆");
+                getDB().clRemind.setVisibility(View.VISIBLE);
+                getDB().btSk.setVisibility(View.GONE);
+
+                getDB().clSjRl.setVisibility(View.VISIBLE);
+                getDB().clSjSk.setVisibility(View.GONE);
+                getDB().clTip1.setVisibility(View.GONE);
+                break;
+            case 2:
+                //鍙�-鍙告満浜鸿劯楠岃瘉
+                getDB().clLogin.setVisibility(View.VISIBLE);
+                getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
+                getDB().vSl.setBackgroundResource(R.mipmap.ic_viewfinder);
+                getDB().tvTip.setText("璇蜂繚鎸佹鑴稿湪鍙栨櫙妗嗕腑锛屽苟鏍规嵁鎸囩ず瀹屾垚璇嗗埆");
+                getDB().clRemind.setVisibility(View.VISIBLE);
+                getDB().btSk.setVisibility(View.VISIBLE);
+
+                getDB().clSjRl.setVisibility(View.GONE);
+                getDB().clSjSk.setVisibility(View.GONE);
+                getDB().clTip1.setVisibility(View.GONE);
+                break;
+            case 3:
+                //鍙�-鍙告満鍒峰崱楠岃瘉
+                getDB().clLogin.setVisibility(View.VISIBLE);
+                getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
+                getDB().vSl.setBackgroundResource(R.mipmap.ic_shuaka2);
+                getDB().tvTip.setText("璇峰皢IC鍗¤创杩戝埛鍗″尯锛屽仠鐣�1-2绉�");
+                getDB().clRemind.setVisibility(View.GONE);
+                getDB().btSk.setVisibility(View.GONE);
+
+                getDB().clSjRl.setVisibility(View.GONE);
+                getDB().clSjSk.setVisibility(View.VISIBLE);
+                getDB().clTip1.setVisibility(View.GONE);
+                break;
+            case 4:
+                //鍙�-鍙告満閰掔簿妫�娴�
+                getDB().clLogin.setVisibility(View.VISIBLE);
+                getDB().tvTitle.setText("閰掔簿妫�娴�");
+                getDB().vSl.setBackgroundResource(R.mipmap.ic_jiujingjiance);
+                getDB().tvTip.setText("璇锋嬁璧烽厭绮炬娴嬩华鍚规皵");
+                getDB().clRemind.setVisibility(View.GONE);
+                getDB().btSk.setVisibility(View.GONE);
+
+                getDB().clSjRl.setVisibility(View.GONE);
+                getDB().clSjSk.setVisibility(View.GONE);
+                getDB().clTip1.setVisibility(View.GONE);
+                break;
+            case 6:
+                //鍙�-鍙告満閰掔簿妫�娴嬪け璐�
+                getDB().clTip1.setVisibility(View.VISIBLE);
+                break;
+            case 7:
+                //杩�-鍙告満浜鸿劯楠岃瘉
+                getDB().clLogin.setVisibility(View.VISIBLE);
+                getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
+                getDB().vSl.setBackgroundResource(R.mipmap.ic_viewfinder);
+                getDB().tvTip.setText("璇蜂繚鎸佹鑴稿湪鍙栨櫙妗嗕腑锛屽苟鏍规嵁鎸囩ず瀹屾垚璇嗗埆");
+                getDB().clRemind.setVisibility(View.VISIBLE);
+                getDB().btSk.setVisibility(View.VISIBLE);
+
+                getDB().clSjSk.setVisibility(View.GONE);
+                getDB().clSjRl.setVisibility(View.GONE);
+                getDB().clTip1.setVisibility(View.GONE);
+                break;
+            case 8:
+                //杩�-鍙告満鍒峰崱楠岃瘉
+                getDB().clLogin.setVisibility(View.VISIBLE);
+                getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
+                getDB().vSl.setBackgroundResource(R.mipmap.ic_shuaka2);
+                getDB().tvTip.setText("璇峰皢IC鍗¤创杩戝埛鍗″尯锛屽仠鐣�1-2绉�");
+                getDB().clRemind.setVisibility(View.GONE);
+                getDB().btSk.setVisibility(View.GONE);
+
+                getDB().clSjSk.setVisibility(View.VISIBLE);
+                getDB().clSjRl.setVisibility(View.GONE);
+                getDB().clTip1.setVisibility(View.GONE);
+                break;
+            default:
+                break;
+        }
+    }
+
+    private Bitmap bitmap;
+    private byte[] secondFeature = new byte[512];
+    @Override
+    protected void doRegister(int type, ActionEventData data) {
+        switch (type){
+            case 1:
+                //鍒囨崲鍒板埛鍗�
+                if("0".equals(flag)){
+                    if(status==0){
+                        statusFsm(1);
+                    }else if(status==2){
+                        statusFsm(3);
+                    }
+                }else {
+                    statusFsm(8);
+                }
+                break;
+            case 2:
+                //鍒囨崲鍙告満鍒峰崱
+                statusFsm(3);
+                break;
+            case 3:
+                //鍒囨崲鍙告満浜鸿劯
+                statusFsm(2);
+                break;
+            case 4:
+                //鍒囨崲鍒颁汉鑴�
+                if("0".equals(flag)){
+                    if(status==1){
+                        statusFsm(5);
+                    }else if(status==3){
+                        statusFsm(6);
+                    }
+                }else {
+                    startActivity(KeyCabinetActivity.class);
+                    finish();
+                }
+
+                //todo wmf
+                //statusFsm("0".equals(flag)?);
+                break;
+            case 5:
+                startActivity(KeyCabinetActivity.class);
+                finish();
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void initFaceConfig(int height , int width){
+        bdFaceImageConfig = new BDFaceImageConfig(height , width ,
+                SingleBaseConfig.getBaseConfig().getRgbDetectDirection(),
+                SingleBaseConfig.getBaseConfig().getMirrorDetectRGB() ,
+                BDFaceSDKCommon.BDFaceImageType.BDFACE_IMAGE_TYPE_YUV_NV21);
+    }
+    private void initFaceCheck(){
+        bdFaceCheckConfig = FaceUtils.getInstance().getBDFaceCheckConfig();
+    }
+
+    /**
+     * View
+     */
+    private void initView() {
+        getDB().faceDetectImageView.setVisibility(View.GONE);
+
+        glMantleSurfacView = findViewById(R.id.camera_textureview);
+        glMantleSurfacView.initSurface(SingleBaseConfig.getBaseConfig().getRgbRevert(),
+                SingleBaseConfig.getBaseConfig().getMirrorVideoRGB() , SingleBaseConfig.getBaseConfig().isOpenGl());
+        CameraPreviewManager.getInstance().startPreview(glMantleSurfacView,
+                SingleBaseConfig.getBaseConfig().getRgbVideoDirection() , PREFER_WIDTH, PERFER_HEIGH);
+
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        //todo wmf 瑙e紑
+        //startTestOpenDebugRegisterFunction();
+    }
+
+    private void startTestOpenDebugRegisterFunction() {
+        if(SingleBaseConfig.getBaseConfig().getRBGCameraId()==-1){
+            if(!TextUtils.isEmpty(SpUtil.getString("rbgCameraId"))) {
+                SingleBaseConfig.getBaseConfig().setRBGCameraId(Integer.parseInt(SpUtil.getString("rbgCameraId")));
+            }
+        }
+        if (SingleBaseConfig.getBaseConfig().getRBGCameraId() != -1) {
+            BraceletLogUtils.saveLog("浣跨敤鐩告満("+SingleBaseConfig.getBaseConfig().getRBGCameraId()+")");
+            CameraPreviewManager.getInstance().setCameraFacing(SingleBaseConfig.getBaseConfig().getRBGCameraId());
+        } else {
+            BraceletLogUtils.saveLog("浣跨敤鐩告満("+CameraPreviewManager.CAMERA_USB+")");
+            CameraPreviewManager.getInstance().setCameraFacing(CameraPreviewManager.CAMERA_USB);
+        }
+        int[] cameraSize =  CameraPreviewManager.getInstance().initCamera(new CameraPreviewManager.ErrInfoCallBack() {
+            @Override
+            public void err(String errInfo) {
+                BraceletLogUtils.saveLog(errInfo);
+            }
+        });
+        initFaceConfig(cameraSize[1] , cameraSize[0]);
+        isPause = true;
+        count = 60;
+        CameraPreviewManager.getInstance().setmCameraDataCallback(dataCallback);
+    }
+
+    private CameraDataCallback dataCallback = new CameraDataCallback() {
+        @Override
+        public void onGetCameraData(byte[] data, Camera camera, int width, int height) {
+            if(!isFinishing()){
+                //isCheckFace = true;
+                handler.sendEmptyMessageDelayed(1,4000);
+                glMantleSurfacView.setFrame();
+                bdFaceImageConfig.setData(data);
+                //蹇呴』浼氬憳
+                String groupId = "0";
+                FaceSDKManager.getInstance().onDetectCheck(groupId,bdFaceImageConfig, null, null,
+                        bdFaceCheckConfig, faceDetectCallBack);
+            }
+        }
+    };
+    //private boolean isCheckFace;
+    private FaceDetectCallBack faceDetectCallBack = new FaceDetectCallBack() {
+        @Override
+        public void onFaceDetectCallback(LivenessModel livenessModel) {
+            //System.out.println("==isOk==>onFaceDetectCallback");
+            //System.out.println("==rgbInstance==>onFaceDetectCallback   "+livenessModel);
+            // 寮�鍙戞ā寮�
+            //isCheckFace = false;
+            if(handler.hasMessages(1)){
+                handler.removeMessages(1);
+            }
+            checkOpenDebugResult(livenessModel);
+        }
+
+        @Override
+        public void onTip(int code, String msg) {
+            getDB().clFail.setVisibility(View.VISIBLE);
+            getDB().tv4.setText(msg);
+            handler.sendEmptyMessageDelayed(0,1000);
+            System.out.println("==isOk==>onTip:"+msg);
+        }
+
+        @Override
+        public void onFaceDetectDarwCallback(LivenessModel livenessModel) {
+            //System.out.println("==rgbInstance==>onFaceDetectDarwCallback");
+            if (isCompareCheck) {
+                getDB().clFail.setVisibility(View.VISIBLE);
+                getDB().tv4.setText(getString(R.string.face_tip2));
+                handler.sendEmptyMessageDelayed(0,1000);
+            }
+            // 缁樺埗浜鸿劯妗�
+            showFrame(livenessModel);
+
+        }
+    };
+
+    private boolean isPause = false;
+    public void showFrame(LivenessModel livenessModel){
+        if(isFinishing()){
+            return;
+        }
+        if (livenessModel == null){
+            return;
+        }
+
+        if (isPause){
+            glMantleSurfacView.onGlDraw(livenessModel.getTrackFaceInfo() ,
+                    livenessModel.getBdFaceImageInstance() ,
+                    FaceOnDrawTexturViewUtil.drawFaceColor(mUser , livenessModel));
+        }
+    }
+
+    private Handler handler = new Handler(){
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            switch (msg.what){
+                case 0:
+                    getDB().clFail.setVisibility(View.GONE);
+                    break;
+                case 1:
+                    //isCheckFace = false;
+                    break;
+            }
+        }
+    };
+
+    @Override
+    protected void onRestart() {
+        super.onRestart();
+        isTimePause = false;
+        isToChose = false;
+        count = 120;
+    }
+
+    private int count = 120;
+    private boolean isTimePause = false;
+    @Subscribe
+    public void TimeClockEvent(TimeClockEvent event) {
+        if (!isFinishing()&&!isTimePause) {
+            if (count > 0) {
+                count--;
+                if (count == 0) {
+                    finish();
+                    return;
+                }
+            }
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        handler.removeCallbacksAndMessages(null);
+        handler = null;
+        dataCallback = null;
+        //CameraPreviewManager.getInstance().destroy();
+        faceDetectCallBack = null;
+        glMantleSurfacView = null;
+        //todo wmf 瑙e紑
+        //FaceSDKManager.getInstance().destroy();
+    }
+
+    private int resultCount = 0;
+    // ***************寮�鍙戞ā寮忕粨鏋滆緭鍑�*************
+    private void checkOpenDebugResult(final LivenessModel livenessModel) {
+        if(isFinishing()){
+            return;
+        }
+        if(handler==null){
+            return;
+        }
+        // 褰撴湭妫�娴嬪埌浜鸿劯UI鏄剧ず
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                if (livenessModel == null) {
+                    if (isCompareCheck) {
+                        getDB().clFail.setVisibility(View.VISIBLE);
+                        getDB().tv4.setText(getString(R.string.face_tip2));
+                        handler.sendEmptyMessageDelayed(0,1000);
+                    }
+                    System.out.println("======>浜鸿劯璇嗗埆澶辫触");
+                    return;
+                }
+                if (livenessModel.isQualityCheck()){
+                    //鏄惁閫氳繃璐ㄩ噺妫�娴�
+                    if (isCompareCheck) {
+                        getDB().clFail.setVisibility(View.VISIBLE);
+                        getDB().tv4.setText(getString(R.string.face_tip2));
+                        handler.sendEmptyMessageDelayed(0,1000);
+                    }
+                } else {
+                    User user = livenessModel.getUser();
+                    if (user == null) {
+                        mUser = null;
+                        if (isCompareCheck) {
+                            getDB().clFail.setVisibility(View.VISIBLE);
+                            getDB().tv4.setText(getString(R.string.face_tip2));
+                            handler.sendEmptyMessageDelayed(0,1000);
+                        }
+
+                    } else {
+                        //浼樺厛浼氬憳
+                        if("0".equals(user.getGroupId())){
+11
+                        }else {
+                            if (isCompareCheck) {
+                                getDB().clFail.setVisibility(View.VISIBLE);
+                                getDB().tv4.setText(getString(R.string.face_tip2));
+                                handler.sendEmptyMessageDelayed(0,1000);
+                            }
+                            resultCount++;
+                            if (resultCount >= 3) {
+                                resultCount = 0;
+                            }else {
+                                return;
+                            }
+                        }
+                        mUser = user;
+                        if (isCompareCheck) {
+                            getDB().clFail.setVisibility(View.GONE);
+                            if(handler.hasMessages(0)) {
+                                handler.removeMessages(0);
+                            }
+                            /*textHuanying.setVisibility(View.GONE);
+                            userNameLayout.setVisibility(View.VISIBLE);
+                            nameImage.setImageResource(R.mipmap.ic_tips_gate_success);
+                            nameText.setTextColor(Color.parseColor("#0dc6ff"));
+                            nameText.setText(FileUtils.spotString(user.getUserName()) + " 娆㈣繋鎮�");*/
+                        }
+                        if(!isToChose) {
+                            isToChose = true;
+                            //璇嗗埆鎴愬姛锛岃烦杞�
+                            Bundle bundle = new Bundle();
+                            bundle.putString("busId", user.getUserId());
+                            bundle.putString("type", "0");
+                            //Toast.makeText(mContext, user.getUserName(), Toast.LENGTH_SHORT).show();
+                            //startActivity(ChoseTicketActivity.class, bundle);
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+    boolean isToChose = false;
+
+    @Override
+    public void onClick(View v) {
+
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        isPause = false;
+        isTimePause = true;
+        //todo wmf 瑙e紑
+        //CameraPreviewManager.getInstance().stopPreview();
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3