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.os.SystemClock; import android.text.Editable; import android.text.SpannableString; import android.text.Spanned; import android.text.TextUtils; import android.text.TextWatcher; import android.text.style.TextAppearanceSpan; import android.view.View; import android.view.ViewTreeObserver; import android.view.inputmethod.InputMethodManager; import android.widget.TextView; import android.widget.Toast; 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.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; 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 com.example.datalibrary.utils.ToastUtils; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.math.BigDecimal; import dagger.hilt.android.AndroidEntryPoint; @AndroidEntryPoint public class FaceActivity extends MyBaseActivity 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(); FaceSDKManager.getInstance().initDataBases(this); initFaceCheck(); initView(); if(flag==0){ if(MApplication.getConfigBean().getDoubleAuth()==1){ statusFsm(0); }else { statusFsm(2); } }else { statusFsm(7); } getDB().tvDjs.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { statusFsm(status); } }); } @Override public void initData(@Nullable Bundle savedInstanceState) { //getPermission(); initDev(); } @Override protected void timeChange(String djs) { getDB().tvDjs.setText(djs); } 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 void statusFsm(int toStatus){ status = toStatus; isToChose = false; getDB().etEwm.requestFocus(); switch (toStatus){ case 0: //取-管理员人脸验证 getDB().tvTitle.setText("管理员身份验证"); getDB().clCard.setVisibility(View.GONE); getDB().clZw.setVisibility(View.GONE); getDB().clFace.setVisibility(View.VISIBLE); setFaceModel(0); setFingerStatus(1); break; case 10: //取-管理员指纹验证 getDB().tvTitle.setText("管理员身份验证"); getDB().clCard.setVisibility(View.GONE); getDB().clFace.setVisibility(View.GONE); getDB().clZw.setVisibility(View.VISIBLE); setFaceModel(2); setFingerStatus(0); break; case 1: //取-管理员刷卡验证 getDB().etEwm.setText(""); getDB().tvTitle.setText("管理员身份验证"); getDB().clFace.setVisibility(View.GONE); getDB().clZw.setVisibility(View.GONE); getDB().clCard.setVisibility(View.VISIBLE); setFaceModel(2); setFingerStatus(1); break; case 5: //取-司机验证方式选择页 getDB().tvTitle.setText("司机身份验证"); getDB().clFace.setVisibility(View.GONE); getDB().clZw.setVisibility(View.GONE); getDB().clCard.setVisibility(View.GONE); getDB().clTip1.setVisibility(View.GONE); getDB().clSjXuan.setVisibility(View.VISIBLE); getDB().clSjXuan.invalidate(); getDB().clSjXuan.requestLayout(); break; case 2: //取-司机人脸验证 getDB().tvTitle.setText("司机身份验证"); getDB().clCard.setVisibility(View.GONE); getDB().clZw.setVisibility(View.GONE); getDB().clSjXuan.setVisibility(View.GONE); getDB().clFace.setVisibility(View.VISIBLE); setFaceModel(1); setFingerStatus(1); break; case 11: //取-司机指纹验证 getDB().tvTitle.setText("司机身份验证"); getDB().clCard.setVisibility(View.GONE); getDB().clFace.setVisibility(View.GONE); getDB().clSjXuan.setVisibility(View.GONE); getDB().clZw.setVisibility(View.VISIBLE); setFaceModel(2); setFingerStatus(0); break; case 3: //取-司机刷卡验证 getDB().etEwm.setText(""); getDB().etEwm.requestFocus(); getDB().tvTitle.setText("司机身份验证"); getDB().clFace.setVisibility(View.GONE); getDB().clZw.setVisibility(View.GONE); getDB().clSjXuan.setVisibility(View.GONE); getDB().clCard.setVisibility(View.VISIBLE); setFaceModel(2); setFingerStatus(1); break; case 4: //取-司机酒精检测 getDB().tvTitle.setText("酒精检测"); getDB().clFace.setVisibility(View.GONE); getDB().clCard.setVisibility(View.GONE); getDB().clZw.setVisibility(View.GONE); getDB().clSjXuan.setVisibility(View.GONE); getDB().clTip1.setVisibility(View.GONE); getDB().clJiu.setVisibility(View.VISIBLE); getDB().clJiu.invalidate(); getDB().clJiu.requestLayout(); if(MApplication.getConfigBean()!=null&&MApplication.getConfigBean().getCabinetConfigDataVO()!=null&& MApplication.getConfigBean().getCabinetConfigDataVO().getConcentration()!=null){ //开始检测 EventBus.getDefault().post(new JiujinBeginEvent()); }else { ToastView.show(this,"未获取到酒精浓度报警值"); statusFsm(6); } break; case 6: //取-司机酒精检测失败 //Toast.makeText(mContext, "司机酒精检测失败", Toast.LENGTH_SHORT).show(); getDB().clJiu.setVisibility(View.GONE); getDB().tvJg1.setText("酒精检测操作不当,请重新检测"); getDB().clTip1.setVisibility(View.VISIBLE); break; case 7: //还-司机人脸验证 getDB().tvTitle.setText("司机身份验证"); getDB().clCard.setVisibility(View.GONE); 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: //还-司机刷卡验证 getDB().etEwm.setText(""); getDB().etEwm.requestFocus(); getDB().tvTitle.setText("司机身份验证"); getDB().clFace.setVisibility(View.GONE); getDB().clCard.setVisibility(View.VISIBLE); setFaceModel(2); setFingerStatus(1); break; case 9: //取-司机酒精检测失败 getDB().clJiu.setVisibility(View.GONE); getDB().tvJg1.setText("酒精检测超标"); getDB().clTip1.setVisibility(View.VISIBLE); break; default: break; } } private void setFaceModel(int faceModel){ if(faceModel==0){ //管理员 FaceSDKManager.getInstance().setGroupId("0"); isToChose = false; }else if(faceModel==1){ //司机 FaceSDKManager.getInstance().setGroupId("1"); isToChose = false; }else { isToChose = true; } } private void setFingerStatus(int fs){ if(fs==0){ //开始检测 identify(); }else { //关闭检测 mBCancel = true; } } private Bitmap bitmap; private byte[] secondFeature = new byte[512]; @Override protected void doRegister(int type, ActionEventData data) { switch (type){ case 1: if(flag==0){ //切换到管理员刷卡 if(status==0||status==10){ statusFsm(1); }else if(status==2||status==11){ statusFsm(3); } }else { //还-司机刷卡验证 statusFsm(8); } break; case 9: //指纹验证 if(status==0) { statusFsm(10); }else { statusFsm(12); } break; case 10: //司机指纹验证 statusFsm(11); break; case 11: //刷卡-->指纹验证 if(flag==0){ if(status==1){ statusFsm(10); }else { statusFsm(11); } }else { //还-司机指纹 statusFsm(12); } break; case 2: //切换司机刷卡 statusFsm(3); break; case 3: //切换司机人脸 statusFsm(2); break; case 4: //切换到人脸 if(flag==0){ if(status==1||status==10){ statusFsm(0); }else if(status==3||status==11){ statusFsm(2); } }else { statusFsm(7); } break; case 5: statusFsm(4); break; case 6: //管理员ic卡成功 statusFsm(5); break; case 7: //司机ic卡成功 if(flag==0) { //取 if(MApplication.getConfigBean()!=null&&MApplication.getConfigBean().getAlcoholStatus()==1) { //非酒精检测 startActivity(KeyCabinetActivity.class); finish(); }else { //酒精检测 statusFsm(4); } }else { //还 startActivity(KeyCabinetActivity.class); finish(); } break; case 8: getDB().message.setText(data.getData().get("obj").toString()); getDB().message.setVisibility(View.VISIBLE); handler.sendEmptyMessageDelayed(6,2000); getDB().message.invalidate(); getDB().message.requestLayout(); EventBus.getDefault().post(new HttpEvent("ic卡+++++++"+data.getData().get("type").toString())); 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); getDB().tvJg2.setText(getErrPhoneText(), TextView.BufferType.SPANNABLE); //ic卡读取 getDB().etEwm.requestFocus(); getDB().etEwm.setFocusable(true); getDB().etEwm.setShowSoftInputOnFocus(false); hideSoftKeyboard(getDB().etEwm); getDB().etEwm.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { hideSoftKeyboard(getDB().etEwm); } }); getDB().etEwm.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { String m = s.toString(); if(TextUtils.isEmpty(m)){ return; } if(status!=1&&status!=3&&status!=8){ getDB().etEwm.setText(""); getDB().etEwm.requestFocus(); return; } if(handler.hasMessages(5)){ handler.removeMessages(5); } handler.sendEmptyMessageDelayed(5,500); } }); } private void hideSoftKeyboard(View view) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } } @Override protected void onResume() { super.onResume(); 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); FaceSDKManager.getInstance().onDetectCheck(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) { if(isToChose){ return; } /*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(isToChose){ return; } 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; case 3: getDB().clJiujinProgress.setVisibility(View.GONE); //Toast.makeText(mContext, "酒精检查返回", Toast.LENGTH_SHORT).show(); if(new BigDecimal(MApplication.getConfigBean().getCabinetConfigDataVO().getConcentration()) .compareTo(resultEvent.getConcentration())>=0){ //酒精通过 getVM().alcoholTestAlarm(resultEvent.getConcentration().toString()); getDB().clJiujinOk.setVisibility(View.VISIBLE); handler.sendEmptyMessageDelayed(4,1000); }else { //酒精不通过 getVM().alcoholTestAlarm(resultEvent.getConcentration().toString()); //Toast.makeText(mContext, "酒精检测超标", Toast.LENGTH_SHORT).show(); statusFsm(9); //再检测,将声音关闭 EventBus.getDefault().post(new JiujinBeginEvent()); } break; case 4: startActivity(KeyCabinetActivity.class); finish(); break; case 5: String m = getDB().etEwm.getText().toString(); int index = m.indexOf("\r"); if(index!=-1){ m = m.substring(0,index); } if(!TextUtils.isEmpty(m)){ getVM().getMemberIdByCode(m,status==1?"0":"1"); } getDB().etEwm.setText(""); getDB().etEwm.requestFocus(); break; case 6: getDB().message.setVisibility(View.GONE); break; default: 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; FaceSDKManager.getInstance().destroy(); mBCancel = true; if(mDevComm!=null){ mDevComm.CloseComm(); } } 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(isToChose) { return; } 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; //EventBus.getDefault().post(new HttpEvent("人脸用户检测失败------->"+(status==0?"管理员人脸检测:":"司机人脸检测:"))); if (isCompareCheck) { /*getDB().clFail.setVisibility(View.VISIBLE); getDB().tv4.setText(getString(R.string.face_tip2)); handler.sendEmptyMessageDelayed(0,1000);*/ } } else { mUser = user; /*EventBus.getDefault().post(new HttpEvent("人脸用户------->"+(status==0?"管理员人脸检测:":"司机人脸检测:") +(user.getGroupId().equals("0")?"管理员":"司机")));*/ 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()) + " 欢迎您");*/ } isToChose = true; //识别成功,跳转 if(status==0){ //取-管理员 MApplication.getLoginBean().setAutoMemberId(Integer.parseInt(user.getUserId())); //handler.sendEmptyMessageDelayed(7,0); EventBus.getDefault().post(new FaceStatusChangeEvent(5)); }else if(status==2){ //取-司机 CameraPreviewManager.getInstance().stopPreview(); MApplication.getLoginBean().setMemberId(Integer.parseInt(user.getUserId())); MApplication.getLoginBean().setAuthType(0); //handler.sendEmptyMessageDelayed(8,0); //Toast.makeText(mContext, "是否酒精检测:"+MApplication.getConfigBean().getAlcoholStatus(), Toast.LENGTH_SHORT).show(); if(MApplication.getConfigBean()!=null&&MApplication.getConfigBean().getAlcoholStatus()==1) { //非酒精检测 startActivity(KeyCabinetActivity.class); finish(); }else { //酒精检测 EventBus.getDefault().post(new FaceStatusChangeEvent(4)); } }else if(status==7){ //还-司机 MApplication.getLoginBean().setMemberId(Integer.parseInt(user.getUserId())); MApplication.getLoginBean().setAuthType(0); startActivity(KeyCabinetActivity.class); finish(); } } } } }); } @Subscribe(threadMode = ThreadMode.MAIN) public void FaceStatusChangeEvent(FaceStatusChangeEvent e){ if(!isFinishing()){ statusFsm(e.getStatus()); } } boolean isToChose = false; @Override public void onClick(View v) { } @Override protected void onPause() { super.onPause(); isPause = false; isTimePause = true; CameraPreviewManager.getInstance().stopPreview(); } private JiujinResultEvent resultEvent; @Subscribe(threadMode = ThreadMode.MAIN) public void JiujinResultEvent(JiujinResultEvent e){ if(!isFinishing()){ if(status!=4&&status!=6){ return; } //Toast.makeText(mContext, "酒精检测返回:"+e.isOk(), Toast.LENGTH_SHORT).show(); if(!e.isOk()){ getDB().clJiujinProgress.setVisibility(View.GONE); statusFsm(6); }else { getDB().clJiujinProgress.setVisibility(View.VISIBLE); if(resultEvent==null){ resultEvent = e; }else if(resultEvent.getConcentration().compareTo(e.getConcentration())<0){ //值更大 resultEvent = e; } if(handler.hasMessages(3)){ handler.removeMessages(3); } handler.sendEmptyMessageDelayed(3,1000); } } } /**------------------------指纹模块--------------------------*/ 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(); } }); } } }