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.text.TextUtils; import android.view.View; 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.databinding.FaceActivityBinding; 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.lib_coremodel.bean.event.ActionEventData; import com.doumee.lib_coremodel.util.SpUtil; import com.example.datalibrary.callback.CameraDataCallback; import com.example.datalibrary.callback.FaceDetectCallBack; 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 org.greenrobot.eventbus.Subscribe; 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(); statusFsm(flag==0?0:2); //todo wmf 解开 /*FaceSDKManager.getInstance().initDataBases(this); initFaceCheck();*/ initView(); } @Override public void initData(@Nullable Bundle savedInstanceState) { //getPermission(); } @Override protected void timeChange(String djs) { getDB().tvDjs.setText(djs); } private void statusFsm(int toStatus){ status = toStatus; switch (status){ case 0: //取-管理员人脸验证 getDB().clLogin.setVisibility(View.VISIBLE); getDB().tvTitle.setText("管理员身份验证"); getDB().vSl.setBackgroundResource(R.mipmap.ic_viewfinder); getDB().tvTip.setText("请保持正脸在取景框中,并根据指示完成识别"); getDB().clRemind.setVisibility(View.VISIBLE); getDB().btSk.setVisibility(View.VISIBLE); getDB().clSjRl.setVisibility(View.GONE); getDB().clSjSk.setVisibility(View.GONE); getDB().clTip1.setVisibility(View.GONE); break; case 1: //取-管理员刷卡验证 getDB().clLogin.setVisibility(View.VISIBLE); getDB().tvTitle.setText("管理员身份验证"); getDB().vSl.setBackgroundResource(R.mipmap.ic_shuaka2); getDB().tvTip.setText("请将IC卡贴近刷卡区,停留1-2秒"); getDB().clRemind.setVisibility(View.GONE); getDB().btSk.setVisibility(View.GONE); getDB().clSjRl.setVisibility(View.GONE); getDB().clSjSk.setVisibility(View.VISIBLE); getDB().clTip1.setVisibility(View.GONE); break; case 5: //取-司机验证方式选择页 getDB().clLogin.setVisibility(View.VISIBLE); getDB().tvTitle.setText("司机身份验证"); getDB().vSl.setBackgroundResource(R.mipmap.ic_face); getDB().tvTip.setText("请保持正脸在取景框中,并根据指示完成识别"); getDB().clRemind.setVisibility(View.VISIBLE); getDB().btSk.setVisibility(View.GONE); getDB().clSjRl.setVisibility(View.VISIBLE); getDB().clSjSk.setVisibility(View.GONE); getDB().clTip1.setVisibility(View.GONE); break; case 2: //取-司机人脸验证 getDB().clLogin.setVisibility(View.VISIBLE); getDB().tvTitle.setText("司机身份验证"); getDB().vSl.setBackgroundResource(R.mipmap.ic_viewfinder); getDB().tvTip.setText("请保持正脸在取景框中,并根据指示完成识别"); getDB().clRemind.setVisibility(View.VISIBLE); getDB().btSk.setVisibility(View.VISIBLE); getDB().clSjRl.setVisibility(View.GONE); getDB().clSjSk.setVisibility(View.GONE); getDB().clTip1.setVisibility(View.GONE); break; case 3: //取-司机刷卡验证 getDB().clLogin.setVisibility(View.VISIBLE); getDB().tvTitle.setText("司机身份验证"); getDB().vSl.setBackgroundResource(R.mipmap.ic_shuaka2); getDB().tvTip.setText("请将IC卡贴近刷卡区,停留1-2秒"); getDB().clRemind.setVisibility(View.GONE); getDB().btSk.setVisibility(View.GONE); getDB().clSjRl.setVisibility(View.GONE); getDB().clSjSk.setVisibility(View.VISIBLE); getDB().clTip1.setVisibility(View.GONE); break; case 4: //取-司机酒精检测 getDB().clLogin.setVisibility(View.VISIBLE); getDB().tvTitle.setText("酒精检测"); getDB().vSl.setBackgroundResource(R.mipmap.ic_jiujingjiance); getDB().tvTip.setText("请拿起酒精检测仪吹气"); getDB().clRemind.setVisibility(View.GONE); getDB().btSk.setVisibility(View.GONE); getDB().clSjRl.setVisibility(View.GONE); getDB().clSjSk.setVisibility(View.GONE); getDB().clTip1.setVisibility(View.GONE); break; case 6: //取-司机酒精检测失败 getDB().clTip1.setVisibility(View.VISIBLE); break; case 7: //还-司机人脸验证 getDB().clLogin.setVisibility(View.VISIBLE); getDB().tvTitle.setText("司机身份验证"); getDB().vSl.setBackgroundResource(R.mipmap.ic_viewfinder); getDB().tvTip.setText("请保持正脸在取景框中,并根据指示完成识别"); getDB().clRemind.setVisibility(View.VISIBLE); getDB().btSk.setVisibility(View.VISIBLE); getDB().clSjSk.setVisibility(View.GONE); getDB().clSjRl.setVisibility(View.GONE); getDB().clTip1.setVisibility(View.GONE); break; case 8: //还-司机刷卡验证 getDB().clLogin.setVisibility(View.VISIBLE); getDB().tvTitle.setText("司机身份验证"); getDB().vSl.setBackgroundResource(R.mipmap.ic_shuaka2); getDB().tvTip.setText("请将IC卡贴近刷卡区,停留1-2秒"); getDB().clRemind.setVisibility(View.GONE); getDB().btSk.setVisibility(View.GONE); getDB().clSjSk.setVisibility(View.VISIBLE); getDB().clSjRl.setVisibility(View.GONE); getDB().clTip1.setVisibility(View.GONE); break; default: break; } } private Bitmap bitmap; private byte[] secondFeature = new byte[512]; @Override protected void doRegister(int type, ActionEventData data) { switch (type){ case 1: //切换到刷卡 if("0".equals(flag)){ if(status==0){ statusFsm(1); }else if(status==2){ statusFsm(3); } }else { statusFsm(8); } break; case 2: //切换司机刷卡 statusFsm(3); break; case 3: //切换司机人脸 statusFsm(2); break; case 4: //切换到人脸 if("0".equals(flag)){ if(status==1){ statusFsm(5); }else if(status==3){ statusFsm(6); } }else { startActivity(KeyCabinetActivity.class); finish(); } //todo wmf //statusFsm("0".equals(flag)?); break; case 5: startActivity(KeyCabinetActivity.class); finish(); 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); } @Override protected void onResume() { super.onResume(); //todo wmf 解开 //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); //必须会员 String groupId = "0"; FaceSDKManager.getInstance().onDetectCheck(groupId,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) { 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 (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; } } }; @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; //todo wmf 解开 //FaceSDKManager.getInstance().destroy(); } 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 (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; if (isCompareCheck) { getDB().clFail.setVisibility(View.VISIBLE); getDB().tv4.setText(getString(R.string.face_tip2)); handler.sendEmptyMessageDelayed(0,1000); } } else { //优先会员 if("0".equals(user.getGroupId())){ 11 }else { if (isCompareCheck) { getDB().clFail.setVisibility(View.VISIBLE); getDB().tv4.setText(getString(R.string.face_tip2)); handler.sendEmptyMessageDelayed(0,1000); } resultCount++; if (resultCount >= 3) { resultCount = 0; }else { return; } } mUser = user; 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()) + " 欢迎您");*/ } if(!isToChose) { isToChose = true; //识别成功,跳转 Bundle bundle = new Bundle(); bundle.putString("busId", user.getUserId()); bundle.putString("type", "0"); //Toast.makeText(mContext, user.getUserName(), Toast.LENGTH_SHORT).show(); //startActivity(ChoseTicketActivity.class, bundle); } } } } }); } boolean isToChose = false; @Override public void onClick(View v) { } @Override protected void onPause() { super.onPause(); isPause = false; isTimePause = true; //todo wmf 解开 //CameraPreviewManager.getInstance().stopPreview(); } }