中控智慧身份證讀卡器工具類
阿新 • • 發佈:2018-11-04
自定義一個身份證回撥介面
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();