From 76407ef42394ff1046c508a106c0b51812df2a0f Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期三, 10 十二月 2025 18:12:53 +0800
Subject: [PATCH] 钥匙柜开门添加 指纹方式

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

diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ZWLRActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ZWLRActivity.java
new file mode 100644
index 0000000..4ff16ae
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ZWLRActivity.java
@@ -0,0 +1,547 @@
+package com.doumee.keyCabinet.ui.keyCabinet;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.style.TextAppearanceSpan;
+import android.view.View;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.bumptech.glide.Glide;
+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.ZwlrActivityBinding;
+import com.doumee.keyCabinet.event.HttpEvent;
+import com.doumee.keyCabinet.event.RefreshFingerEvent;
+import com.doumee.keyCabinet.event.TimeClockEvent;
+import com.doumee.keyCabinet.ui.keyCabinet.adapter.ZwListRcvAdapter;
+import com.doumee.keyCabinet.ui.keyCabinet.adapter.ZwLrRcvAdapter;
+import com.doumee.keyCabinet.utils.PhotoUtils;
+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.http.utils.FrescoUtils;
+import com.doumee.lib_coremodel.util.RecyclerHelp;
+import com.example.datalibrary.model.User;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.util.List;
+
+import dagger.hilt.android.AndroidEntryPoint;
+
+@AndroidEntryPoint
+public class ZWLRActivity extends MyBaseActivity<ZWLRVM, ZwlrActivityBinding> {
+    private ZwLrRcvAdapter adapter;
+    private int userId;
+    private String userName;
+    private String userPic;
+    private String groupId;
+    private FingerPrintDo delFinger;
+    private Handler handler = new Handler(){
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what){
+                case 0:
+                    getDB().clOk.setVisibility(View.GONE);
+                    break;
+            }
+        }
+    };
+
+    @Override
+    public int getLayoutId() {
+        return R.layout.zwlr_activity;
+    }
+
+    @Override
+    public void initView(@Nullable Bundle savedInstanceState) {
+        isAddCountTimer = false;
+        normalConfig();
+        getDB().setModel(getVM());
+        adapter = new ZwLrRcvAdapter(this, R.layout.zwlr_rcv_item, new ZwLrRcvAdapter.OnItemClick() {
+            @Override
+            public void onItemDelete(FingerPrintDo item) {
+                if(delFinger==null){
+                    delFinger = item;
+                    deleteID(item.getFingerId());
+                }
+            }
+        });
+        RecyclerHelp.bindVL(this,getDB().recyclerView,0,false);
+        getDB().recyclerView.setAdapter(adapter);
+        userName = getStringFormBundle("userName");
+        groupId = getStringFormBundle("groupId");
+        userId = getIntFormBundle("userId");
+        if(userId==0){
+            Toast.makeText(mContext, "鐢ㄦ埛id閿欒", Toast.LENGTH_SHORT).show();
+            finish();
+            return;
+        }
+        userPic = getStringFormBundle("userPic");
+        getDB().tvName.setText(userName);
+        //PhotoUtils.datasToBitmap(this,userPic,getDB().sim);
+        FrescoUtils.displayImageFresco(userPic,getDB().sim);
+        getDB().tvJg2.setText(getErrPhoneText(), TextView.BufferType.SPANNABLE);
+    }
+
+    @Override
+    public void initData(@Nullable Bundle savedInstanceState) {
+        getDatas();
+        initDev();
+    }
+
+    private void getDatas(){
+        List<FingerPrintDo> printDos = DaoManager.getFingerPrintDao().getFingerByMemberId(userId);
+        if(printDos.size()>0) {
+            adapter.refreshData(printDos);
+            getVM().emptyVisibility.set(View.GONE);
+            if(printDos.size()>=3){
+                getDB().tvAdd.setVisibility(View.GONE);
+            }else {
+                getDB().tvAdd.setVisibility(View.VISIBLE);
+            }
+        }else {
+            getDB().tvAdd.setVisibility(View.VISIBLE);
+            getVM().emptyVisibility.set(View.VISIBLE);
+        }
+    }
+
+    @Override
+    protected void doRegister(int type, ActionEventData data) {
+        switch (type){
+            case 1:
+                //鏂板鎸囩汗
+                getDB().clTip.setVisibility(View.GONE);
+                getDB().clZw.setVisibility(View.VISIBLE);
+                getDB().tvZwTip.setText("璇峰皢鎵嬫寚鏀剧疆鍦ㄦ寚绾归噰闆嗗櫒涓婅繘琛屽綍鍏�");
+                tipDownCount = 60;
+                isShowTip = true;
+                enrollBtn();
+                break;
+            case 5:
+                getDB().nsv.setVisibility(getDB().nsv.getVisibility()==View.VISIBLE?View.GONE:View.VISIBLE);
+                break;
+            case 55:
+                getVM().infoObs.set("");
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void showFingerTip(String tip){
+        if(!isFinishing()){
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    if(TextUtils.isEmpty(tip)){
+                        getDB().tvZwTip.setText("璇峰皢鎵嬫寚鏀剧疆鍦ㄦ寚绾归噰闆嗗櫒涓婅繘琛屽綍鍏�");
+                    }else {
+                        getDB().tvZwTip.setText(tip);
+                    }
+                }
+            });
+        }
+    }
+
+    private void showErrTip(String tip){
+        if(!isFinishing()){
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    //鏄剧ず鎻愮ず
+                    getDB().clTip.setVisibility(View.VISIBLE);
+                    getDB().clZw.setVisibility(View.GONE);
+                    if(TextUtils.isEmpty(tip)){
+                        getDB().tvJg1.setText("鎸囩汗褰曞叆澶辫触锛岃閲嶆柊褰曞叆");
+                    }else {
+                        getDB().tvJg1.setText(tip);
+                    }
+                    tipDownCount = 30;
+                    isShowTip = true;
+                }
+            });
+        }
+    }
+
+    private void lrcg(int fingerId){
+        if(!isFinishing()){
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    getVM().addInfo("褰曞叆鎸囩汗锛歩d="+fingerId);
+                    //鎴愬姛
+                    getDB().clTip.setVisibility(View.GONE);
+                    getDB().clZw.setVisibility(View.GONE);
+                    getDB().clOk.setVisibility(View.VISIBLE);
+                    handler.sendEmptyMessageDelayed(0,1000);
+                    //鏂板鎸囩汗璁板綍
+                    FingerPrintDo addDo = new FingerPrintDo();
+                    addDo.setMemberId(userId);
+                    addDo.setMemberName(userName);
+                    addDo.setGroupId(groupId);
+                    addDo.setFingerId(fingerId);
+                    addDo.setFace(userPic);
+                    DaoManager.getFingerPrintDao().insert(addDo);
+                    getDatas();
+                    EventBus.getDefault().post(new RefreshFingerEvent());
+                }
+            });
+        }
+    }
+
+    private void showToast(String msg){
+        if(!isFinishing()){
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();
+                }
+            });
+        }
+    }
+
+
+    private SpannableString getErrPhoneText(){
+        String phone = MApplication.getConfigBean().getLinkPhone();
+        if(phone==null){
+            String text = "濡傛湁闂璇疯仈绯荤鐞嗗憳";
+            SpannableString styledText = new SpannableString(text);
+            styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip3), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+            return styledText;
+        }
+        String text = "濡傛湁闂璇疯仈绯荤鐞嗗憳"+phone;
+        SpannableString styledText = new SpannableString(text);
+        styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip3), 0, text.length()-phone.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        styledText.setSpan(new TextAppearanceSpan(this,R.style.style_tip1), text.length()-phone.length()+1, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        return styledText;
+    }
+
+    private int tipDownCount = 60;
+    private boolean isShowTip;
+    @Subscribe
+    public void TimeClockEvent(TimeClockEvent e){
+        if(isShowTip){
+            getDB().tvDjs.setVisibility(View.VISIBLE);
+            getDB().tvTitle.setVisibility(View.GONE);
+            if(tipDownCount==0){
+                isShowTip = false;
+                getDB().tvDjs.setVisibility(View.GONE);
+                finish();
+            }else {
+                tipDownCount--;
+                getDB().tvDjs.setText(tipDownCount+"s");
+            }
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        handler.removeCallbacksAndMessages(null);
+        handler = null;
+        mBCancel = true;
+        if(mDevComm!=null){
+            mDevComm.CloseComm();
+        }
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void HttpEvent(HttpEvent e){
+        if(!isFinishing()){
+            getVM().addInfo(e.getMsg());
+        }
+    }
+    private static DevComm mDevComm;
+    //鏈�澶ф寚绾规暟
+    private int maxFpCount = 500;
+    //鏄惁缁撴潫褰曞叆
+    private boolean mBCancel = true;
+    private byte[] m_binImage = new byte[1024 * 100];
+    private byte[] m_bmpImage = new byte[1024 * 100];
+    private int m_nParam, m_nImgWidth, m_nImgHeight;
+
+    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) {
+                    runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            getVM().addInfo("鍒濆鍖栬澶囧け璐�");
+                        }
+                    });
+                    return;
+                }
+            }
+            if (mDevComm.Run_TestConnection() == DevComm.ERR_SUCCESS) {
+                if (mDevComm.Run_GetDeviceInfo(w_strInfo) == DevComm.ERR_SUCCESS) {
+                    runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            getVM().addInfo("寮�鍚澶囨垚鍔�");
+                        }
+                    });
+                } else {
+                    runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            getVM().addInfo("杩炴帴璁惧澶辫触3," + mDevComm.Run_GetDeviceInfo(w_strInfo));
+                        }
+                    });
+                }
+            } else {
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        getVM().addInfo("杩炴帴璁惧澶辫触4,"+mDevComm.Run_TestConnection());
+                    }
+                });
+                mDevComm.CloseComm();
+            }
+        }
+    }
+
+
+    /**
+     * 褰曞叆鎸囩汗
+     */
+    private void enrollBtn() {
+        int w_nRet;
+        int[] w_nState = new int[1];
+
+        if (!mDevComm.IsInit())
+            return;
+        int m_nUserID = getEmptyID();
+        EventBus.getDefault().post(new HttpEvent("userId="+m_nUserID));
+        if (m_nUserID > (maxFpCount) || m_nUserID < 1) {
+            Toast.makeText(mContext, "宸茶揪鍒版渶澶ф寚绾规暟", Toast.LENGTH_SHORT).show();
+            return;
+        }
+
+        // Check if fp is exist
+        w_nRet = mDevComm.Run_GetStatus(m_nUserID, w_nState);
+
+        if (w_nRet != DevComm.ERR_SUCCESS) {
+            Toast.makeText(mContext, DevComm.GetErrorMsg(w_nRet), Toast.LENGTH_SHORT).show();
+            return;
+        }
+
+        if (w_nState[0] == DevComm.GD_TEMPLATE_NOT_EMPTY) {
+            Toast.makeText(mContext, "妯℃澘宸插瓨鍦�", Toast.LENGTH_SHORT).show();
+            return;
+        }
+
+        mDevComm.Run_SLEDControl(1);
+        mBCancel = false;
+        new Thread(new Runnable() {
+            int w_nRet, w_nUserID, w_nEnrollStep = 0, w_nGenCount = 3;
+            int[] w_nDupID = new int[1];
+            int[] w_nWidth = new int[1];
+            int[] w_nHeight = new int[1];
+
+            @Override
+            public void run() {
+
+                w_nUserID = m_nUserID;
+
+                while (w_nEnrollStep < w_nGenCount) {
+                    if(w_nEnrollStep==1) {
+                        showFingerTip("璇风浜屾灏嗘墜鎸囨斁缃湪鎸囩汗閲囬泦鍣ㄤ笂杩涜褰曞叆");
+                    }else if(w_nEnrollStep==2) {
+                        showFingerTip("璇风涓夋灏嗘墜鎸囨斁缃湪鎸囩汗閲囬泦鍣ㄤ笂杩涜褰曞叆");
+                    }
+                    EventBus.getDefault().post(new HttpEvent(String.format("杈撳叆鎵嬫寚 #%d!", w_nEnrollStep + 1)));
+                    // 鑾峰彇鎸囩汗
+                    if (capturing() < 0)
+                        return;
+                    EventBus.getDefault().post(new HttpEvent("鏉惧紑浣犵殑鎵嬫寚"));
+                    showFingerTip("璇锋澗寮�浣犵殑鎵嬫寚");
+                    // 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) {
+                            EventBus.getDefault().post(new HttpEvent(DevComm.GetErrorMsg(w_nRet)));
+                            return;
+                        }
+
+                        // Draw image
+                        m_nImgWidth = w_nWidth[0];
+                        m_nImgHeight = w_nHeight[0];
+                    }
+
+                    //鐢熸垚鎸囩汗
+                    w_nRet = mDevComm.Run_Generate(w_nEnrollStep);
+
+                    if (w_nRet != DevComm.ERR_SUCCESS) {
+                        if (w_nRet == DevComm.ERR_BAD_QUALITY) {
+                            EventBus.getDefault().post(new HttpEvent("璐ㄩ噺涓嶄匠銆傝閲嶈瘯"));
+                            showErrTip("璐ㄩ噺涓嶄匠銆傝閲嶈瘯");
+                            continue;
+                        } else {
+                            EventBus.getDefault().post(new HttpEvent(DevComm.GetErrorMsg(w_nRet)));
+                            showErrTip(DevComm.GetErrorMsg(w_nRet));
+                            return;
+                        }
+                    }
+                    w_nEnrollStep++;
+                }
+
+                // 鍚堟垚鎸囩汗
+                if (w_nGenCount != 1) {
+                    //. Merge Template
+                    w_nRet = mDevComm.Run_Merge(0, w_nGenCount);
+
+                    if (w_nRet != DevComm.ERR_SUCCESS) {
+                        EventBus.getDefault().post(new HttpEvent(DevComm.GetErrorMsg(w_nRet)));
+                        showErrTip(DevComm.GetErrorMsg(w_nRet));
+                        return;
+                    }
+                }
+
+                //. Store template
+                w_nRet = mDevComm.Run_StoreChar(w_nUserID, 0, w_nDupID);
+
+                if (w_nRet != DevComm.ERR_SUCCESS) {
+                    if (w_nRet == DevComm.ERR_DUPLICATION_ID) {
+                        showErrTip("鎸囩汗宸插綍鍏�,涓嶈兘閲嶅褰曞叆");
+                    }else{
+                        showErrTip("");
+                        runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                Toast.makeText(ZWLRActivity.this, DevComm.GetErrorMsg(w_nRet), Toast.LENGTH_SHORT).show();
+                            }
+                        });
+                    }
+                } else{
+                    lrcg(w_nUserID);
+                }
+            }
+        }).start();
+    }
+
+    /**
+     * 鑾峰彇绌烘寚绾筰d
+     * @return
+     */
+    private int getEmptyID() {
+        int w_nRet;
+        int[] w_nEmptyID = new int[1];
+
+        if (!mDevComm.IsInit())
+            return -1;
+
+        w_nRet = mDevComm.Run_GetEmptyID(1, maxFpCount, w_nEmptyID);
+
+        if (w_nRet != DevComm.ERR_SUCCESS) {
+            Toast.makeText(mContext, DevComm.GetErrorMsg(w_nRet), Toast.LENGTH_SHORT).show();
+            return -1;
+        }
+        return w_nEmptyID[0];
+    }
+
+    /**
+     * 鑾峰彇鎸囩汗
+     * @return
+     */
+    private int capturing() {
+        int w_nRet;
+        while (true) {
+            if(isFinishing()){
+               break;
+            }
+            w_nRet = mDevComm.Run_GetImage();
+
+            if (w_nRet == DevComm.ERR_CONNECTION) {
+                showErrTip("閫氫俊閿欒!");
+                return -1;
+            } else if (w_nRet == DevComm.ERR_SUCCESS)
+                break;
+
+            if (mBCancel) {
+                return -1;
+            }
+        }
+        return 0;
+    }
+
+    private void deleteID(int fingerId) {
+        int m_nUserID = fingerId;
+        int w_nRet;
+
+        if (!mDevComm.IsInit())
+            return;
+
+        w_nRet = mDevComm.Run_DelChar(m_nUserID, m_nUserID);
+
+        if (w_nRet != DevComm.ERR_SUCCESS&&w_nRet!=DevComm.ERR_TMPL_EMPTY) {
+            //妯℃澘涓嶅瓨鍦ㄧ殑涔熺畻鍒犻櫎
+            delFinger = null;
+            showToast(DevComm.GetErrorMsg(w_nRet));
+            return;
+        }
+        showToast("鍒犻櫎鎴愬姛");
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                DaoManager.getFingerPrintDao().delete(delFinger);
+                delFinger = null;
+                getDatas();
+                EventBus.getDefault().post(new RefreshFingerEvent());
+            }
+        });
+    }
+
+
+}
\ No newline at end of file

--
Gitblit v1.9.3