You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中用Kotlin实现自定义文档无预览直接打印

跳过Android打印预览直接打印的实现方案

方案一:基于Android系统打印框架(限制较多)

Android系统打印框架默认强制显示预览界面,这是系统级的交互设计,没有公开API直接跳过。但可以通过以下方式优化流程,接近“直接打印”的体验:

  1. 预先设置默认打印机
    引导用户前往系统打印设置界面,选择目标Wi-Fi/蓝牙打印机并设为默认:
    Intent intent = new Intent(Settings.ACTION_PRINT_SETTINGS);
    startActivity(intent);
    
  2. 提交打印任务
    保持你已实现的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指令集),能完全实现无预览直接打印。

蓝牙打印机实现步骤

  1. 权限配置(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" />
    
  2. 连接并打印代码示例
    // 假设已通过蓝牙配对获取到目标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打印机实现步骤

  1. 权限配置
    <uses-permission android:name="android.permission.INTERNET" />
    
  2. 连接并打印代码示例
    // 打印机的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:35:07