From ce46dd9e401d7f2936db08bcea201bbd1da8e0a2 Mon Sep 17 00:00:00 2001
From: weimingfei <fei_gaming@sina.com>
Date: 星期三, 10 十二月 2025 13:39:44 +0800
Subject: [PATCH] 指纹钥匙柜

---
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java |  271 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 268 insertions(+), 3 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
index 94257da..99bf869 100644
--- 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
@@ -9,6 +9,7 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.os.SystemClock;
 import android.text.Editable;
 import android.text.SpannableString;
 import android.text.Spanned;
@@ -25,22 +26,28 @@
 import com.doumee.keyCabinet.MApplication;
 import com.doumee.keyCabinet.R;
 import com.doumee.keyCabinet.base.MyBaseActivity;
+import com.doumee.keyCabinet.dao.DaoManager;
+import com.doumee.keyCabinet.dao.FingerPrintDo;
 import com.doumee.keyCabinet.databinding.FaceActivityBinding;
 import com.doumee.keyCabinet.event.FaceStatusChangeEvent;
 import com.doumee.keyCabinet.event.HttpEvent;
 import com.doumee.keyCabinet.event.JiujinBeginEvent;
 import com.doumee.keyCabinet.event.JiujinResultEvent;
+import com.doumee.keyCabinet.event.RefreshFingerEvent;
 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.keyCabinet.utils.usb.DevComm;
+import com.doumee.keyCabinet.utils.usb.IUsbConnState;
 import com.doumee.lib_coremodel.bean.event.ActionEventData;
 import com.doumee.lib_coremodel.util.SpUtil;
 import com.doumee.lib_coremodel.util.StringUtil;
 import com.doumee.lib_coremodel.view.ToastView;
 import com.example.datalibrary.callback.CameraDataCallback;
 import com.example.datalibrary.callback.FaceDetectCallBack;
+import com.example.datalibrary.db.DBManager;
 import com.example.datalibrary.gatecamera.CameraPreviewManager;
 import com.example.datalibrary.gl.view.GlMantleSurfacView;
 import com.example.datalibrary.manager.FaceSDKManager;
@@ -112,6 +119,7 @@
     @Override
     public void initData(@Nullable Bundle savedInstanceState) {
         //getPermission();
+        initDev();
     }
 
     @Override
@@ -146,6 +154,7 @@
                 getDB().clZw.setVisibility(View.GONE);
                 getDB().clFace.setVisibility(View.VISIBLE);
                 setFaceModel(0);
+                setFingerStatus(1);
                 break;
             case 10:
                 //鍙�-绠$悊鍛樻寚绾归獙璇�
@@ -154,6 +163,7 @@
                 getDB().clFace.setVisibility(View.GONE);
                 getDB().clZw.setVisibility(View.VISIBLE);
                 setFaceModel(2);
+                setFingerStatus(0);
                 break;
             case 1:
                 //鍙�-绠$悊鍛樺埛鍗¢獙璇�
@@ -163,6 +173,7 @@
                 getDB().clZw.setVisibility(View.GONE);
                 getDB().clCard.setVisibility(View.VISIBLE);
                 setFaceModel(2);
+                setFingerStatus(1);
                 break;
             case 5:
                 //鍙�-鍙告満楠岃瘉鏂瑰紡閫夋嫨椤�
@@ -183,6 +194,7 @@
                 getDB().clSjXuan.setVisibility(View.GONE);
                 getDB().clFace.setVisibility(View.VISIBLE);
                 setFaceModel(1);
+                setFingerStatus(1);
                 break;
             case 11:
                 //鍙�-鍙告満鎸囩汗楠岃瘉
@@ -192,6 +204,7 @@
                 getDB().clSjXuan.setVisibility(View.GONE);
                 getDB().clZw.setVisibility(View.VISIBLE);
                 setFaceModel(2);
+                setFingerStatus(0);
                 break;
             case 3:
                 //鍙�-鍙告満鍒峰崱楠岃瘉
@@ -203,6 +216,7 @@
                 getDB().clSjXuan.setVisibility(View.GONE);
                 getDB().clCard.setVisibility(View.VISIBLE);
                 setFaceModel(2);
+                setFingerStatus(1);
                 break;
             case 4:
                 //鍙�-鍙告満閰掔簿妫�娴�
@@ -238,14 +252,16 @@
                 getDB().clZw.setVisibility(View.GONE);
                 getDB().clFace.setVisibility(View.VISIBLE);
                 setFaceModel(1);
+                setFingerStatus(1);
                 break;
             case 12:
-                //杩�-鍙告満浜鸿劯楠岃瘉
+                //杩�-鍙告満鎸囩汗楠岃瘉
                 getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
                 getDB().clCard.setVisibility(View.GONE);
                 getDB().clFace.setVisibility(View.GONE);
                 getDB().clZw.setVisibility(View.VISIBLE);
                 setFaceModel(2);
