[Widget]Android小票打印,蓝牙打印、固定IP打印、黑白图片打印
Printer
标准ES-POS命令打印,固定IP或蓝牙打印,支持黑白图片打印
预览
项目
Github
Bintray
要求
- minSdkVersion 5
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH" />
引用
dependencies {⋯compile 'am.util:printer:2.0.0'⋯
}
详情
- 实现PrintDataMaker接口来实现打印任务
- 继承PrinterWriter来实现更多纸张类型的打印
- PrinterUtils包含了众多打印指令
使用
1.添加蓝牙权限<uses-permission android:name="android.permission.BLUETOOTH" />
或者网络请求权限<uses-permission android:name="android.permission.INTERNET" />
2.实现PrintDataMaker接口,完成具体打印任务:
public class TestPrintDataMaker implements PrintDataMaker {private Context context;private String qr;private int width;private int height;public TestPrintDataMaker(Context context, String qr, int width, int height) {this.context = context;this.qr = qr;this.width = width;this.height = height;}@Overridepublic List<byte[]> getPrintData(int type) {ArrayList<byte[]> data = new ArrayList<>();try {PrinterWriter printer;printer = type == PrinterWriter58mm.TYPE_58 ? new PrinterWriter58mm(height, width) : new PrinterWriter80mm(height, width);printer.setAlignCenter();data.add(printer.getDataAndReset());ArrayList<byte[]> image1 = printer.getImageByte(context.getResources(), R.drawable.ic_printer_logo);data.addAll(image1);printer.setAlignLeft();printer.printLine();printer.printLineFeed();printer.printLineFeed();printer.setAlignCenter();printer.setEmphasizedOn();printer.setFontSize(1);printer.print("我的餐厅");printer.printLineFeed();printer.setFontSize(0);printer.setEmphasizedOff();printer.printLineFeed();printer.print("最时尚的明星餐厅");printer.printLineFeed();printer.print("客服电话:400-8008800");printer.printLineFeed();printer.setAlignLeft();printer.printLineFeed();printer.print("订单号:88888888888888888");printer.printLineFeed();printer.print("预计送达:" +new SimpleDateFormat("yyyy/MM/dd HH:mm", Locale.getDefault()).format(new Date(System.currentTimeMillis())));printer.printLineFeed();printer.setEmphasizedOn();printer.print("#8(已付款)");printer.printLineFeed();printer.print("××区××路×××大厦××楼×××室");printer.printLineFeed();printer.setEmphasizedOff();printer.print("13843211234");printer.print("(张某某)");printer.printLineFeed();printer.print("备注:多加点辣椒,多加点香菜,多加点酸萝卜,多送点一次性手套");printer.printLineFeed();printer.printLine();printer.printLineFeed();printer.printInOneLine("星级美食(豪华套餐)×1", "¥88.88", 0);printer.printLineFeed();printer.printInOneLine("星级美食(限量套餐)×1", "¥888.88", 0);printer.printLineFeed();printer.printInOneLine("餐具×1", "¥0.00", 0);printer.printLineFeed();printer.printInOneLine("配送费", "免费", 0);printer.printLineFeed();printer.printLine();printer.printLineFeed();printer.setAlignRight();printer.print("合计:977.76");printer.printLineFeed();printer.printLineFeed();printer.setAlignCenter();data.add(printer.getDataAndReset());String bitmapPath = FileUtils.getExternalFilesDir(context, "Temp") + "tmp_qr.jpg";if (QRCodeUtil.createQRImage(qr, 380, 380, null, bitmapPath)) {ArrayList<byte[]> image2 = printer.getImageByte(bitmapPath);data.addAll(image2);} else {ArrayList<byte[]> image2 = printer.getImageByte(context.getResources(), R.drawable.ic_printer_qr);data.addAll(image2);}printer.printLineFeed();printer.print("扫一扫,查看详情");printer.printLineFeed();printer.printLineFeed();printer.printLineFeed();printer.printLineFeed();printer.printLineFeed();printer.feedPaperCutPartial();data.add(printer.getDataAndClose());return data;} catch (Exception e) {return new ArrayList<>();}}
}
3.创建打印执行者:
PrintExecutor executor = new PrintExecutor(String ip, int port, int type);
PrintExecutor executor = new PrintExecutor(BluetoothDevice device, int type);
4.设置执行者状态监听:
executor.setOnStateChangedListener(new PrintSocketHolder.OnStateChangedListener() {@Overridepublic void onStateChanged(int state) {switch (state) {case PrintSocketHolder.STATE_0://生成打印页面数据...break;case PrintSocketHolder.STATE_1://生成数据成功,开始创建Socket连接...break;case PrintSocketHolder.STATE_2://创建Socket成功,开始获取输出流...break;case PrintSocketHolder.STATE_3://获取输出流成功,开始写入打印页面数据...break;case PrintSocketHolder.STATE_4://写入打印页面数据成功,正在完成打印...break;}}
});
4.设置执行者回调监听:
executor.setOnPrintResultListener(new PrintExecutor.OnPrintResultListener() {@Overridepublic void onResult(int errorCode) {switch (errorCode) {case PrintSocketHolder.ERROR_0://打印成功完成!break;case PrintSocketHolder.ERROR_1://生成打印页面数据失败!break;case PrintSocketHolder.ERROR_2://创建Socket失败!break;case PrintSocketHolder.ERROR_3://获取输出流失败!break;case PrintSocketHolder.ERROR_4://写入打印页面数据失败!break;case PrintSocketHolder.ERROR_5://必要的参数不能为空!break;case PrintSocketHolder.ERROR_6://关闭Socket出错break;case PrintSocketHolder.ERROR_100://打印失败break;}}
});
5.执行打印:
int result = executor.doPrinterRequest(PrintDataMaker maker);//同步
executor.doPrinterRequestAsync(PrintDataMaker maker);//异步
如果你要实现自己的打印机PrinterWriter,那么你需要继承
public class PrinterWriter80mm extends PrinterWriter {public static final int TYPE_80 = 80;// 纸宽80mmpublic int width = 500;public PrinterWriter80mm() throws IOException {}public PrinterWriter80mm(int parting) throws IOException {super(parting);}public PrinterWriter80mm(int parting, int width) throws IOException {super(parting);this.width = width;}@Overrideprotected int getLineWidth() {//一行能够放下多少个“-”return 24;}@Overrideprotected int getLineStringWidth(int textSize) {//根据字体的大小,一行可以放下多少个英文字符switch (textSize) {default:case 0:return 47;case 1:return 23;}}@Overrideprotected int getDrawableMaxWidth() {//图片能够全部打印在纸上的最大宽度return width;}
}
注意
- 打印图片出现乱码或者打印不出,大部分原因是打印机缓存较小导致,可调小PrinterWriter80mm的parting参数,设置其图片高度分割值(0~255),调小了还不行的话,缩小图片尺寸或者调整输出流的写入方式。
- 仅提供建立蓝牙连接打印,不包括蓝牙搜索及配对功能
- 不包含二维码生成功能
历史
- 1.1.4(说明)
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.0
[Widget]Android小票打印,蓝牙打印、固定IP打印、黑白图片打印相关推荐
- s5pv210 android 4.0.4 设置固定ip移植
由于工作要求移植4.0.4android的设置固定ip,所以安下心看看了看调用关系如下,但是函数调用接口变了只能是自己改了, android2.3调用关系 android2.3 packages/ap ...
- Android 蓝牙/wifi云打印机 ESC/POS热敏打印机打印(ESC/POS指令篇)
上一篇主要介绍了如何通过蓝牙打印机和wifi云打印机的连接与数据发送,这一篇,我们就介绍向打印机发送打印指令,来打印字符和图片. 由于公司暂且买了两台打印机,一台佳博GP-58MIII,一台GP-SH ...
- 如何锁定计算机的打印功能,打印机设置固定IP的详细图形教程
在计算机上设置打印机共享通常不如在"右键菜单"上共享那样简单. 在共享过程中会遇到很多问题. 大量问题是由Windows安全机制引起的. 解决后,"共享"将没有 ...
- 小程序蓝牙打印机CPCL图片打印问题梳理
小程序蓝牙打印机CPCL指令图片打印问题梳理 本文以汉印HM-T3便携式打印机示例讲解 手册中要求需要用ASCII码十六进制字符下发命令,源引自 有赞零售小票打印跨平台解决方案 图片处理 由于 JS ...
- ip登录打印机怎么打印_不要打印,登录。
ip登录打印机怎么打印 Often on Python, especially as a beginner, you might print( ) a variable in order to see ...
- Android官方开发文档Training系列课程中文版:打印内容之图像打印
原文地址:http://android.xsoftlab.net/training/printing/index.html 引言 Android用户会很频繁的浏览设备上的内容,但是有部分情况例外,当屏 ...
- php 只打印某个区域,PHP打印代码页面固定区域
在使用PHP软件的朋友们肯定碰上过没有打印代码的情况!PHP打印代码页面固定区域让您在这里直接输入代码就能解决问题啦!想要继续打印工作的话您可以使用狂飙php最新版和PHP开发课安卓版中进行了解!PH ...
- Android官方开发文档Training系列课程中文版:打印内容之自定义文档打印
原文地址:http://android.xsoftlab.net/training/printing/custom-docs.html 对于一些应用,比如绘图类APP,版面设计类APP以及其它APP, ...
- 条码打印软件如何固定二维码的尺寸和位置
用过条码打印软件的小伙伴会知道,在软件中生成二维码后,可以直接在画布上用鼠标拖动二维码,改变二维码位置,也可以用鼠标拖动二维码四个角方形点修改二维码尺寸,设置是非常灵活. 但是也有的客户用条码打印软件 ...
最新文章
- 一分钟在Linux环境下创建一台SFTP服务器(含账户创建)
- 什么是SAP重复性生产
- MacBook Air m1的内存
- aspnet登录界面代码_SPA+.NET Core3.1 GitHub第三方授权登录
- Java实现Huffman哈夫曼树
- (2)FPGA开发流程介绍(第1天)
- 1月第4周安全回顾 移动安全受关注 ***威胁公共设施
- 转: 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
- Altium Designer简明教程:如何创建元件库并绘制库元件(图文教程)
- 进销存excel_干货分享,上班族必看。EXCEL轻松搞定制作进销存报表
- 决策树和随机森林预测员工离职率学习代码
- Matlab 中 residuez函数的使用
- Ajax 改造,第 3 部分: 用 jQuery、Ajax 选项卡和照片 carousel 改进现有的站点
- 当Android开发遇到魅族手机
- Adobe国际认证设计师含金量,能否代表设计师的真实水平?
- 如何将PDF批量转成JPG?
- php 正方,用php的CURL模拟登录正方教务系统
- windows下golang监控鼠标和键盘事件
- 传奇单机架设教程 小白也能开传奇
- mysql查询数据量