1. 程式人生 > >中控智慧身份證讀卡器工具類

中控智慧身份證讀卡器工具類

自定義一個身份證回撥介面

import com.zkteco.android.biometric.module.idcard.meta.IDCardInfo;

/**
 * developer : xuyanyun
 * tel : 139159*****
 * createTime : 2018/8/14 16:36
 * viewName :
 * remark :
 * hasBug : unKnown
 */
public interface ReadCardInterface {
    /**
     * 獲取身份證資訊
     * @param info
     */
    void  getIdentityInfo(IDCardInfo info);

    /**
     * 獲取身份證失敗
     */
    void getIdentityInfoFailed();

    /**
     * 相同的身份證
     */
    void getSameIdentityInfo();

    /**
     * 身份證拿開
     */
    void leaveCard();
}

 

寫一個工具類

import android.os.AsyncTask;

import com.hdd.lancity.pad.App;
import com.zkteco.android.biometric.core.device.ParameterHelper;
import com.zkteco.android.biometric.core.device.TransportType;
import com.zkteco.android.biometric.module.idcard.IDCardReader;
import com.zkteco.android.biometric.module.idcard.IDCardReaderFactory;
import com.zkteco.android.biometric.module.idcard.exception.IDCardReaderException;
import com.zkteco.android.biometric.module.idcard.meta.IDCardInfo;

import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

/**
 * developer : xuyanyun
 * tel : 139159*****
 * createTime : 2018/9/29 22:33
 * viewName :
 * remark :
 * hasBug : unKnown
 */
public enum IDeviceControlUtil {
    INS;
    private final int VID = 1024;    //IDR VID
    private final int PID = 50010;     //IDR PID
    /**
     * 身份證讀卡
     */
    private IDCardReader idCardReader = null;
    /**
     * 身份證讀卡器是否開啟
     */
    private boolean bopen;
    /**
     * 是否迴圈讀取
     * false 單次   true 迴圈
     */
    private boolean isCircle = false;

    /**
     * 是否暫停讀取
     * false 不暫停   true 暫停
     */
    private boolean isPause = false;
    private boolean isRunningTask = false;
    private ReadCardInterface readCardInterface;

    public void setReadCardInterface(ReadCardInterface readCardInterface) {
        this.readCardInterface = readCardInterface;
    }

    /**
     * 獲取身份證讀卡器物件
     * 第一步
     *
     * @return
     */
    public void initDevcie() {
            Map<String, Object> idrparams = new HashMap();
            idrparams.put(ParameterHelper.PARAM_KEY_VID, VID);
            idrparams.put(ParameterHelper.PARAM_KEY_PID, PID);
            idCardReader = IDCardReaderFactory.createIDCardReader(App.getIns(), TransportType.USB, idrparams);
    }
    private IDCardReader getReader(){
        if (null == idCardReader){
            initDevcie();
        }
        return idCardReader;
    }
//獲取IDCardReader物件,然後開啟裝置,開啟成功開始讀取

    /**
     * 開啟身份證讀卡器
     * 第二步
     */
    public void openDevice() {
        try {
            if (bopen) return;
            getReader().open(0);
            getReader().getSAMID(0);
            bopen = true;
        } catch (IDCardReaderException e) {
            bopen = false;
//            Log.e("", "連線裝置失敗, 錯誤碼:" + e.getErrorCode() + "\n錯誤資訊:" + e.getMessage() + "\n 內部錯誤碼=" + e.getInternalErrorCode());
        }
    }

    /**
     * 查詢裝置
     */
    private void findDevice() {
        try {
            getReader().findCard(0);
        } catch (IDCardReaderException e) {
        }
    }

    /**
     * 選擇裝置
     */
    private void selectDevice() {
        try {
            getReader().selectCard(0);
        } catch (IDCardReaderException e) {
        }
    }

