Android Studio中用Kotlin实现自定义文档无预览直接打印
跳过Android打印预览直接打印的实现方案
方案一:基于Android系统打印框架(限制较多)
Android系统打印框架默认强制显示预览界面,这是系统级的交互设计,没有公开API直接跳过。但可以通过以下方式优化流程,接近“直接打印”的体验:
- 预先设置默认打印机
引导用户前往系统打印设置界面,选择目标Wi-Fi/蓝牙打印机并设为默认:Intent intent = new Intent(Settings.ACTION_PRINT_SETTINGS); startActivity(intent); - 提交打印任务
保持你已实现的PrintDocumentAdapter,调用PrintManager.print()时,确保传入匹配打印机能力的PrintAttributes。如果默认打印机已设置且属性匹配,部分设备会直接触发打印(但仍有部分厂商系统会保留预览,无法完全保证):PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE); String jobName = getString(R.string.app_name) + " 打印任务"; // 传入你已实现的PrintDocumentAdapter PrintJob printJob = printManager.print(jobName, printAdapter, null);
方案二:直接对接Wi-Fi/蓝牙打印机(推荐,完全跳过预览)
这种方式不依赖系统打印框架,直接通过硬件连接发送打印指令(主流小票/文档打印机大多支持ESC/POS指令集),能完全实现无预览直接打印。
蓝牙打印机实现步骤
- 权限配置(AndroidManifest.xml)
<!-- Android 12及以上 --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <!-- Android 11及以下 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> - 连接并打印代码示例
// 假设已通过蓝牙配对获取到目标BluetoothDevice实例 private void printViaBluetooth(BluetoothDevice device) { try { // 创建蓝牙Socket(通用端口号对应的UUID) BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); socket.connect(); OutputStream outputStream = socket.getOutputStream(); // 发送ESC/POS打印指令:打印文本、换行、切纸 String content = "自定义打印内容\n"; outputStream.write(content.getBytes("GBK")); // 切纸指令 outputStream.write(new byte[]{0x1B, 0x69}); outputStream.flush(); outputStream.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } }
Wi-Fi打印机实现步骤
- 权限配置
<uses-permission android:name="android.permission.INTERNET" /> - 连接并打印代码示例
// 打印机的IP地址和端口(默认9100) private void printViaWifi(String printerIp, int port) { new Thread(() -> { try { Socket socket = new Socket(printerIp, port); OutputStream outputStream = socket.getOutputStream(); String content = "自定义打印文档内容\n"; outputStream.write(content.getBytes("GBK")); // 切纸指令 outputStream.write(new byte[]{0x1B, 0x69}); outputStream.flush(); outputStream.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } }).start(); }
注意事项
- 不同打印机的ESC/POS指令可能略有差异,需参考对应打印机的官方文档调整指令。
- 蓝牙连接前需确保设备已配对,Wi-Fi打印机需和设备处于同一局域网。
- 耗时操作(如蓝牙/Wi-Fi连接)需放在子线程中执行,避免阻塞主线程。
内容的提问来源于stack exchange,提问作者Gaara
相关产品推荐
相关产品推荐