+                setFingerStatus(0);
                 break;
             case 8:
                 //杩�-鍙告満鍒峰崱楠岃瘉
@@ -255,6 +271,7 @@
                 getDB().clFace.setVisibility(View.GONE);
                 getDB().clCard.setVisibility(View.VISIBLE);
                 setFaceModel(2);
+                setFingerStatus(1);
                 break;
             case 9:
                 //鍙�-鍙告満閰掔簿妫�娴嬪け璐�
@@ -281,6 +298,16 @@
         }
     }
 
+    private void setFingerStatus(int fs){
+        if(fs==0){
+            //寮�濮嬫娴�
+            identify();
+        }else {
+            //鍏抽棴妫�娴�
+            mBCancel = true;
+        }
+    }
+
     private Bitmap bitmap;
     private byte[] secondFeature = new byte[512];
     @Override
@@ -300,8 +327,12 @@
                 }
                 break;
             case 9:
-                //绠$悊鍛樻寚绾归獙璇�
-                statusFsm(10);
+                //鎸囩汗楠岃瘉
+                if(status==0) {
+                    statusFsm(10);
+                }else {
+                    statusFsm(12);
+                }
                 break;
             case 10:
                 //鍙告満鎸囩汗楠岃瘉
@@ -641,6 +672,10 @@
         faceDetectCallBack = null;
         glMantleSurfacView = null;
         FaceSDKManager.getInstance().destroy();
+        mBCancel = true;
+        if(mDevComm!=null){
+            mDevComm.CloseComm();
+        }
     }
 
     private int resultCount = 0;
@@ -785,4 +820,234 @@
         }
     }
 
