package com.ectrip.cyt.ui; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.ectrip.scanbarcode_jp.NETutils.WebserviceHelper; import com.ectrip.scanbarcode_jp.R; import com.ectrip.scanbarcode_jp.bean.IdBean; import com.ectrip.scanbarcode_jp.callBack.CheckCallBack; import com.ectrip.scanbarcode_jp.callBack.CheckCallBack_ZJ; import com.ectrip.scanbarcode_jp.callBack.CountCallBack; import com.ectrip.scanbarcode_jp.constens.ParamContants; import com.ectrip.scanbarcode_jp.constens.ParameterContens; import com.ectrip.scanbarcode_jp.utils.LogUtil; import com.ectrip.scanbarcode_jp.utils.PreferenceUtils; import com.ectrip.scanbarcode_jp.utils.SoundUtil; import com.ectrip.scanbarcode_jp.utils.TimesUtils; import com.ectrip.scanbarcode_jp.zxing.MyMap; import com.google.gson.Gson; import com.zkteco.android.biometric.core.device.ParameterHelper; import com.zkteco.android.biometric.core.device.TransportType; import com.zkteco.android.biometric.core.utils.LogHelper; 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 com.znht.iodev2.PowerCtl; import java.util.HashMap; import java.util.List; import java.util.Map; public class ScanHeadActivity extends BaseActivity { private static final String TAG = "ScanHeadActivity"; private final String idSerialName = "/dev/ttysWK2"; //串口路径 private final int idBaudrate = 115200;//波特率 private IDCardReader idCardReader; //二代证读头 private com.znht.iodev2.PowerCtl powerCtl; //模块供电控制 private TextView noId; private TextView title; private TextView count_textView; private Button topBack; private TextView tv_ship_name; private TextView tv_ship_check; private LinearLayout ll_ship,ll_bottom; private TextView tv_total_number; private TextView tv_number; private int type; private String gardenID; private String isIDinFree; private String local_age = "0"; private String local_addr = "0"; private String local_sex = "0"; private String local_id = "0"; private Toast toast; private ReadThread mThread; private void showToast(String info) { if (toast == null) { toast = Toast.makeText(mContext, info, Toast.LENGTH_SHORT); } else { toast.setText(info); } toast.show(); } private final int MSG_INIT_DEV = 0; private final int MSG_GET_ID = 1; private final int MSG_FIND_ID = 2; private final int MSG_SHOW_TOAST = 3; private final int MSG_SHOW_SHIP = 4; private String showCountType; private int checktype; @SuppressLint("HandlerLeak") private Handler mHandle = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case MSG_INIT_DEV: initIDCard(); break; case MSG_GET_ID: showToast("读身份证成功!"); SoundUtil.getInstents(mContext).playWavSound(R.raw.beep); IDCardInfo idCardInfo = (IDCardInfo) msg.obj; IdBean idBean = new IdBean(); idBean.setId(idCardInfo.getId()); idBean.setName(idCardInfo.getName()); idBean.setSex(idCardInfo.getSex()); idBean.setAddr(idCardInfo.getAddress()); checkByID(idBean); break; case MSG_FIND_ID: showToast("发现身份证!"); break; case MSG_SHOW_TOAST: String content = (String) msg.obj; showToast(content); break; case MSG_SHOW_SHIP: getShowShipType(); mHandle.sendEmptyMessageDelayed(MSG_SHOW_SHIP, 10000); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_scan_head); initView(); initData(); initListener(); mHandle.sendEmptyMessageDelayed(MSG_INIT_DEV, 100); } @Override protected void onResume() { super.onResume(); showCountType(); int count = PreferenceUtils.getInt(mContext, "count", 0); count_textView.setText(String.valueOf(count)); running = true; mThread = new ReadThread(); mThread.start(); mHandle.sendEmptyMessageDelayed(MSG_SHOW_SHIP, 100); } private void getShowShipType() { String count = PreferenceUtils.getString(mContext, ParamContants.GET_PASS_TOTAL, "0/0"); String name = PreferenceUtils.getString(mContext, ParamContants.GET_SHIP_NAME, ""); tv_ship_check.setText(count); tv_ship_name.setText(name); } /** * 初始化身份证模块 */ private void initIDCard() { try { //打开二代证供电 powerCtl = new PowerCtl(); powerCtl.identity_uhf_power(1); powerCtl.identity_ctl(1); // Define output log level LogHelper.setLevel(Log.VERBOSE); // Start fingerprint sensor Map idrparams = new HashMap(); //设置串口和波特率 idrparams.put(ParameterHelper.PARAM_SERIAL_SERIALNAME, idSerialName); idrparams.put(ParameterHelper.PARAM_SERIAL_BAUDRATE, idBaudrate); //打开二代证模块 idCardReader = IDCardReaderFactory.createIDCardReader(mContext, TransportType.SERIALPORT, idrparams); if (idCardReader != null) { //打开模块 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } idCardReader.open(0); } } catch (IDCardReaderException e) { //打开模块失败给出提示 Toast.makeText(this, R.string.open_fail, Toast.LENGTH_SHORT).show(); LogHelper.d(getString(R.string.err_message) + ": " + e.getMessage() + "\n" + getString(R.string.err_code) + e.getInternalErrorCode()); } } @Override protected void onPause() { super.onPause(); running = false; mHandle.removeMessages(MSG_GET_ID); mHandle.removeMessages(MSG_FIND_ID); mHandle.removeMessages(MSG_SHOW_TOAST); mHandle.removeMessages(MSG_SHOW_SHIP); } @Override protected void onStop() { super.onStop(); } private void initView() { tv_ship_name = (TextView) findViewById(R.id.tv_ship_name); tv_ship_check = (TextView) findViewById(R.id.tv_ship_check); ll_ship = (LinearLayout) findViewById(R.id.ll_ship); ll_bottom = (LinearLayout) findViewById(R.id.ll_bottom); topBack = (Button) findViewById(R.id.top_back); noId = (TextView) findViewById(R.id.tv_no_id); title = (TextView) findViewById(R.id.top_title); count_textView = (TextView) findViewById(R.id.top_count); tv_total_number = (TextView) findViewById(R.id.tv_total_number); tv_number = (TextView) findViewById(R.id.tv_szticketname); //提示读取身份证区 String keepType = PreferenceUtils.getString(mContext, "keepScreenOn", "yes"); if (keepType.equals("yes")) { topBack.setKeepScreenOn(true); } else { topBack.setKeepScreenOn(false); } type = getIntent().getIntExtra("type", -1); if (type == 1) { title.setText("检票"); } else if (type == 2) { title.setText("监票"); } String showShipType = PreferenceUtils.getString(mContext, "showShipType", "no"); checktype = PreferenceUtils.getInt(mContext, "CHECKTYPE", 0); LogUtil.e(TAG, "showShipType = " + showShipType); if (TextUtils.equals("yes", showShipType)) { ll_ship.setVisibility(View.VISIBLE); } else { ll_ship.setVisibility(View.GONE); } showCountType = PreferenceUtils.getString(mContext, "showCountType", "no"); if (TextUtils.equals("yes", showCountType) ) { ll_bottom.setVisibility(View.VISIBLE); } else { ll_bottom.setVisibility(View.GONE); } } private void initListener() { //点击头部返回键,关闭当前activity topBack.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { finish(); } }); noId.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent phone = new Intent(mContext, InputIdCardActivity.class); phone.putExtra("type", type); startActivity(phone); } }); } private void initData() { gardenID = PreferenceUtils.getString(mContext, ParamContants.GET_ACCID, ""); isIDinFree = PreferenceUtils.getString(mContext, ParameterContens.SET_isIDinFree, "no"); String localStr = PreferenceUtils.getString(mContext, ParameterContens.SET_isIDinFreeContent, ""); LogUtil.i(TAG, "本地免票数据 2 == " + localStr); if (!TextUtils.isEmpty(localStr)) { String[] locals = localStr.split(";"); local_age = locals[0]; local_addr = locals[1]; local_sex = locals[2]; local_id = locals[3]; } } private void checkByID(final IdBean idBean) { String data = ""; String barcode = idBean.getId(); ShowResultActivity.barcode = barcode; if (type == 1) {//检票 boolean isLocalPeople = checkLocalId(idBean); if (isLocalPeople) { Map map = new HashMap(); map.put("message1", "1005"); map.put("message9", barcode); map.put("message5", "免票人员"); map.put("message22", "1人"); map.put("message23", barcode); map.put("message24", idBean.getName()); MyMap myMap = new MyMap(); myMap.setMap(map); Intent intent = new Intent(mContext, ShowResultActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable("resultMap", myMap); bundle.putSerializable("IdBean", idBean); bundle.putString("activityName", TAG); intent.putExtras(bundle); intent.putExtra("type", type); startActivity(intent); return; } data = gardenID + "," + barcode + ",JP"; String reqZJ = PreferenceUtils.getString(mContext, "reqZJ", "no"); if (reqZJ.equals("yes")) { WebserviceHelper.getInstance().checkTickt(gardenID + "," + barcode, "CheckTicket", new CheckCallBack_ZJ(ScanHeadActivity.this) { @Override public void getMap(Map map) { MyMap myMap = new MyMap(); myMap.setMap(map); String ticketFlag = map.get("message1").toString(); if (ticketFlag != null && !"".equals(ticketFlag)) { int flag = Integer.parseInt(ticketFlag); LogUtil.i(TAG, "票状态--------> " + flag); String checkFaceType = PreferenceUtils.getString(mContext, "checkFaceType", "no"); if (TextUtils.equals(checkFaceType, "yes")) { //传递Map到ShowResult.java 显示 myMap.getMap().put("finger", "RL"); Intent intent = new Intent(context, ShowResultActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable("resultMap", myMap); bundle.putString("activityName", TAG); intent.putExtras(bundle); intent.putExtra("type", type); startActivity(intent); // finish(); } else { if (flag == 1) {//登记指纹 SoundUtil.getInstents(ScanHeadActivity.this).playSound(R.raw.dengjizhiwen, -1); Toast.makeText(context, "请登记指纹!", Toast.LENGTH_SHORT).show(); } else if (flag == 2) {//验证指纹 SoundUtil.getInstents(ScanHeadActivity.this).playSound(R.raw.yanzhengzhiwen, -1); Toast.makeText(context, "请验证指纹!", Toast.LENGTH_SHORT).show(); } else {//直接信息显示 //传递Map到ShowResult.java 显示 Intent intent = new Intent(context, ShowResultActivity .class); Bundle bundle = new Bundle(); bundle.putSerializable("resultMap", myMap); bundle.putString("activityName", TAG); intent.putExtras(bundle); intent.putExtra("type", type); startActivity(intent); // finish(); } } } } @Override public void failureToDo() { Toast.makeText(context, "检票失败,请重试", Toast.LENGTH_SHORT).show(); } }, 7); } else { WebserviceHelper.getInstance().test(data, "CheckscTicketmebile", new CheckCallBack (ScanHeadActivity.this) { @Override public void failureToDo() { } @Override public void getMap(Map map) { MyMap myMap = new MyMap(); myMap.setMap(map); String ticketFlag = map.get("message1").toString(); if (ticketFlag != null && !"".equals(ticketFlag)) { int flag = Integer.parseInt(ticketFlag); LogUtil.i(TAG, "票状态--------> " + flag); String checkFaceType = PreferenceUtils.getString(mContext, "checkFaceType", "no"); if (TextUtils.equals(checkFaceType, "yes")) { //传递Map到ShowResult.java 显示 myMap.getMap().put("finger", "RL"); Intent intent = new Intent(context, ShowResultActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable("resultMap", myMap); bundle.putString("activityName", TAG); intent.putExtras(bundle); intent.putExtra("type", type); startActivity(intent); // finish(); } else { if (flag == 1) {//登记指纹 SoundUtil.getInstents(ScanHeadActivity.this).playSound(R.raw.dengjizhiwen, -1); Toast.makeText(context, "请登记指纹!", Toast.LENGTH_SHORT).show(); } else if (flag == 2) {//验证指纹 SoundUtil.getInstents(ScanHeadActivity.this).playSound(R.raw.yanzhengzhiwen, -1); Toast.makeText(context, "请验证指纹!", Toast.LENGTH_SHORT).show(); } else {//直接信息显示 //传递Map到ShowResult.java 显示 Intent intent = new Intent(context, ShowResultActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable("resultMap", myMap); bundle.putString("activityName", TAG); intent.putExtras(bundle); intent.putExtra("type", type); startActivity(intent); // finish(); } } } } }, 2); } } else if (type == 2) { data = gardenID + "," + barcode + ",CX"; WebserviceHelper.getInstance().test(data, "CheckscTicketmebile", new CheckCallBack(ScanHeadActivity.this) { @Override public void failureToDo() { } @Override public void getMap(Map map) { MyMap myMap = new MyMap(); myMap.setMap(map); Intent intent = new Intent(context, ShowResultActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable("resultMap", myMap); intent.putExtras(bundle); startActivity(intent); // finish(); } }, 2); } } private void showCountType() { if (TextUtils.equals(showCountType, "yes")) { String gardenID = PreferenceUtils.getString(mContext, ParamContants.GET_ACCID, ""); Long accid = Long.parseLong(gardenID); WebserviceHelper.getInstance().request(accid, "getCheckcount", new CountCallBack(ScanHeadActivity.this) { @Override public void sucessToDo(Object json) { List list = new Gson().fromJson(json.toString(), List.class); double yun = list.get(1); double yun1 = list.get(2); int piao = (int) yun; int ren = (int) yun1; tv_total_number.setText(ren + "/" + piao); } @Override public void failureToDo() { } }, 4); int count = PreferenceUtils.getInt(mContext, "count", 0); tv_number.setText(String.valueOf(count)); } } private boolean checkLocalId(IdBean idBean) { boolean isLocal = false; if (!TextUtils.equals(isIDinFree, "yes")) { return false; } if (!TextUtils.equals(local_age, "0")) { LogUtil.i(TAG, "Age == " + local_age); isLocal = checkAga(local_age, idBean.getId()); } if (!isLocal && !TextUtils.equals(local_addr, "0")) { LogUtil.i(TAG, "Addr == " + local_addr); isLocal = checkAddr(local_addr, idBean.getAddr()); } if (!isLocal && !TextUtils.equals(local_sex, "0")) { LogUtil.i(TAG, "Sex == " + local_sex); isLocal = checkSex(local_sex, idBean.getId()); } if (!isLocal && !TextUtils.equals(local_id, "0")) { LogUtil.i(TAG, "Id == " + local_id); isLocal = checkId(local_id, idBean.getId()); } return isLocal; } private boolean checkAga(String ageStr, String scanTicketId) { String[] localAge; if (ageStr.contains("#") && ageStr.contains("-")) { localAge = ageStr.split("#"); } else if (ageStr.contains("-")) { localAge = new String[]{ageStr}; } else { return false; } int tourAge = TimesUtils.getAge(scanTicketId); LogUtil.i(TAG, "【身份证年龄:】" + tourAge); for (String local : localAge) { String[] age = local.split("-"); int startAge = Integer.parseInt(age[0]); int endAge = Integer.parseInt(age[1]); if (tourAge >= startAge && tourAge < endAge) { return true; } } return false; } private boolean checkAddr(String local_addr, String addr) { boolean isLocal = false; String[] localStr; if (local_addr.contains("#")) { localStr = local_addr.split("#"); } else { localStr = new String[]{local_addr}; } for (String local : localStr) { if (addr.contains(local)) { isLocal = true; break; } } return isLocal; } private boolean checkSex(String local_sex, String scanTicketId) { String sex = "男"; if (Integer.parseInt(scanTicketId.substring(16, 17)) % 2 == 0) { sex = "女"; } if (TextUtils.equals(sex, local_sex)) { return true; } else { return false; } } private boolean checkId(String local_id, String scanTicketId) { boolean isLocal = false; String[] localStr; if (local_id.contains("#")) { localStr = local_id.split("#"); } else { localStr = new String[]{local_id}; } for (String local : localStr) { if (scanTicketId.startsWith(local)) { isLocal = true; break; } } return isLocal; } private boolean running = false; private int retType = -1; //读到二代证类型,s private class ReadThread extends Thread { @Override public void run() { while (running) { //说明:本程序加500ms延时只做参考,是为了二代证不拿开也能读,开发者可视自身环境而定 try { Thread.sleep(100); boolean isFind = idCardReader.findCard(0); if (isFind) { mHandle.sendEmptyMessage(MSG_FIND_ID); idCardReader.selectCard(0); retType = idCardReader.readCardEx(0, 0); switch (retType) { case 1: //国内居民身份证 IDCardInfo idCardInfo = idCardReader.getLastIDCardInfo(); Message msg = Message.obtain(); msg.what = MSG_GET_ID; msg.obj = idCardInfo; mHandle.sendMessage(msg); break; default: showToast("无效证件"); break; } } } catch (Exception e) { e.printStackTrace(); } } super.run(); } } /*** * 关闭模块 */ public void close() { LogUtil.i(TAG, "powerCtl close()"); try { running = false; //说明:300ms的延时是为防止线程操作异常,开发时视实际情况 Thread.sleep(300); if (idCardReader != null) { idCardReader.close(0); } if (powerCtl != null) { powerCtl.identity_uhf_power(0); powerCtl.identity_ctl(0); } } catch (Exception e) { LogUtil.e(TAG, e.getMessage()); e.printStackTrace(); } } @Override protected void onDestroy() { super.onDestroy(); LogUtil.i(TAG, "onDestroy()"); close(); } }