Chrome应用通过蓝牙热敏打印机RPP02N打印无输出求助
问题:Chrome通过蓝牙热敏打印机RPP02N打印无内容输出
已完成蓝牙配对并启用自定义PrintService,打印时仅显示进度但无内容输出,实现代码如下:
1. onStartPrinterDiscovery方法
public void onStartPrinterDiscovery(List<PrinterId> priorityList) { if (!priorityList.isEmpty()) { return; } // RPP02N 66:12:29:4F:06:1C | 54:47:41:07:70:79 || 66:12:29:4F:06:1C final List<PrinterInfo> printers = new ArrayList<>(); final PrinterId printerId = generatePrinterId("66:12:29:4F:06:1C"); final PrinterInfo.Builder builder = new PrinterInfo.Builder(printerId, "RPP02N", PrinterInfo.STATUS_IDLE); PrinterCapabilitiesInfo.Builder capBuilder = new PrinterCapabilitiesInfo.Builder(printerId); capBuilder.addMediaSize(PrintAttributes.MediaSize.ISO_A4, true); capBuilder.addMediaSize(PrintAttributes.MediaSize.ISO_A3, false); capBuilder.addMediaSize(PrintAttributes.MediaSize.NA_INDEX_4X6, false); capBuilder.addResolution(new PrintAttributes.Resolution("resolutionId", "default resolution", 600, 600), true); capBuilder.setColorModes(PrintAttributes.COLOR_MODE_MONOCHROME, PrintAttributes.COLOR_MODE_MONOCHROME); builder.setCapabilities(capBuilder.build()); printers.add(builder.build()); addPrinters(printers); }
2. onPrintJobQueued方法
protected void onPrintJobQueued(PrintJob printJob) { final PrintDocument document = printJob.getDocument(); final FileInputStream in = new FileInputStream(document.getData().getFileDescriptor()); try { final byte[] buffer = new byte[4096]; in.read(buffer); } catch (IOException e) { Log.d("myprinter", "", e); } finally { try { in.close(); } catch (IOException e) { assert true; } } printJob.complete(); }
解决思路
核心问题:未向打印机传输数据
当前onPrintJobQueued仅读取了文件内容但完全没有和蓝牙打印机建立连接并发送数据,直接标记任务完成,这是无输出的根本原因。步骤修复建议
- 建立蓝牙连接:
利用打印机MAC地址66:12:29:4F:06:1C获取BluetoothDevice实例,通过createRfcommSocketToServiceRecord方法创建RFCOMM套接字(传入SPP服务UUID:00001101-0000-1000-8000-00805F9B34FB),调用connect()建立连接。 - 正确读取并发送打印数据:
循环读取打印文档直到文件结束,而非仅读取一次4096字节;将读取到的字节通过蓝牙套接字的输出流发送给打印机。注意热敏打印机需要ESC/POS指令(如换行、切纸),若Chrome生成PDF等格式,需先转换为打印机支持的格式(如位图转ESC/POS指令)。 - 处理异常与任务状态:
连接失败或数据发送出错时,调用printJob.fail()标记任务失败;确保Manifest中声明蓝牙相关权限(BLUETOOTH、BLUETOOTH_ADMIN,Android 12+需BLUETOOTH_CONNECT、BLUETOOTH_SCAN),并获取运行时权限。
- 建立蓝牙连接:
打印机能力匹配调整
RPP02N是热敏小票打印机,当前默认介质设为A4不匹配,需修改capBuilder.addMediaSize将NA_INDEX_4X6设为默认,避免Chrome生成不兼容的打印文档。
内容的提问来源于stack exchange,提问作者MrX
相关产品推荐
相关产品推荐

