rk
4 天以前 4a8ff39b0fab0627ef8f7459587d514cc01c3676
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,526 @@
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<FaceVM, FaceActivityBinding> 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();
    }
}