rk
昨天 99b89dc0ae4fbe90c6d629a223ad730986ffd8f3
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
@@ -9,9 +9,12 @@
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;
@@ -23,20 +26,28 @@
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;
@@ -108,6 +119,7 @@
    @Override
    public void initData(@Nullable Bundle savedInstanceState) {
        //getPermission();
        initDev();
    }
    @Override
@@ -117,6 +129,12 @@
    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);
@@ -127,25 +145,41 @@
    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);
@@ -156,23 +190,40 @@
                //取-司机人脸验证
                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);
@@ -183,29 +234,50 @@
                    //开始检测
                    EventBus.getDefault().post(new JiujinBeginEvent());
                }else {
                    ToastUtils.toast(this,"未获取到酒精浓度报警值");
                    ToastView.show(this,"未获取到酒精浓度报警值");
                    statusFsm(6);
                }
                break;
            case 6:
                //取-司机酒精检测失败
                Toast.makeText(mContext, "司机酒精检测失败", Toast.LENGTH_SHORT).show();
                //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;
@@ -226,21 +298,57 @@
        }
    }
    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){
                    //切换到管理员刷卡
                    if(status==0||status==10){
                        statusFsm(1);
                    }else if(status==2){
                    }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:
@@ -254,9 +362,9 @@
            case 4:
                //切换到人脸
                if(flag==0){
                    if(status==1){
                    if(status==1||status==10){
                        statusFsm(0);
                    }else if(status==3){
                    }else if(status==3||status==11){
                        statusFsm(2);
                    }
                }else {
@@ -266,6 +374,37 @@
            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;
        }
@@ -296,12 +435,42 @@
        //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);
            }
        });
    }
@@ -428,22 +597,41 @@
                    //isCheckFace = false;
                    break;
                case 3:
                    Toast.makeText(mContext, "酒精检查返回", Toast.LENGTH_SHORT).show();
                    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("");
                        Toast.makeText(mContext, "酒精检测不通过", Toast.LENGTH_SHORT).show();
                        statusFsm(6);
                        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;
@@ -484,6 +672,10 @@
        faceDetectCallBack = null;
        glMantleSurfacView = null;
        FaceSDKManager.getInstance().destroy();
        mBCancel = true;
        if(mDevComm!=null){
            mDevComm.CloseComm();
        }
    }
    private int resultCount = 0;
@@ -522,6 +714,7 @@
                    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));
@@ -530,6 +723,8 @@
                    } 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)) {
@@ -554,7 +749,15 @@
                            MApplication.getLoginBean().setMemberId(Integer.parseInt(user.getUserId()));
                            MApplication.getLoginBean().setAuthType(0);
                            //handler.sendEmptyMessageDelayed(8,0);
                            EventBus.getDefault().post(new FaceStatusChangeEvent(4));
                            //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()));
@@ -594,10 +797,15 @@
    @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){
@@ -611,4 +819,235 @@
            }
        }
    }
    /**------------------------指纹模块--------------------------*/
    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();
                }
            });
        }
    }
}