package android_serialport_api.print_tool; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.Message; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.view.WindowManager; import com.ectrip.cyt.callback.CloseCallback; import com.ectrip.cyt.config.MyApp; import com.ectrip.cyt.constant.DeviceType; import com.ectrip.cyt.constant.LogoType; import com.ectrip.cyt.constant.SelectAction; import com.ectrip.cyt.constant.constant; import com.ectrip.cyt.ui.ScanerOrderActivity; import com.ectrip.cyt.utils.LogUtil; import com.ectrip.cyt.utils.SharedPreferences2Obj; import com.ectrip.trips.check.R; import com.hdx.lib.printer.SerialPrinter; import com.hdx.lib.serial.SerialParam; import com.hdx.lib.serial.SerialPortOperaion; import com.hdx.lib.serial.SerialPortOperaion.SerialReadData; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.security.InvalidParameterException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import android_serialport_api.SerialPort; import hdx.HdxUtil; public class SerialIDPortTool implements CloseCallback { private String TAG = "SerialIDPortTool"; private Context mcontext; private MyIdPosHandler idPosHandler; private WakeLock lock; private final int PRINTIT = 1; private final int CLOSE = 2; protected SerialPort mSerialPort = null; protected OutputStream mOutputStream; public SerialPrinter mSerialPrinter = null; private InputStream mInputStream; private ProgressDialog dialog; private Integer type; private int printNum = 1; private int Select = 0; private String isStatistic = "0"; private String printinfo; private SerialDataHandler serialDataHandler; @SuppressLint("Wakelock") public void init(Context mContext, String printInfo) { this.printinfo = printInfo; this.mcontext = mContext; if (idPosHandler == null) { idPosHandler = new MyIdPosHandler(); } if (serialDataHandler == null) { serialDataHandler = new SerialDataHandler(); } popUpDialog(); new Thread(new Runnable() { @SuppressWarnings("deprecation") @Override public void run() { try { try { if (mSerialPort == null) { mSerialPort = getSerialPort(); } } catch (Exception e) { e.printStackTrace(); } if (mSerialPrinter == null) { mSerialPrinter = SerialPrinter.GetSerialPrinter(); } if (mSerialPort != null) { mOutputStream = mSerialPort.getOutputStream(); mInputStream = mSerialPort.getInputStream(); } else { } HdxUtil.SwitchSerialFunction(HdxUtil.SERIAL_FUNCTION_PRINTER); sleep(500); try { mSerialPrinter.OpenPrinter(new SerialParam(115200, "/dev/ttyS1", 0), serialDataHandler, SerialIDPortTool.this); } catch (Exception e1) { e1.printStackTrace(); } PowerManager pm = (PowerManager) mcontext .getSystemService(Context.POWER_SERVICE); lock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, TAG); lock.acquire(); try { HdxUtil.SetPrinterPower(1); try { sleep(200); } catch (Exception e) { e.printStackTrace(); } List info = new ArrayList(); if (printinfo != null) { String[] str = printinfo.split("\n"); for (int i = 0; i < str.length; i++) { info.add(str[i]); } } try { HdxUtil.SetPrinterPower(1); sleep(200); sendCharacterDemo(info); sleep(500); //打印完成发送消息关闭dialog。 idPosHandler.sendMessage(idPosHandler.obtainMessage(CLOSE, 1, 0, null)); mSerialPrinter.printString("printClose", 1); } catch (Exception e) { close(); e.printStackTrace(); } } finally { try { lock.release(); } catch (Exception e) { e.printStackTrace(); } HdxUtil.SetPrinterPower(0); } } catch (SecurityException e) { close(); // DisplayError(R.string.error_security); } catch (InvalidParameterException e) { close(); // DisplayError(R.string.error_configuration); } catch (Exception e) { close(); // TODO: handle exception } } }).start(); } private void popUpDialog() { try { isStatistic = SharedPreferences2Obj.getInstance(mcontext) .setName("SelectAction") .getObject("isStatistic", String.class); // 非统计判断 type = SharedPreferences2Obj.getInstance(mcontext) .setName("MachineType").getObject("type", Integer.class); Select = SharedPreferences2Obj.getInstance(mcontext) .setName("SelectAction").getObject("Select", Integer.class); printNum = MyApp.getInstance().getPrintNum(); } catch (Exception e1) { e1.printStackTrace(); } if (dialog == null) { // 显示ProgressDialog dialog = new ProgressDialog(mcontext); dialog.setMessage("打印中..."); dialog.setCanceledOnTouchOutside(true); dialog.setCancelable(false); if (type == DeviceType.HANDSET.getValue()) { dialog.getWindow().setType( WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); } try { dialog.show(); } catch (Exception e) { e.printStackTrace(); } } else { dialog.setMessage("打印中..."); dialog.show(); } } public SerialPort getSerialPort() throws SecurityException, IOException, InvalidParameterException { if (mSerialPort == null) { String path = "/dev/ttyS1"; int baudrate = 115200; if ((path.length() == 0) || (baudrate == -1)) { path = "/dev/ttyS1"; baudrate = 115200; } mSerialPort = new SerialPort(new File(path), baudrate, 0); } return mSerialPort; } @SuppressLint("HandlerLeak") private class MyIdPosHandler extends Handler { public MyIdPosHandler() { } public void handleMessage(Message msg) { switch (msg.what) { case CLOSE: if (dialog != null) { dialog.dismiss(); } Boolean scanBack = SharedPreferences2Obj.getInstance(mcontext).setName("config").getObject("scanBack", Boolean.class); if (MyApp.getInstance().getCheckType()==0&&scanBack != null && scanBack) { checkScan(); } break; default: break; } } } private void checkScan() { if (MyApp.getInstance().getCheckType() == 0) { Integer Select = SharedPreferences2Obj .getInstance(mcontext) .setName("SelectAction").getObject("Select", Integer.class); Intent intent = new Intent(mcontext, ScanerOrderActivity.class); if (Select != null) { if (Select == SelectAction.Check.getValue()) { intent.putExtra("titleName", mcontext.getString(R.string.check_scan_code)); } else if (Select == SelectAction.Reprint.getValue()) { intent.putExtra("titleName", mcontext.getString(R.string.repriint_scan_code)); } else if (Select == SelectAction.Query.getValue()) { intent.putExtra("titleName", mcontext.getString(R.string.query_scan_code)); } } else { intent.putExtra("titleName", mcontext.getString(R.string.scan_qr_code)); } mcontext.startActivity(intent); Activity activity = (Activity) mcontext; activity.finish(); } } @SuppressLint("HandlerLeak") private class SerialDataHandler extends Handler { public void handleMessage(Message msg) { switch (msg.what) { case SerialPortOperaion.SERIAL_RECEIVED_DATA_MSG: SerialReadData data = (SerialReadData) msg.obj; StringBuilder sb = new StringBuilder(); for (int x = 0; x < data.size; x++) sb.append(String.format("%02x", data.data[x])); LogUtil.d(TAG, "data =" + sb); } } } @SuppressLint("SimpleDateFormat") private void sendCharacterDemo(List arr) { LogUtil.e(TAG, "#########sendCharacterDemo##########"); for (int x = 0; x < printNum; x++) { if (x == 1 && isStatistic.equals("1")) { close(); return; } try { if (isStatistic != null && isStatistic.equals("1")) { mSerialPrinter.enlargeFontSize(2, 2);// mSerialPrinter.printString(" 统计信息", x); sleep(100); } else { mSerialPrinter.enlargeFontSize(2, 2);// mSerialPrinter.printString(" 订单信息", x); sleep(100); // 当时重打小票的时候,多打一段字符 if (Select == SelectAction.Reprint.getValue()) { mSerialPrinter.enlargeFontSize(1, 1); mSerialPrinter.printString(" (重打小票)", x); sleep(100); } } } catch (Exception e) { e.printStackTrace(); } try { mSerialPrinter.setLineSpace(5); // 间隔 sleep(100); } catch (Exception e) { e.printStackTrace(); } if (arr == null) { return; } // 打印信息 try { mSerialPrinter.enlargeFontSize(1, 1); for (int i = 0; i < arr.size(); i++) { mSerialPrinter.printString(arr.get(i), x); mSerialPrinter.sendLineFeed(); sleep(100); } if (isStatistic != null && isStatistic.equals("1")) { } else { if (Select == SelectAction.Query.getValue()) { // 打印时间 SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");// 设置日期格式 mSerialPrinter.printString( "检票时间:" + df.format(new Date()), x);// new sleep(100); // Date()为获取当前系统时间 mSerialPrinter.sendLineFeed(); } else if(Select == SelectAction.Reprint.getValue()) {// 重打时间 SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");// 设置日期格式 mSerialPrinter.printString( "重打时间:" + df.format(new Date()), x);// new sleep(100); // Date()为获取当前系统时间 mSerialPrinter.sendLineFeed(); } mSerialPrinter.setLineSpace(10); mSerialPrinter.sendLineFeed(); mSerialPrinter.printString("取票人签名:", x); sleep(100); mSerialPrinter.setLineSpace(10); } mSerialPrinter.sendLineFeed(); if (constant.logoMark == LogoType.CYT.getValue()) { mSerialPrinter.printString("---畅游通—智慧旅游O2O平台---", x); sleep(100); mSerialPrinter.sendLineFeed(); mSerialPrinter.printString( "--------www.jingqu.cn---------", x); } else if (constant.logoMark == LogoType.QNE.getValue()) { mSerialPrinter.printString("---欢迎使用去哪儿网O2O系统---", x); sleep(100); mSerialPrinter.sendLineFeed(); sleep(100); mSerialPrinter.printString("--------www.qunar.com--------", x); sleep(100); } mSerialPrinter.sendLineFeed(); sleep(100); } catch (Exception e) { e.printStackTrace(); } // 信息完打印的空格行数 try { mSerialPrinter.setLineSpace(30); // sleep(100); } catch (Exception e) { e.printStackTrace(); } try { mSerialPrinter.walkPaper(60);// sleep(100); } catch (Exception e) { e.printStackTrace(); } } //sleep(1500); LogUtil.e(TAG, "print end"); } public void sleep(int ms) { try { Thread.sleep(ms); } catch (Exception e) { e.printStackTrace(); } } public void close() { new Thread(new Runnable() { @Override public void run() { if (mSerialPrinter != null) { try { mSerialPrinter.ClosePrinter(); } catch (Exception e) { e.printStackTrace(); } } if (mSerialPort != null) { try { mSerialPort.close(); mSerialPort = null; } catch (Exception e) { e.printStackTrace(); } } try { if (mOutputStream != null) { mOutputStream.close(); } if (mInputStream != null) { mInputStream.close(); } } catch (IOException e) { } catch (Exception e) { } idPosHandler.sendMessage(idPosHandler.obtainMessage(CLOSE, 1, 0, null)); } }).start(); } @Override public void closeback() { close(); } }