    /**
     * 關閉裝置
     */
    public void closeDevice() {
        try {
            if (bopen) {
                getReader().close(0);
                bopen = false;
            }
        } catch (IDCardReaderException e) {
//            Log.e("", "關閉裝置失敗, 錯誤碼:" + e.getErrorCode() + "\n錯誤資訊:" + e.getMessage() + "\n 內部錯誤碼=" + e.getInternalErrorCode());
        }
    }
    /**
     * 銷燬
     */
    public void destoryReader() {
        destoryTimer();
        if(null!=mAsyncTask){
            mAsyncTask.cancel(true);
        }
        IDCardReaderFactory.destroy(getReader());
        idCardReader = null ;
    }

    //讀取身份證的現成
    private GetIDInfoTask mAsyncTask;
    //當身份證已經讀取到後,在後面的都是同一個
    private long hasRead = 0l ;
    private class GetIDInfoTask extends AsyncTask<Void, Integer, IDCardInfo> {
        @Override
        protected void onPreExecute() {//before thread
            super.onPreExecute();
        }

        @Override
        protected IDCardInfo doInBackground(Void... arg0) {
            if (!bopen)
                return null;
            IDCardInfo idCardInfo = null;
            try {
                idCardInfo = new IDCardInfo();
                findDevice();
                selectDevice();
                boolean ret = getReader().readCard(0, 1, idCardInfo);
                if (ret) {
                    return idCardInfo;
                }
                return null;
            } catch (IDCardReaderException e) {
            }
            return null;
        }
        //        最終處理
        @Override
        protected void onPostExecute(IDCardInfo result) {
            super.onPostExecute(result);
            if (null != result) {
                if (0 == hasRead ){
                    readCardInterface.getIdentityInfo(result);
                }else{
                    readCardInterface.getSameIdentityInfo();
                }
                hasRead ++ ;
            } else {
                //只會呼叫一次
                if (hasRead!=0){
                    readCardInterface.leaveCard();
                }else{
                    readCardInterface.getIdentityInfoFailed();
                }
                hasRead = 0 ;
            }
            //不管讀取成功失敗都要判斷是不是迴圈讀取
            if (isCircle) {
                loopRead();
            }
        }
    }

    /**
     * 讀取身份證
     */
    public void startRead() {
        mAsyncTask = new GetIDInfoTask();
        mAsyncTask.execute();
    }

    private Timer timer;
    private TimerTask task;

    //迴圈讀取
    private void loopRead() {
        if (null == timer) {
            timer = new Timer();
        }
        if (null == task) {
            task = new TimerTask() {
                @Override
                public void run() {
                    if (!isPause) {
                        startRead();
                        return;
                    }
                }
            };
        }
        //2秒鐘讀取一次
        if (!isRunningTask) {
            isRunningTask = true;
            timer.schedule(task, 0, 1500);
        }
    }

    //銷燬定時器
    public void destoryTimer() {
        if (null != timer) {
            timer.cancel();
            timer = null;
        }
        if (null != task) {
            task.cancel();
            task = null;
        }
    }

    /**
     * @param bb false 單次   true 迴圈
     */
    public void readTimes(boolean bb) {
        isCircle = bb;
    }

    /**
     * false 不暫停   true 暫停
     *
     * @param bb 這個主要是在onStop 和onResume裡使用
     *           onStop true  onResume false
     */
    public void pauseRead(boolean bb) {
        isPause = bb;
    }
}

 

使用方法

1、在application裡面初始化

IDeviceControlUtil.INS.initDevcie();

2、在使用的Activity裡面做動作,一定要繼承介面

//回撥介面
IDeviceControlUtil.INS.setReadCardInterface(this);
//開啟裝置
IDeviceControlUtil.INS.openDevice();
//迴圈讀取or單次讀取
IDeviceControlUtil.INS.readTimes(true);
//開始
IDeviceControlUtil.INS.startRead();

3、必須要銷燬了

IDeviceControlUtil.INS.closeDevice();
IDeviceControlUtil.INS.destoryReader();