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