keyCabinet-android/app/build.gradle
@@ -26,7 +26,7 @@ ndk { moduleName "facesdk" ldLibs "log" abiFilters "armeabi-v7a","x86" // "armeabi", "x86", "arm64-v8a" abiFilters "arm64-v8a" } multiDexEnabled true } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/MApplication.java
@@ -9,7 +9,6 @@ import android.widget.ImageView; import androidx.annotation.Nullable; import com.doumee.keyCabinet.bean.DevConfigBean; import com.doumee.keyCabinet.bean.LoginBean; import com.doumee.keyCabinet.utils.CrashHandler; keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
@@ -5,6 +5,7 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Color; import android.hardware.Camera; import android.os.Bundle; import android.os.Handler; @@ -15,6 +16,7 @@ import android.text.Spanned; import android.text.TextUtils; import android.text.TextWatcher; import android.text.format.DateUtils; import android.text.style.TextAppearanceSpan; import android.view.View; import android.view.ViewTreeObserver; @@ -37,6 +39,7 @@ import com.doumee.keyCabinet.event.TimeClockEvent; import com.doumee.keyCabinet.ui.keyCabinet.KeyCabinetActivity; import com.doumee.keyCabinet.utils.BraceletLogUtils; import com.doumee.keyCabinet.utils.CrashHandler; import com.doumee.keyCabinet.utils.face.FaceUtils; import com.doumee.keyCabinet.utils.face.model.SingleBaseConfig; import com.doumee.keyCabinet.utils.usb.DevComm; @@ -57,6 +60,7 @@ import com.example.datalibrary.model.LivenessModel; import com.example.datalibrary.model.User; import com.example.datalibrary.utils.FaceOnDrawTexturViewUtil; import com.example.datalibrary.utils.FileUtils; import com.example.datalibrary.utils.ToastUtils; import org.greenrobot.eventbus.EventBus; @@ -64,6 +68,7 @@ import org.greenrobot.eventbus.ThreadMode; import java.math.BigDecimal; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -572,6 +577,9 @@ @Override public void onTip(int code, String msg) { if(1==code) { SpUtil.saveString(CrashHandler.FILE_NAME + StringUtil.DateToStr(new Date()), msg); } if(isToChose){ return; } @@ -728,46 +736,25 @@ 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")?"管理员":"司机")));*/ //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; //识别成功,跳转 @@ -979,12 +966,7 @@ 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(); } } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ZWLRActivity.java
@@ -256,12 +256,6 @@ } } @Subscribe(threadMode = ThreadMode.MAIN) public void HttpEvent(HttpEvent e){ if(!isFinishing()){ getVM().addInfo(e.getMsg()); } } private static DevComm mDevComm; //最大指纹数 private int maxFpCount = 500; keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
@@ -135,6 +135,7 @@ import java.util.List; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.regex.Matcher; @@ -229,23 +230,6 @@ getPermission(); mXService = new MyService(this); //Timber.tag("====>").d(LMobileInfo.getDeviceUniqueId()); Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { String time2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); getVM().addInfo("GlobalException线程报错:" + thread.getName()); try { ByteArrayOutputStream out = new ByteArrayOutputStream(); PrintStream print = new PrintStream(out); //导出发生异常的时间 print.println(time2); print.println(); throwable.printStackTrace(print); SpUtil.saveString(CrashHandler.FILE_NAME+time2,new String(out.toByteArray())); print.close(); } catch (Exception e) { e.printStackTrace(); getVM().addInfo("错误日志2"+e.getMessage()); } }); } private void initM(){ @@ -260,6 +244,7 @@ if((availableMemory<100&&showTime!=null&&(System.currentTimeMillis()-showTime>5000))|| ("02:00:00".equals(StringUtil.getHM()))){ //可用内存小于400M,或者每天凌晨2点,重启app //ToastView.show(MApplication.mContext,"内存紧张,重新启动"); restartApp(); } } @@ -315,7 +300,6 @@ } lastDownTime1 = System.currentTimeMillis(); downCount1++; System.out.println(); //Timber.tag("==>").d(""+downCount1); if(downCount1>4) { downCount1=0; @@ -342,7 +326,6 @@ } } }); getDB().imgLeft.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v1) { @@ -585,7 +568,6 @@ @Subscribe public void GetFacesEvent(GetFacesEvent event){ getVM().addInfo("查询人脸数据======》"); if(!isFinishing()&&!isUpdatingFace){ getVM().addInfo("查询人脸数据======》isDBLoad = "+isDBLoad); if(isDBLoad){ @@ -1385,7 +1367,7 @@ @Subscribe(threadMode = ThreadMode.MAIN) public void HttpEvent(HttpEvent e){ if(!isFinishing()){ if(!isFinishing()&&getVM()!=null){ getVM().addInfo(e.getMsg()); } } keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
@@ -565,7 +565,7 @@ @Override public void run() { try { // 获取BDFaceCheckConfig配置信息 if (bdFaceCheckConfig == null) { @@ -580,6 +580,8 @@ @Override public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) { try { // 人脸id赋值 if (mLastFaceId != fastFaceInfos[0].faceID) { @@ -849,6 +851,11 @@ if (faceDetectCallBack != null) { faceDetectCallBack.onFaceDetectCallback(livenessModel); } }catch (RuntimeException e){ faceDetectCallBack.onTip(1,e.getMessage()); }catch (Exception e){ faceDetectCallBack.onTip(1,e.getMessage()); } } @Override @@ -859,6 +866,11 @@ } } }); }catch (RuntimeException e){ faceDetectCallBack.onTip(1,e.getMessage()); }catch (Exception e){ faceDetectCallBack.onTip(1,e.getMessage()); } } }); } @@ -884,82 +896,6 @@ } } return isBestImageCheck; } /** * 特征提取-人脸识别比对 * * @param rgbInstance 可见光底层送检对象 * @param landmark 检测眼睛,嘴巴,鼻子,72个关键点 * @param faceInfos nir人脸数据 * @param nirInstance nir 图像句柄 * @param livenessModel 检测结果数据集合 * @param featureCheckMode 特征抽取模式【不提取特征:1】;【提取特征:2】;【提取特征+1:N检索:3】; * @param featureType 特征抽取模态执行 【生活照:1】;【证件照:2】;【混合模态:3】; */ private void onFeatureCheck( BDFaceImageInstance rgbInstance, BDFaceCheckConfig bdFaceCheckConfig, float[] landmark, FaceInfo[] faceInfos, BDFaceImageInstance nirInstance, LivenessModel livenessModel, byte[] secondFeature, final int featureCheckMode, final int featureType) { // 如果不抽取特征,直接返回 if (featureCheckMode == 1) { return; } byte[] feature = new byte[512]; if (featureType == 3) { // todo: 混合模态使用方式是根据图片的曝光来选择需要使用的type,光照的取值范围为:0~1之间 AtomicInteger atomicInteger = new AtomicInteger(); FaceSDKManager.getInstance().getImageIllum().imageIllum(rgbInstance, atomicInteger); int illumScore = atomicInteger.get(); BDQualityConfig bdQualityConfig = bdFaceCheckConfig.bdQualityConfig; boolean isIllum = bdQualityConfig != null ? illumScore < bdQualityConfig.illum : false; BDFaceSDKCommon.FeatureType type = isIllum ? BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_NIR : BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO; BDFaceImageInstance bdFaceImageInstance = isIllum ? nirInstance : rgbInstance; float[] landmarks = isIllum ? faceInfos[0].landmarks : landmark; long startFeatureTime = System.currentTimeMillis(); float featureSize = faceModel.getFaceFeature().feature(type, bdFaceImageInstance, landmarks, feature); livenessModel.setFeatureDuration(System.currentTimeMillis() - startFeatureTime); livenessModel.setFeature(feature); // 人脸检索 featureSearch( featureCheckMode, livenessModel, bdFaceCheckConfig, feature, secondFeature, featureSize, BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO); } else { // 生活照检索 long startFeatureTime = System.currentTimeMillis(); float featureSize = faceModel .getFaceFeature() .feature( BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO, rgbInstance, landmark, feature); livenessModel.setFeatureDuration(System.currentTimeMillis() - startFeatureTime); livenessModel.setFeature(feature); livenessModel.setFeatureDuration(System.currentTimeMillis() - startFeatureTime); // 人脸检索 featureSearch( featureCheckMode, livenessModel, bdFaceCheckConfig, feature, secondFeature, featureSize, BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO); } } /** @@ -1384,6 +1320,7 @@ @Override public void run() { try { onDetect( bdFaceCheckConfig, rgbInstance, @@ -1392,6 +1329,7 @@ new DetectListener() { @Override public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) { try { // 人脸id赋值 if (mLastFaceId != fastFaceInfos[0].faceID) { mLastFaceId = fastFaceInfos[0].faceID; @@ -1551,6 +1489,11 @@ } } }); }catch (RuntimeException e){ faceDetectCallBack.onTip(1,e.getMessage()); }catch (Exception e){ faceDetectCallBack.onTip(1,e.getMessage()); } } @Override @@ -1561,6 +1504,11 @@ } } }); }catch (RuntimeException e){ faceDetectCallBack.onTip(1,e.getMessage()); }catch (Exception e){ faceDetectCallBack.onTip(1,e.getMessage()); } } }); }