一、获取连接的标签打印设备
private static List<UsbDevice> deviceList;
private static String deviceArrayLisr;
private static UsbDevice mUSBDevice;
public static PrinterInstance myPrinter;
public static String devicesName = "未知设备";
private static String devicesAddress;
private static final String ACTION_USB_PERMISSION = "com.android.usb.USB_PERMISSION";
public static boolean isConnected = false;
public static void getDevice() { if (myPrinter == null) { /** * 检测所有的打印设备 */ UsbManager manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);//获取usb权限 HashMap<String, UsbDevice> devices = manager.getDeviceList(); deviceList = new ArrayList<>(); for (UsbDevice device : devices.values()) { /** * 判断是都是打印设备。目前支持 (1155 != vendorId || 22304 != productId) && (1659 != vendorId || 8965 != productId) 两种 */ if (USBPort.isUsbPrinter(device)) { if (device.getVendorId() == 1155 && device.getProductId() == 22304) { deviceArrayLisr = device.getDeviceName() + "\nvid: " + device.getVendorId() + " pid: " + device.getProductId(); deviceList.add(device); } } } if (deviceList.isEmpty()) { ToastUtil.shortShow(mContext.getResources().getString(R.string.no_connected)); return; } mUSBDevice = deviceList.get(0); if (mUSBDevice == null) { mHandler.obtainMessage(PrinterConstants.Connect.FAILED).sendToTarget(); return; } myPrinter = PrinterInstance.getPrinterInstance(mContext, mUSBDevice, mHandler); devicesName = mUSBDevice.getDeviceName(); devicesAddress = "vid: " + mUSBDevice.getVendorId() + " pid: " + mUSBDevice.getProductId(); UsbManager mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE); if (mUsbManager.hasPermission(mUSBDevice)) { myPrinter.openConnection(); } else { // 没有权限询问用户是否授予权限 PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); mContext.registerReceiver(mUsbReceiver, filter); mUsbManager.requestPermission(mUSBDevice, pendingIntent); // 该代码执行后,系统弹出一个对话框 } } }
二、handle
// 用于接受连接状态消息的 Handler @SuppressLint("HandlerLeak") public static Handler mHandler = new Handler() { @SuppressLint("ShowToast") @Override public void handleMessage(Message msg) { switch (msg.what) { case PrinterConstants.Connect.SUCCESS: ToastUtil.shortShow("连接成功"); isConnected = true; Constants.ISCONNECTED = isConnected; Constants.DEVICE_NAME = devicesName; break; case PrinterConstants.Connect.FAILED: isConnected = false; ToastUtil.shortShow(mContext.getResources().getString(R.string.conn_failed)); Log.i(TAG, "连接失败!"); break; case PrinterConstants.Connect.CLOSED: isConnected = false; Constants.ISCONNECTED = isConnected; Constants.DEVICE_NAME = devicesName; Log.i(TAG, "连接关闭!"); break; case PrinterConstants.Connect.NODEVICE: isConnected = false; ToastUtil.shortShow(mContext.getResources().getString(R.string.conn_no)); break; case 0: ToastUtil.shortShow("打印通信正常"); break; case -1: ToastUtil.shortShow("打印机通信异常,请检查蓝牙连接"); vibrator(); break; case -2: ToastUtil.shortShow("打印缺纸"); vibrator(); break; case -3: ToastUtil.shortShow("打印机开盖"); vibrator(); break; default: break; } updateButtonState(isConnected);//此方法用于更新ui,更新打印机的连接状态 } };
三、receiver
private static final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override @SuppressLint("NewApi") public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.w(TAG, "receiver action: " + action); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { mContext.unregisterReceiver(mUsbReceiver); UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false) && mUSBDevice.equals(device)) { myPrinter.openConnection(); } else { mHandler.obtainMessage(PrinterConstants.Connect.FAILED).sendToTarget(); Log.e(TAG, "permission denied for device " + device); } } } } };
四、使用了广播要在onDestroy方法中关闭
public void onDestroy() { XLog.e(TAG, "yxz at SettingActivity.java onDestroy() progressdialog"); super.onDestroy(); if (hasRegDisconnectReceiver) { mContext.unregisterReceiver(mUsbReceiver); hasRegDisconnectReceiver = false; // Log.i(TAG, "关闭了广播!"); } }
五、断开连接
/** * 断开连接 */ public static void breakPrinter() { if (myPrinter != null) { /** * 断开打印设备的连接 */ myPrinter.closeConnection(); myPrinter = null;//清空打印对象 XLog.i(TAG, "yxz at SettingActivity.java onClick() mPrinter:" + myPrinter); } if (isConnected) { tv_device_name.setText("设备名称: " + "思普瑞特价签机"); label_print_state.setText(mContext.getResources().getString(R.string.on_line)); } else { tv_device_name.setText("设备名称:未连接"); label_print_state.setText(mContext.getResources().getString(R.string.off_line)); } // label_print_state.setText(mContext.getResources().getString(R.string.off_line)); ToastUtil.shortShow("已断开连接"); }
六、打印方法
import android.content.Context; import com.printer.sdk.PrinterConstants; import com.printer.sdk.PrinterConstants.PAlign; import com.printer.sdk.PrinterConstants.PBarcodeType; import com.printer.sdk.PrinterInstance; import com.printer.sdk.exception.ParameterErrorException; import com.printer.sdk.exception.PrinterPortNullException; import com.printer.sdk.exception.WriteException; import org.apache.http.util.TextUtils; import java.util.List; public class PrintLabelGaomi { //多个打印 public void doPrintTSPL(final PrinterInstance iPrinter, final Context mContext, final List<ProductLabelBean> productLabelBeanList) { final boolean printer_direction = (boolean) ACache.get(mContext.getApplicationContext()).getAsObject(Constants.PRINT_DIRECTION); android.util.Log.d("cai", "是否打印" + printer_direction); new Thread() { @Override public void run() { for (ProductLabelBean p : productLabelBeanList) { int left = com.android.hboxs.gaomicashier.common.hardware.label.PrefUtils.getInt(mContext, "leftmargin", 0); int top = com.android.hboxs.gaomicashier.common.hardware.label.PrefUtils.getInt(mContext, "topmargin", 0); int numbers = com.android.hboxs.gaomicashier.common.hardware.label.PrefUtils.getInt(mContext, "printnumbers", 1); int isBeep = com.android.hboxs.gaomicashier.common.hardware.label.PrefUtils.getInt(mContext, "isBeep", 0); try { // 设置标签纸大小 型号SIZE_58mm 尺寸56 * 8:45 * 8 //45 iPrinter.pageSetupTSPL(PrinterConstants.SIZE_80mm, 80 * 8, 50 * 8); // 清除缓存区内容 iPrinter.printText("CLS\r\n"); // 设置标签的参考坐标原点 if (left == 0 || top == 0) { // 不做设置,默认 } else { iPrinter.sendStrToPrinterTSPL("REFERENCE " + left * 8 + "," + top * 8 + "\r\n"); } /** * x 是代表横的位置 ;y是行数,从0开始 * 前4 表明开始的位置 xy,开始和结束的位置 * 56 表明放置的位置 * 7 表明是简体中文 * 89 表明是xy的倍数:表明字体的大小 * 10 表明是是否旋转 * 11 表明是需要打印的字体 * */ /** * 初始版 */ if (printer_direction) { /** * 以下为最终版 * 旋转180度 */ //名称 if (TextUtils.isEmpty(p.getName())){ iPrinter.drawTextTSPL(50 * 8, 40 * 8 + 10, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(50 * 8, 40 * 8 + 10, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getName()); } // 横线上方区域右侧的文字 if (TextUtils.isEmpty(p.getPrice())){ iPrinter.drawTextTSPL(33 * 8, 28 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(33 * 8, 28 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, PrinterConstants.PRotate.Rotate_180, p.getPrice()); } // 横线上方区域右侧的文字 ,空格间隔 // // iPrinter.drawTextTSPL(25 * 8, 11 * 8, 40 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getCashAndEPrice()); //会员价 TODO 已取消 // iPrinter.drawTextTSPL(33 * 8, 14 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getCash()); // 最大数据个数限制为5位 例如:99.99 if (TextUtils.isEmpty(p.getEprice())){ iPrinter.drawTextTSPL(17 * 8, 14 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(17 * 8, 14 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getEprice()); } //计量单位 if (TextUtils.isEmpty(p.getUnit())){ iPrinter.drawTextTSPL(60 * 8, 20 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(60 * 8, 20 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getUnit()); } // 二维码下方的一维条码 13位 // 14,15,16,17,18 no 12 //sn if (TextUtils.isEmpty(p.getSn())){ iPrinter.drawTextTSPL(60 * 8, 14 * 8 + 2, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(60 * 8, 14 * 8 + 2, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getSn()); } //int start_x, int start_y, PBarcodeType type, int height, boolean isReadable, PRotate rotate, int narrowWidth, int wideWidth, String content // iPrinter.drawBarCodeTSPL(75 * 8, 10 * 8 + 4, PBarcodeType.JAN3_EAN13, 5 * 8, false, null, 1, 1, p.getSn()); iPrinter.drawBarCodeTSPL(75*8, 10 * 8 + 4, PBarcodeType.JAN3_EAN13, 5 * 8, false, PrinterConstants.PRotate.Rotate_180, 1, 1, p.getSn()); //以下三条数据是不打印的,只是打印空格 //规格 if (TextUtils.isEmpty(p.getSpecification())){ iPrinter.drawTextTSPL(60 * 8, 30 * 8 + 4, 70 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(60 * 8, 30 * 8 + 4, 70 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getSpecification()); } // 横线上方区域左下方的文字 ((0,0)(40*8,7*8)) if (TextUtils.isEmpty(p.getProducer())){ iPrinter.drawTextTSPL(65 * 8, 25 * 8, 75 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(65 * 8, 25 * 8, 75 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getProducer()); } if (TextUtils.isEmpty(p.getRank())){ iPrinter.drawTextTSPL(48 * 8, 25 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(48 * 8, 25 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getRank()); } if (TextUtils.isEmpty(p.getSupervisor())){ iPrinter.drawTextTSPL(14 * 8, 5 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(14 * 8, 5 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getSupervisor()); } } else { if (TextUtils.isEmpty(p.getName())){ iPrinter.drawTextTSPL(30 * 8, 11 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, " "); }else { iPrinter.drawTextTSPL(30 * 8, 11 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, p.getName()); } // 横线上方区域右侧的文字 if (TextUtils.isEmpty(p.getPrice())){ iPrinter.drawTextTSPL(48 * 8, 23 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, null, " "); }else { iPrinter.drawTextTSPL(48 * 8, 23 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, null, p.getPrice()); } // 横线上方区域右侧的文字 价格和E币,空格间隔 // iPrinter.drawTextTSPL(49 * 8, 38 * 8, 70 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 2, null, p.getCashAndEPrice()); // iPrinter.drawTextTSPL(47 * 8, 38 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, p.getCash()); if (TextUtils.isEmpty(p.getEprice())){ iPrinter.drawTextTSPL(63 * 8, 38 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, " "); }else { iPrinter.drawTextTSPL(63 * 8, 38 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, p.getEprice()); } if (TextUtils.isEmpty(p.getUnit())){ iPrinter.drawTextTSPL(18 * 8, 32 * 8, 40 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, " "); }else { iPrinter.drawTextTSPL(18 * 8, 32 * 8, 40 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getUnit()); } // 二维码下方的一维条码 13位 // 14,15,16,17,18 no 12 if (TextUtils.isEmpty(p.getSn())){ iPrinter.drawTextTSPL(12 * 8, 37 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, " "); }else { iPrinter.drawTextTSPL(12 * 8, 37 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getSn()); } //int start_x, int start_y, PBarcodeType type, int height, boolean isReadable, PRotate rotate, int narrowWidth, int wideWidth, String content iPrinter.drawBarCodeTSPL(40, 40 * 8 + 4, PBarcodeType.JAN3_EAN13, 5 * 8, false, null, 1, 1, p.getSn()); if (TextUtils.isEmpty(p.getSupervisor())){ iPrinter.drawTextTSPL(65 * 8, 47 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, " "); }else { iPrinter.drawTextTSPL(65 * 8, 47 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getSupervisor()); } } // // iPrinter.drawTextTSPL(14 * 8, 11 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, p.getName()); // // // 横线上方区域右侧的文字 // // iPrinter.drawTextTSPL(48 * 8, 23 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, null, p.getPrice()); // // // 横线上方区域右侧的文字 价格和E币,空格间隔 // // iPrinter.drawTextTSPL(49 * 8, 38 * 8, 70 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 2, null, p.getCashAndEPrice()); // // // iPrinter.drawTextTSPL(18 * 8, 32 * 8, 40 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getUnit()); // // // 二维码下方的一维条码 13位 // // 14,15,16,17,18 no 12 // // iPrinter.drawTextTSPL(12 * 8, 37 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getSn()); // // //int start_x, int start_y, PBarcodeType type, int height, boolean isReadable, PRotate rotate, int narrowWidth, int wideWidth, String content // iPrinter.drawBarCodeTSPL(40, 40 * 8 + 4, PBarcodeType.JAN3_EAN13, 5 * 8, false, null, 1, 1, p.getSn()); // /** // * 以下为最终版 // */ // // iPrinter.drawTextTSPL(50 * 8, 40 * 8+10, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getName()); // // // 横线上方区域右侧的文字 // // iPrinter.drawTextTSPL(33 * 8, 28 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, PrinterConstants.PRotate.Rotate_180, p.getPrice()); // // // 横线上方区域右侧的文字 价格和E币,空格间隔 // //// iPrinter.drawTextTSPL(25 * 8, 11 * 8, 40 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getCashAndEPrice()); // // iPrinter.drawTextTSPL(33 * 8, 14 * 8+2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getCash()); // // 最大数据个数限制为5位 例如:99.99 // iPrinter.drawTextTSPL(17 * 8, 14 * 8+2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getEprice()); // // // iPrinter.drawTextTSPL(60 * 8, 20 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getUnit()); // // // 二维码下方的一维条码 13位 // // 14,15,16,17,18 no 12 // // iPrinter.drawTextTSPL(60 * 8, 14 * 8 + 2, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getSn()); // // //int start_x, int start_y, PBarcodeType type, int height, boolean isReadable, PRotate rotate, int narrowWidth, int wideWidth, String content // iPrinter.drawBarCodeTSPL(75*8, 10 * 8+4 , PBarcodeType.JAN3_EAN13, 5 * 8, false, null, 1, 1, p.getSn()); // //以下三条数据是不打印的,只是打印空格 // // iPrinter.drawTextTSPL(60 * 8, 30 * 8 + 4, 70 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); // // 横线上方区域左下方的文字 ((0,0)(40*8,7*8)) // // iPrinter.drawTextTSPL(65 * 8 , 25 * 8, 75 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180," "); // // // iPrinter.drawTextTSPL(48 * 8, 25 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); // 判断是否响应蜂鸣器 if (isBeep == 1) { // 打印前响 iPrinter.beepTSPL(1, 1000); Thread.sleep(3000); // 打印 iPrinter.printTSPL(numbers, 1); } else if (isBeep == 2) { // 打印 iPrinter.printTSPL(numbers, 1); // 打印后响 iPrinter.beepTSPL(1, 1000); } else { // 打印 iPrinter.printTSPL(numbers, 1); } } catch (WriteException e) { e.printStackTrace(); } catch (PrinterPortNullException e) { e.printStackTrace(); } catch (ParameterErrorException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } }.start(); } // //多个打印 // public void doPrintTSPL(final PrinterInstance iPrinter, final Context mContext, final List<ProductLabelBean> productLabelBeanList) { // new Thread() { // @Override // public void run() { // // for (ProductLabelBean p : productLabelBeanList) { // // int left = com.android.hboxs.gaomicashier.common.hardware.label.PrefUtils.getInt(mContext, "leftmargin", 0); // int top = com.android.hboxs.gaomicashier.common.hardware.label.PrefUtils.getInt(mContext, "topmargin", 0); // int numbers = com.android.hboxs.gaomicashier.common.hardware.label.PrefUtils.getInt(mContext, "printnumbers", 1); // int isBeep = com.android.hboxs.gaomicashier.common.hardware.label.PrefUtils.getInt(mContext, "isBeep", 0); // // try { // // 设置标签纸大小 型号SIZE_58mm 尺寸56 * 8:45 * 8 // //45 // iPrinter.pageSetupTSPL(PrinterConstants.SIZE_80mm, 80 * 8, 50 * 8); // // // 清除缓存区内容 // iPrinter.printText("CLS\r\n"); // // // 设置标签的参考坐标原点 // if (left == 0 || top == 0) { // // 不做设置,默认 // } else { // iPrinter.sendStrToPrinterTSPL("REFERENCE " + left * 8 + "," + top * 8 + "\r\n"); // } // // /** // * x 是代表横的位置 ;y是行数,从0开始 // * 前4 表明开始的位置 xy,开始和结束的位置 // * 56 表明放置的位置 // * 7 表明是简体中文 // * 89 表明是xy的倍数:表明字体的大小 // * 10 表明是是否旋转 // * 11 表明是需要打印的字体 // * */ // // // iPrinter.drawTextTSPL(14 * 8, 11 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, p.getName()); // // // 横线上方区域右侧的文字 // // iPrinter.drawTextTSPL(48 * 8, 23 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, null, p.getPrice()); // // // 横线上方区域右侧的文字 价格和积分,空格间隔 // // iPrinter.drawTextTSPL(49 * 8, 38 * 8, 70 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 2, null, p.getCashAndEPrice()); // // // iPrinter.drawTextTSPL(18 * 8, 32 * 8, 40 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getUnit()); // // // 二维码下方的一维条码 13位 // // 14,15,16,17,18 no 12 // // iPrinter.drawTextTSPL(12 * 8, 37 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getSn()); // // //int start_x, int start_y, PBarcodeType type, int height, boolean isReadable, PRotate rotate, int narrowWidth, int wideWidth, String content // iPrinter.drawBarCodeTSPL(40, 40 * 8 + 4, PBarcodeType.JAN3_EAN13, 5 * 8, false, null, 1, 1, p.getSn()); // // // 判断是否响应蜂鸣器 // if (isBeep == 1) { // // 打印前响 // iPrinter.beepTSPL(1, 1000); // Thread.sleep(3000); // // 打印 // iPrinter.printTSPL(numbers, 1); // } else if (isBeep == 2) { // // 打印 // iPrinter.printTSPL(numbers, 1); // // 打印后响 // iPrinter.beepTSPL(1, 1000); // } else { // // 打印 // iPrinter.printTSPL(numbers, 1); // } // // } catch (WriteException e) { // e.printStackTrace(); // } catch (PrinterPortNullException e) { // e.printStackTrace(); // } catch (ParameterErrorException e) { // e.printStackTrace(); // } catch (Exception e) { // e.printStackTrace(); // } // } // // } // // }.start(); // } // //打印测试 // public void doPrintTSPL(final PrinterInstance iPrinter, final Context mContext, final ProductLabelBean p) { // new Thread() { // @Override // public void run() { // // int left = PrefUtils.getInt(mContext, "leftmargin", 0); // int top = PrefUtils.getInt(mContext, "topmargin", 0); // int numbers = PrefUtils.getInt(mContext, "printnumbers", 1); // int isBeep = PrefUtils.getInt(mContext, "isBeep", 0); // // try { // // 设置标签纸大小 型号SIZE_58mm 尺寸56 * 8:45 * 8 // iPrinter.pageSetupTSPL(PrinterConstants.SIZE_80mm, 80 * 8, 50 * 8); // // // 清除缓存区内容 // iPrinter.printText("CLS\r\n"); // // // 设置标签的参考坐标原点 // if (left == 0 || top == 0) { // // 不做设置,默认 // } else { // iPrinter.sendStrToPrinterTSPL("REFERENCE " + left * 8 + "," + top * 8 + "\r\n"); // } // // /** // * x 是代表横的位置 ;y是行数,从0开始 // * 前4 表明开始的位置 xy,开始和结束的位置 // * 56 表明放置的位置 // * 7 表明是简体中文 // * 89 表明是xy的倍数:表明字体的大小 // * 10 表明是是否旋转 // * 11 表明是需要打印的字体 // * */ // // // iPrinter.drawTextTSPL(14 * 8, 11 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, p.getName()); // // // 横线上方区域 // // iPrinter.drawTextTSPL(12 * 8, 19 * 8 + 4, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, "规格1"); // // 横线上方区域左下方的文字 ((0,0)(40*8,7*8)) // // iPrinter.drawTextTSPL(11 * 8 + 4, 26 * 8, 25 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getProducer()); // // // iPrinter.drawTextTSPL(31 * 8, 26 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, "一级品"); // // // 横线上方区域右侧的文字 // // iPrinter.drawTextTSPL(48 * 8, 24 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, null, p.getPrice()); // // // 横线上方区域右侧的文字 价格和积分,空格间隔 // // iPrinter.drawTextTSPL(49 * 8, 38 * 8, 70 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 2, null, p.getCashAndEPrice()); // // // iPrinter.drawTextTSPL(18 * 8, 32 * 8, 40 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getUnit()); // // // 二维码下方的一维条码 13位 // // iPrinter.drawTextTSPL(12 * 8, 37 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getSn()); // // //int start_x, int start_y, PBarcodeType type, int height, boolean isReadable, PRotate rotate, int narrowWidth, int wideWidth, String content // iPrinter.drawBarCodeTSPL(40, 40 * 8 + 4, PBarcodeType.JAN3_EAN13, 5 * 8, false, null, 1, 1, p.getSn()); // // // 判断是否响应蜂鸣器 // if (isBeep == 1) { // // 打印前响 // iPrinter.beepTSPL(1, 1000); // Thread.sleep(3000); // // 打印 // iPrinter.printTSPL(numbers, 1); // } else if (isBeep == 2) { // // 打印 // iPrinter.printTSPL(numbers, 1); // // 打印后响 // iPrinter.beepTSPL(1, 1000); // } else { // // 打印 // iPrinter.printTSPL(numbers, 1); // } // // } catch (WriteException e) { // e.printStackTrace(); // } catch (PrinterPortNullException e) { // e.printStackTrace(); // } catch (ParameterErrorException e) { // e.printStackTrace(); // } catch (Exception e) { // e.printStackTrace(); // } // } // // }.start(); // } //打印测试 public void doPrintTSPL(final PrinterInstance iPrinter, final Context mContext, final ProductLabelBean p) { final boolean printer_direction = (boolean) ACache.get(mContext.getApplicationContext()).getAsObject(Constants.PRINT_DIRECTION); android.util.Log.d("cai", "是否打印" + printer_direction); new Thread() { @Override public void run() { int left = PrefUtils.getInt(mContext, "leftmargin", 0); int top = PrefUtils.getInt(mContext, "topmargin", 0); int numbers = PrefUtils.getInt(mContext, "printnumbers", 1); int isBeep = PrefUtils.getInt(mContext, "isBeep", 0); int printlevel=PrefUtils.getInt(mContext,"printlevel",7); try { // 设置标签纸大小 型号SIZE_58mm 尺寸56 * 8:45 * 8 iPrinter.pageSetupTSPL(PrinterConstants.SIZE_80mm, 80 * 8, 50 * 8); // 清除缓存区内容 iPrinter.printText("CLS\r\n"); // 设置标签的参考坐标原点 if (left == 0 || top == 0) { // 不做设置,默认 } else { iPrinter.sendStrToPrinterTSPL("REFERENCE " + left * 8 + "," + top * 8 + "\r\n"); } /** * x 是代表横的位置 ;y是行数,从0开始 * 前4 表明开始的位置 xy,开始和结束的位置 * 56 表明放置的位置 * 7 表明是简体中文 * 89 表明是xy的倍数:表明字体的大小 * 10 表明是是否旋转 * 11 表明是需要打印的字体 * */ // // iPrinter.drawTextTSPL(50 * 8, 40 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getName()); // // // 横线上方区域 // // iPrinter.drawTextTSPL(60 * 8, 30 * 8 + 4, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, "规格1"); // // 横线上方区域左下方的文字 ((0,0)(40*8,7*8)) // // iPrinter.drawTextTSPL(65 * 8 , 25 * 8, 75 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getProducer()); // // // iPrinter.drawTextTSPL(48 * 8, 25 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, "一级品"); // // // 横线上方区域右侧的文字 // // iPrinter.drawTextTSPL(30 * 8, 28 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, PrinterConstants.PRotate.Rotate_180, p.getPrice()); // // // 横线上方区域右侧的文字 价格和E币,空格间隔 // // iPrinter.drawTextTSPL(25 * 8, 11 * 8, 40 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getCashAndEPrice()); // // // iPrinter.drawTextTSPL(60 * 8, 16 * 8, 40 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getUnit()); // // // 二维码下方的一维条码 13位 // // iPrinter.drawTextTSPL(60 * 8, 14 * 8 + 2, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getSn()); // // //int start_x, int start_y, PBarcodeType type, int height, boolean isReadable, PRotate rotate, int narrowWidth, int wideWidth, String content // iPrinter.drawBarCodeTSPL(75*8, 10 * 8 , PBarcodeType.JAN3_EAN13, 5 * 8, false, null, 1, 1, p.getSn()); /** * 1、对应开始位置的x坐标 * 2、对应开始位置的y坐标 * 3、对应结束位置的x坐标 * 4、对应结束位置的y坐标 * 5、x坐标的对齐方式 * 6、y坐标的对齐方式 * 7、是否是简体中文 * 8、x字体大小 * 9、y字体大小 * 10、旋转方式 * 11、打印的数据 */ /*** * 第二版最、最终版 */ // // 最大数据个数限制为10位 // iPrinter.drawTextTSPL(50 * 8, 40 * 8+10, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getName()); // // 最大数据个数限制为10位 例如:3000000.01 // // iPrinter.drawTextTSPL(33 * 8, 28 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, PrinterConstants.PRotate.Rotate_180, p.getPrice()); // // 横线上方区域右侧的文字 价格和E币,空格间隔 // // 最大数据个数限制为8位 例如:200000.01 // // iPrinter.drawTextTSPL(33 * 8, 14 * 8+2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getCash()); // // 最大数据个数限制为5位 例如:99.99 // iPrinter.drawTextTSPL(17 * 8, 14 * 8+2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getEprice()); // // // 字数最大限制为6位 // iPrinter.drawTextTSPL(60 * 8, 20 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, "包"); // // // 二维码下方的一维条码 13位 // // /*** // * 上面有 // */ // iPrinter.drawTextTSPL(60 * 8, 14 * 8 + 2, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getSn()); // /*** // * 上面有 // */ // //int start_x, int start_y, PBarcodeType type, int height, boolean isReadable, PRotate rotate, int narrowWidth, int wideWidth, String content // iPrinter.drawBarCodeTSPL(75*8, 10 * 8+4 , PBarcodeType.JAN3_EAN13, 5 * 8, false, null, 1, 1, p.getSn()); // // 横线上方区域 // // // iPrinter.drawTextTSPL(60 * 8, 30 * 8 + 4, 70 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); // // 横线上方区域左下方的文字 ((0,0)(40*8,7*8)) // // iPrinter.drawTextTSPL(65 * 8 , 25 * 8, 75 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180," "); // // // iPrinter.drawTextTSPL(48 * 8, 25 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); // // 横线上方区域右侧的文字 /** * 测试一、二版结合选择 */ if (printer_direction) { /** * 以下为最终版 * 旋转版 */ //名称 iPrinter.drawTextTSPL(50 * 8, 40 * 8 + 10, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getName()); // 横线上方区域右侧的文字 iPrinter.drawTextTSPL(33 * 8, 28 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, PrinterConstants.PRotate.Rotate_180, p.getPrice()); // 横线上方区域右侧的文字 价格和E币,空格间隔 // iPrinter.drawTextTSPL(25 * 8, 11 * 8, 40 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getCashAndEPrice()); iPrinter.drawTextTSPL(33 * 8, 14 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getCash()); // 最大数据个数限制为5位 例如:99.99 iPrinter.drawTextTSPL(17 * 8, 14 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getEprice()); iPrinter.drawTextTSPL(60 * 8, 20 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getUnit()); // 二维码下方的一维条码 13位 // 14,15,16,17,18 no 12 iPrinter.drawTextTSPL(60 * 8, 14 * 8 + 2, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getSn()); //int start_x, int start_y, PBarcodeType type, int height, boolean isReadable, PRotate rotate, int narrowWidth, int wideWidth, String content iPrinter.drawBarCodeTSPL(75*8, 10 * 8 + 4, PBarcodeType.JAN3_EAN13, 5 * 8, false, PrinterConstants.PRotate.Rotate_180, 1, 1, p.getSn()); //以下三条数据是不打印的,只是打印空格 iPrinter.drawTextTSPL(60 * 8, 30 * 8 + 4, 70 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); // 横线上方区域左下方的文字 ((0,0)(40*8,7*8)) iPrinter.drawTextTSPL(65 * 8, 25 * 8, 75 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); iPrinter.drawTextTSPL(48 * 8, 25 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); //TODO:2018-02-10 需要调试位置 iPrinter.drawTextTSPL(14 * 8, 5 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, "物价员"); } else { /** * 不旋转版 */ iPrinter.drawTextTSPL(17 * 8, 11 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, p.getName()); // 横线上方区域右侧的文字 iPrinter.drawTextTSPL(48 * 8, 23 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, null, p.getPrice()); // 横线上方区域右侧的文字 ,空格间隔 iPrinter.drawTextTSPL(47 * 8, 38 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, p.getCash()); iPrinter.drawTextTSPL(63 * 8, 38 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, p.getEprice()); iPrinter.drawTextTSPL(18 * 8, 32 * 8, 40 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getUnit()); // 二维码下方的一维条码 13位 // 14,15,16,17,18 no 12 iPrinter.drawTextTSPL(12 * 8, 37 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getSn()); //int start_x, int start_y, PBarcodeType type, int height, boolean isReadable, PRotate rotate, int narrowWidth, int wideWidth, String content iPrinter.drawBarCodeTSPL(40, 40 * 8 + 4, PBarcodeType.JAN3_EAN13, 5 * 8, false, null, 1, 1, p.getSn()); iPrinter.drawTextTSPL(65 * 8, 47 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, "物价员"); } // 判断是否响应蜂鸣器 if (isBeep == 1) { // 打印前响 iPrinter.beepTSPL(1, 1000); Thread.sleep(3000); // 打印 iPrinter.printTSPL(numbers, 1); } else if (isBeep == 2) { // 打印 iPrinter.printTSPL(numbers, 1); // 打印后响 iPrinter.beepTSPL(1, 1000); } else { // 打印 iPrinter.printTSPL(numbers, 1); } } catch (WriteException e) { e.printStackTrace(); } catch (PrinterPortNullException e) { e.printStackTrace(); } catch (ParameterErrorException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }.start(); } }
七、打印格式设置
import android.content.Context; import android.content.SharedPreferences; import android.text.format.Time; /** * SharePreference封装 * * @author Kevin * */ public class PrefUtils { public static final String PREF_NAME = "config"; public static boolean getBoolean(Context ctx, String key, boolean defaultValue) { SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); return sp.getBoolean(key, defaultValue); } public static void setBoolean(Context ctx, String key, boolean value) { SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); sp.edit().putBoolean(key, value).commit(); } public static String getString(Context ctx, String key, String defaultValue) { SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); return sp.getString(key, defaultValue); } public static void setString(Context ctx, String key, String value) { SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); sp.edit().putString(key, value).commit(); } public static int getInt(Context ctx, String key, int defaultValue) { SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); return sp.getInt(key, defaultValue); } public static void setInt(Context ctx, String key, int value) { SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); sp.edit().putInt(key, value).commit(); } public static String getSystemTime() { // or Time t=new Time("GMT+8"); 加上Time Zone资料。 Time t = new Time(); // 取得系统时间。 t.setToNow(); int year = t.year; int month = t.month + 1; int date = t.monthDay; // 0-23 int hour = t.hour; int minute = t.minute; int seconds = t.second; String tag = "AM"; if (hour >= 12) { tag = "PM"; } String time = date + "/" + month + "/" + year + " " + hour + ":" + minute + " " + tag; return time; } public static String getSystemTime2() { // or Time t=new Time("GMT+8"); 加上Time Zone资料。 Time t = new Time(); // 取得系统时间。 t.setToNow(); int year = t.year; int month = t.month + 1; int date = t.monthDay; // 0-23 int hour = t.hour; int minute = t.minute; int seconds = t.second; String tag = "AM"; if (hour >= 12) { tag = "PM"; } String time; if (month < 10) { if (seconds >= 10) { time = year + "-0" + month + "-" + date + " " + hour + ":" + minute + ":" + seconds; } else { time = year + "-0" + month + "-" + date + " " + hour + ":" + minute + ":0" + seconds; } } else { if (seconds >= 10) { time = year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + seconds; } else { time = year + "-" + month + "-" + date + " " + hour + ":" + minute + ":0" + seconds; } } return time; } public static String getSystemTime3() { // or Time t=new Time("GMT+8"); 加上Time Zone资料。 Time t = new Time(); // 取得系统时间。 t.setToNow(); int year = t.year; int month = t.month + 1; int date = t.monthDay; // 0-23 int hour = t.hour; int minute = t.minute; int seconds = t.second; String tag = "AM"; if (hour >= 12) { tag = "PM"; } String time; if (month < 10) { if (seconds >= 10) { time = year + "-0" + month + "-" + date; } else { time = year + "-0" + month + "-" + date; } } else { if (seconds >= 10) { time = year + "-" + month + "-" + date; } else { time = year + "-" + month + "-" + date; } } return time; } }
最后,直接贴上全部代码,代码是写在一个fragment里面去点击按钮去连接的,如需写在activity中去连接,可参考点击事件的监听方法里面的步骤去实现,同样的原理。代码如下:
import android.annotation.SuppressLint; import android.app.Activity; import android.app.PendingIntent; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.text.SpannableString; import android.text.Spanned; import android.text.method.LinkMovementMethod; import android.text.style.ForegroundColorSpan; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.CompoundButton; import android.widget.RelativeLayout; import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; import com.printer.sdk.PrinterConstants; import com.printer.sdk.PrinterInstance; import com.printer.sdk.usb.USBPort; import com.printer.sdk.utils.XLog; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import me.yokeyword.fragmentation.SupportFragment; /** * 设置 - 标签 * */ public class SettingLabelPrinterFragment extends SupportFragment implements View.OnClickListener { public static final int CONNECT_DEVICE = 1; protected static final String TAG = "SettingActivity"; // public PrinterInstance myPrinter; //这是默认是usb private int interfaceType = 1; // public String devicesName = "未知设备"; private static final String ACTION_USB_PERMISSION = "com.android.usb.USB_PERMISSION"; private static TextView tv_device_name; private RelativeLayout rl_print_connect; private RelativeLayout rl_print_test; private Button btn_connect; private Button btn_selfprint_test; //private static UsbDevice mUSBDevice //建议去掉静态 // private UsbDevice mUSBDevice; private IntentFilter bluDisconnectFilter; // 打印机连接状态 // public boolean isConnected = false; private RelativeLayout examine_print_state, off_print; public static TextView label_print_state; private Switch sw_front_reverse_printer; private TextView direction_select; private static Context mContext; private boolean direction; private SpannableString spannableString; public static PrinterInstance myPrinter; private static UsbDevice mUSBDevice; private static List<UsbDevice> deviceList; private static String deviceArrayLisr; public static String devicesName = "未知设备"; private static String devicesAddress; // 打印机连接状态 public static boolean isConnected = false; private static boolean hasRegDisconnectReceiver = false; private String strStatus = null; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_setting_label_printer, container, false); init(view); return view; } private void init(View view) { tv_device_name = (TextView) view.findViewById(R.id.tv_device_name); btn_connect = (Button) view.findViewById(R.id.btn_connect); btn_selfprint_test = (Button) view.findViewById(R.id.btn_selfprint_test); rl_print_connect = (RelativeLayout) view.findViewById(R.id.rl_print_connect); rl_print_test = (RelativeLayout) view.findViewById(R.id.rl_print_test); examine_print_state = view.findViewById(R.id.examine_print_state);//检查打印机状态 off_print = view.findViewById(R.id.off_print);//断开打印机连接 label_print_state = view.findViewById(R.id.label_print_state);//显示打印机状态 sw_front_reverse_printer = view.findViewById(R.id.sw_front_reverse_printer); direction_select = view.findViewById(R.id.btn_direction_select); mContext = getActivity(); examine_print_state.setOnClickListener(this);//检查打印机状态 off_print.setOnClickListener(this);//断开打印机连接 btn_connect.setOnClickListener(this); btn_selfprint_test.setOnClickListener(this); rl_print_connect.setOnClickListener(this); rl_print_test.setOnClickListener(this); if (null != ACache.get(getContext().getApplicationContext()).getAsObject(Constants.PRINT_DIRECTION)) { direction = (boolean) ACache.get(getContext().getApplicationContext()).getAsObject(Constants.PRINT_DIRECTION); Log.e("cai", "缓存状态:" + direction); } else { ACache.get(mContext.getApplicationContext()).put(Constants.PRINT_DIRECTION, false); } String str_direction = direction_select.getText().toString(); spannableString = new SpannableString(str_direction); Log.e("cai", spannableString.toString()); sw_front_reverse_printer.setChecked(direction); if (direction) { spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorGrayText)), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorAccent)), 6, 11, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); direction_select.setText(spannableString); direction_select.setMovementMethod(LinkMovementMethod.getInstance()); } else { spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorAccent)), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorGrayText)), 6, 11, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); direction_select.setText(spannableString); direction_select.setMovementMethod(LinkMovementMethod.getInstance()); } sw_front_reverse_printer.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Log.e("cai", "+++" + isChecked); if (isChecked) { spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorGrayText)), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorAccent)), 6, 11, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); direction_select.setText(spannableString); direction_select.setMovementMethod(LinkMovementMethod.getInstance()); } else { spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorAccent)), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorGrayText)), 6, 11, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); direction_select.setText(spannableString); direction_select.setMovementMethod(LinkMovementMethod.getInstance()); } //保存打印正反方向状态数据到缓存 ACache.get(mContext.getApplicationContext()).put(Constants.PRINT_DIRECTION, isChecked); updateButtonState(isConnected); } }); } @Override public void onResume() { super.onResume(); } public void onStart() { super.onStart(); updateButtonState(isConnected); Log.e("freak", "isConnected" + isConnected); Log.e("freak", "onStart"); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.rl_print_connect: //连接打印机 case R.id.btn_connect: // showSelectDevicesDialog(); getDevice(); break; case R.id.off_print://断开打印机连接 breakPrinter(); break; case R.id.examine_print_state://检查打印机状态 Log.e("freak", "isConnected==" + isConnected); if (isConnected) { new Thread(new Runnable() { public void run() { int i = myPrinter.getCurrentStatus(); if (i == 0) { strStatus = "打印机状态正常"; } else if (i == -1) { strStatus = "接收数据失败"; } else if (i == -2) { strStatus = "打印机缺纸"; } else if (i == -3) { strStatus = "打印机纸将尽"; } else if (i == -4) { strStatus = "打印机开盖"; } else if (i == -5) { strStatus = "发送数据失败"; } getActivity().runOnUiThread(new Runnable() { public void run() { ToastUtil.shortShow(strStatus); XLog.i(TAG, "zl at SettingActivity.java onClick()------> btn_status_test"); } }); } }).start(); } else { ToastUtil.shortShow(mContext.getResources().getString(R.string.no_connected)); } break; case R.id.rl_print_test: //打印测试 case R.id.btn_selfprint_test: if (!isConnected) { ToastUtil.shortShow("设备未连接,请重连"); break; } ProductLabelBean productLabelBean = new ProductLabelBean(); productLabelBean.setName("测试"); productLabelBean.setUnit("包"); productLabelBean.setCash("2.00"); productLabelBean.setEprice("1"); productLabelBean.setProducer("广州"); productLabelBean.setSn("0000000000001"); productLabelBean.setPrice("3.00"); new PrintLabelGaomi().doPrintTSPL(myPrinter, getActivity(), productLabelBean); break; default: break; } } /** * 断开连接 */ public static void breakPrinter() { if (myPrinter != null) { /** * 断开打印设备的连接 */ myPrinter.closeConnection(); myPrinter = null;//清空打印对象 XLog.i(TAG, "yxz at SettingActivity.java onClick() mPrinter:" + myPrinter); } if (isConnected) { tv_device_name.setText("设备名称: " + "思普瑞特价签机"); label_print_state.setText(mContext.getResources().getString(R.string.on_line)); } else { tv_device_name.setText("设备名称:未连接"); label_print_state.setText(mContext.getResources().getString(R.string.off_line)); } // label_print_state.setText(mContext.getResources().getString(R.string.off_line)); ToastUtil.shortShow("已断开连接"); } public static void getDevice() { if (myPrinter == null) { /** * 检测所有的打印设备 */ UsbManager manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);//获取usb权限 HashMap<String, UsbDevice> devices = manager.getDeviceList(); deviceList = new ArrayList<>(); for (UsbDevice device : devices.values()) { /** * 判断是都是打印设备。目前支持 (1155 != vendorId || 22304 != productId) && (1659 != vendorId || 8965 != productId) 两种 */ if (USBPort.isUsbPrinter(device)) { if (device.getVendorId() == 1155 && device.getProductId() == 22304) { deviceArrayLisr = device.getDeviceName() + "\nvid: " + device.getVendorId() + " pid: " + device.getProductId(); deviceList.add(device); } } } if (deviceList.isEmpty()) { ToastUtil.shortShow(mContext.getResources().getString(R.string.no_connected)); return; } mUSBDevice = deviceList.get(0); if (mUSBDevice == null) { mHandler.obtainMessage(PrinterConstants.Connect.FAILED).sendToTarget(); return; } myPrinter = PrinterInstance.getPrinterInstance(mContext, mUSBDevice, mHandler); devicesName = mUSBDevice.getDeviceName(); devicesAddress = "vid: " + mUSBDevice.getVendorId() + " pid: " + mUSBDevice.getProductId(); UsbManager mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE); if (mUsbManager.hasPermission(mUSBDevice)) { myPrinter.openConnection(); } else { // 没有权限询问用户是否授予权限 PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); mContext.registerReceiver(mUsbReceiver, filter); mUsbManager.requestPermission(mUSBDevice, pendingIntent); // 该代码执行后,系统弹出一个对话框 } } } //弹出选择设备dialog private void showSelectDevicesDialog() { Intent intent = new Intent(getActivity(), UsbDeviceList.class); startActivityForResult(intent, CONNECT_DEVICE); } // 用于接受连接状态消息的 Handler @SuppressLint("HandlerLeak") public static Handler mHandler = new Handler() { @SuppressLint("ShowToast") @Override public void handleMessage(Message msg) { switch (msg.what) { case PrinterConstants.Connect.SUCCESS: ToastUtil.shortShow("连接成功"); isConnected = true; Constants.ISCONNECTED = isConnected; Constants.DEVICE_NAME = devicesName; break; case PrinterConstants.Connect.FAILED: isConnected = false; ToastUtil.shortShow(mContext.getResources().getString(R.string.conn_failed)); Log.i(TAG, "连接失败!"); break; case PrinterConstants.Connect.CLOSED: isConnected = false; Constants.ISCONNECTED = isConnected; Constants.DEVICE_NAME = devicesName; Log.i(TAG, "连接关闭!"); break; case PrinterConstants.Connect.NODEVICE: isConnected = false; ToastUtil.shortShow(mContext.getResources().getString(R.string.conn_no)); break; case 0: ToastUtil.shortShow("打印通信正常"); break; case -1: ToastUtil.shortShow("打印机通信异常,请检查蓝牙连接"); vibrator(); break; case -2: ToastUtil.shortShow("打印缺纸"); vibrator(); break; case -3: ToastUtil.shortShow("打印机开盖"); vibrator(); break; default: break; } updateButtonState(isConnected); } }; static int count = 0; public static void vibrator() { count++; PrefUtils.setInt(mContext, "count3", count); Log.e(TAG, "" + count); // TODO: 2017/12/5 禁用视频 // MediaPlayer player = new MediaPlayer().create(mContext, R.raw.test2); // player.start(); } private static void updateButtonState(boolean isConnected) { if (isConnected) { tv_device_name.setText("设备名称: " + "思普瑞特价签机"); label_print_state.setText(mContext.getResources().getString(R.string.on_line)); // getDevice(); } else { label_print_state.setText(mContext.getResources().getString(R.string.off_line)); tv_device_name.setText("设备名称:未连接"); XLog.d(TAG, "yxz at SettingActivity.java updateButtonState() ---end"); } PrefUtils.setBoolean(mContext, Constants.CONNECTSTATE, isConnected); } // 安卓3.1以后才有权限操作USB @SuppressLint("ShowToast") @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != Activity.RESULT_OK) { return; } if (requestCode == CONNECT_DEVICE) { // 连接设备 // usb mUSBDevice = data.getParcelableExtra(UsbManager.EXTRA_DEVICE); myPrinter = PrinterInstance.getPrinterInstance(getActivity(), mUSBDevice, mHandler); devicesName = "思普瑞特价签机"; UsbManager mUsbManager = (UsbManager) getActivity().getSystemService(Context.USB_SERVICE); if (mUsbManager.hasPermission(mUSBDevice)) { myPrinter.openConnection(); } else { // 没有权限询问用户是否授予权限 PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 0, new Intent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); getActivity().registerReceiver(mUsbReceiver, filter); // 该代码执行后,系统弹出一个对话框 mUsbManager.requestPermission(mUSBDevice, pendingIntent); } } } private static final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override @SuppressLint("NewApi") public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.w(TAG, "receiver action: " + action); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { mContext.unregisterReceiver(mUsbReceiver); UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false) && mUSBDevice.equals(device)) { myPrinter.openConnection(); } else { mHandler.obtainMessage(PrinterConstants.Connect.FAILED).sendToTarget(); Log.e(TAG, "permission denied for device " + device); } } } } }; public void onDestroy() { XLog.e(TAG, "yxz at SettingActivity.java onDestroy() progressdialog"); super.onDestroy(); if (hasRegDisconnectReceiver) { mContext.unregisterReceiver(mUsbReceiver); hasRegDisconnectReceiver = false; // Log.i(TAG, "关闭了广播!"); } } }
注:此连接方式是需要连接sdk去连接的,如遇到同样问题的开发朋友,可留言跟我要下载地址
附:标签打印的位置如果是正常位置的话,可根据xy的坐标去调试即可,但是如果标签是反过来了,就需要代码控制字体旋转180度,但是旋转之后的位置是需要注意的,旋转之后的字体如果超出了标签纸大小的话,就会出现打印异常,标签打印机不会打印,会没有反应,所有要算好位置。还有一个,就是标签打印机是不能打印null数据的,如果数据为null,则需要判空,如果为null,可以打印一个空格。
旋转180度方法经验总结:旋转180度,是以标签打印纸的中心,进行旋转,旋转位置就如长方形的对角位置互换,只是两个对角,就好比一根棍子放在中心点上去旋转180度一样,这是我调试总结出来的,希望对需要的开发的朋友提供些许帮助。尽早脱坑。如果发现了更好的办法,希望多多留意交流。