+    /**------------------------鎸囩汗妯″潡--------------------------*/
+
+    private void getUserIdByFingerId(int fingerId){
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                FingerPrintDo printDo = DaoManager.getFingerPrintDao().getByFingerId(fingerId);
+                if(printDo!=null){
+                    if(status==10){
+                        //鍙�-绠$悊鍛樻寚绾归獙璇�
+                        MApplication.getLoginBean().setAutoMemberId(printDo.getMemberId());
+                        EventBus.getDefault().post(new FaceStatusChangeEvent(5));
+                    }else if(status==11){
+                        //鍙�-鍙告満鎸囩汗楠岃瘉
+                        MApplication.getLoginBean().setMemberId(printDo.getMemberId());
+                        MApplication.getLoginBean().setAuthType(2);
+                        if(MApplication.getConfigBean()!=null&&MApplication.getConfigBean().getAlcoholStatus()==1) {
+                            //闈為厭绮炬娴�
+                            startActivity(KeyCabinetActivity.class);
+                            finish();
+                        }else {
+                            //閰掔簿妫�娴�
+                            EventBus.getDefault().post(new FaceStatusChangeEvent(4));
+                        }
+                    }else if(status==12){
+                        //杩�-鍙告満
+                        MApplication.getLoginBean().setMemberId(printDo.getMemberId());
+                        MApplication.getLoginBean().setAuthType(2);
+                        startActivity(KeyCabinetActivity.class);
+                        finish();
+                    }
+                }else {
+                    //鎵句笉鍒帮紝鍒犻櫎鎸囩汗
+                    if(deleteID(fingerId)) {
+                        //缁х画鏌ユ寚绾�
+                        identify();
+                    }else {
+                        showToast("鏈煡璇㈠埌鐢ㄦ埛");
+                    }
+                }
+            }
+        });
+    }
+
+    private static DevComm mDevComm;
+    //鏄惁缁撴潫褰曞叆
+    private boolean mBCancel = true;
+    private byte[] m_binImage = new byte[1024 * 100];
+    private final IUsbConnState m_IConnectionHandler = new IUsbConnState() {
+        @Override
+        public void onUsbConnected() {
+            //String[] w_strInfo = new String[1];
+            /*if (mDevComm.Run_TestConnection() == DevComm.ERR_SUCCESS) {
+                if (mDevComm.Run_GetDeviceInfo(w_strInfo) == DevComm.ERR_SUCCESS) {
+
+                    getVM().addInfo("杩炴帴usb鎴愬姛");
+                }else {
+                    getVM().addInfo("杩炴帴璁惧澶辫触1锛�" + mDevComm.Run_GetDeviceInfo(w_strInfo));
+                }
+            } else {
+                getVM().addInfo("杩炴帴璁惧澶辫触2锛�" + mDevComm.Run_TestConnection());
+            }*/
+        }
+
+        @Override
+        public void onUsbPermissionDenied() {
+            Toast.makeText(mContext, "鏃犺澶囨潈闄�", Toast.LENGTH_SHORT).show();
+        }
+
+        @Override
+        public void onDeviceNotFound() {
+            Toast.makeText(mContext, "鏈彂鐜版寚绾硅澶�", Toast.LENGTH_SHORT).show();
+        }
+    };
+
+    private void initDev(){
+        mDevComm = new DevComm(this, m_IConnectionHandler);
+        openDevice();
+    }
+    /**
+     * 寮�鍚澶�
+     */
+    private void openDevice() {
+        String[] w_strInfo = new String[1];
+
+        if (mDevComm != null) {
+            if (!mDevComm.IsInit()) {
+                if (mDevComm.OpenComm("USB", 19200) == false) {
+                    EventBus.getDefault().post(new HttpEvent("鍒濆鍖栬澶囧け璐�"));
+                    return;
+                }
+            }
+            if (mDevComm.Run_TestConnection() == DevComm.ERR_SUCCESS) {
+                if (mDevComm.Run_GetDeviceInfo(w_strInfo) == DevComm.ERR_SUCCESS) {
+                    EventBus.getDefault().post(new HttpEvent("寮�鍚澶囨垚鍔�"));
+                } else {
+                    EventBus.getDefault().post(new HttpEvent("杩炴帴璁惧澶辫触3," + mDevComm.Run_GetDeviceInfo(w_strInfo)));
+                }
+            } else {
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        EventBus.getDefault().post(new HttpEvent("杩炴帴璁惧澶辫触4,"+mDevComm.Run_TestConnection()));
+                    }
+                });
+                mDevComm.CloseComm();
+            }
+        }
+    }
+
+    private void identify() {
+        if (!mDevComm.IsInit())
+            return;
+
+        mBCancel = false;
+        new Thread(new Runnable() {
+            int w_nRet;
+            int[] w_nID = new int[1];
+            int[] w_nLearned = new int[1];
+            int[] w_nWidth = new int[1];
+            int[] w_nHeight = new int[1];
+
+            @Override
+            public void run() {
+
+                while (true) {
+                    if(mBCancel){
+                        //鍋滄
+                        return;
+                    }
+                    if (capturing() < 0)
+                        return;
+                    //鏉惧紑鎵嬫寚
+
+                    // Up Cpatured Image
+                    if (mDevComm.m_nConnected == 2) {
+                        w_nRet = mDevComm.Run_UpImage(0, m_binImage, w_nWidth, w_nHeight);
+
+                        if (w_nRet != DevComm.ERR_SUCCESS) {
+                            showToast(DevComm.GetErrorMsg(w_nRet));
+                            return;
+                        }
+                    }
+
+                    // Create template
+                    w_nRet = mDevComm.Run_Generate(0);
+
+                    if (w_nRet != DevComm.ERR_SUCCESS) {
+                        if (w_nRet == DevComm.ERR_CONNECTION) {
+                            showToast(DevComm.GetErrorMsg(w_nRet));
+                            return;
+                        } else {
+                            SystemClock.sleep(1000);
+                            continue;
+                        }
+                    }
+
+                    // Identify
+                    w_nRet = mDevComm.Run_Search(0, 1, 500, w_nID, w_nLearned);
+                    if(mBCancel){
+                        //鍋滄
+                        return;
+                    }
+                    if (w_nRet == DevComm.ERR_SUCCESS) {
+                        //鎵惧埌浜�
+                        //showToast("鎵惧埌浜嗭紝"+w_nID[0]);
+                        getUserIdByFingerId(w_nID[0]);
+                        break;
+                        //m_strPost = String.format("Result : Success\r\nTemplate No : %d, Learn Result : %d\r\nMatch Time : %dms", w_nID[0], w_nLearned[0], m_nPassedTime);
+                    } else {
+                        //娌℃壘鍒�
+                        //showToast("娌℃壘鍒�");
+                        /*m_strPost = String.format("\r\nMatch Time : %dms", m_nPassedTime);
+                        m_strPost = GetErrorMsg(w_nRet) + m_strPost;*/
+                    }
+                }
+            }
+        }).start();
+    }
+
+    /**
+     * 鑾峰彇鎸囩汗
+     * @return
+     */
+    private int capturing() {
+        int w_nRet;
+        while (true) {
+            if(isFinishing()){
+                break;
+            }
+            w_nRet = mDevComm.Run_GetImage();
+
+            if (w_nRet == DevComm.ERR_CONNECTION) {
+                showToast("閫氫俊閿欒!");
+                return -1;
+            } else if (w_nRet == DevComm.ERR_SUCCESS) {
+                break;
+            }
+            if (mBCancel) {
+                return -1;
+            }
+        }
+        return 0;
+    }
+
+    private boolean deleteID(int fingerId) {
+        int m_nUserID = fingerId;
+        int w_nRet;
+
+        if (!mDevComm.IsInit())
+            return false;
+
+        w_nRet = mDevComm.Run_DelChar(m_nUserID, m_nUserID);
+        if (w_nRet != DevComm.ERR_SUCCESS&&w_nRet!=DevComm.ERR_TMPL_EMPTY) {
+            //鍒犻櫎澶辫触
+            return false;
+        }
+        return true;
+    }
+
+    private void showToast(String msg){
+        if(!isFinishing()){
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();
+                }
+            });
+        }
+    }
 }
\ No newline at end of file

--
Gitblit v1.9.3