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

Xamarin.Forms安卓应用直接通过TCP发送打印任务需求

绕过Android打印框架的直接打印方案(Xamarin.Forms Android)

针对你在Xamarin.Forms Android应用里需要直接发送基础文本打印任务、不想受限于系统打印框架(要预配置打印机还必须弹预览)的需求,下面是几个亲测可行的方案:

1. 蓝牙直连打印(适合蓝牙热敏/针式打印机)

如果你的打印机支持蓝牙,这是最直接的路子。我们可以用Android的蓝牙API直接配对连接,然后把文本流丢给打印机就行:

  • 大致步骤:
    • 获取蓝牙适配器,检查是否开启,没开就提示用户打开
    • 通过MAC地址找到目标打印机设备,建立RFCOMM串口连接(用通用的蓝牙串口UUID就行)
    • 获取输出流,写入要打印的文本——注意很多打印机认\r\n当换行,别只用\n,不然可能打出来全连在一起
    • 打印完记得关流和连接

给你一段Android项目里的示例代码:

using Android.Bluetooth;
using System.IO;

public async Task PrintOverBluetooth(string printerMac, string printText)
{
    var bluetoothAdapter = BluetoothAdapter.DefaultAdapter;
    if (bluetoothAdapter == null || !bluetoothAdapter.IsEnabled)
    {
        // 这里可以弹个提示让用户开蓝牙,比如用Xamarin.Forms的DisplayAlert
        return;
    }

    var printerDevice = bluetoothAdapter.GetRemoteDevice(printerMac);
    // 通用蓝牙串口服务UUID,大部分打印机都支持这个
    var socket = printerDevice.CreateRfcommSocketToServiceRecord(UUID.FromString("00001101-0000-1000-8000-00805F9B34FB"));

    try
    {
        await socket.ConnectAsync();
        using (var outputStream = socket.OutputStream)
        using (var streamWriter = new StreamWriter(outputStream))
        {
            // 加\r\n确保打印机换行
            await streamWriter.WriteAsync(printText + "\r\n");
            await streamWriter.FlushAsync();
        }
    }
    catch (Exception ex)
    {
        // 处理连接失败或者打印出错的情况,比如弹个错误提示
    }
    finally
    {
        socket?.Close();
    }
}

别忘了在AndroidManifest.xml加权限:BLUETOOTH、BLUETOOTH_ADMIN,Android 6.0以上还要动态申请ACCESS_FINE_LOCATION(用来扫描蓝牙设备)

2. TCP/IP网络打印(适合带网络的打印机)

如果打印机是连在局域网里的(有固定IP),直接用Socket发文本到打印机的9100端口(大部分网络打印机的RAW打印默认端口)就行,完全不用管系统的打印机配置:

示例代码如下:

using System.Net.Sockets;
using System.IO;

public async Task PrintOverTcpIp(string printerIp, int port = 9100, string printText)
{
    using (var tcpClient = new TcpClient())
    {
        try
        {
            await tcpClient.ConnectAsync(printerIp, port);
            using (var networkStream = tcpClient.GetStream())
            using (var streamWriter = new StreamWriter(networkStream))
            {
                await streamWriter.WriteAsync(printText + "\r\n");
                await streamWriter.FlushAsync();
            }
        }
        catch (Exception ex)
        {
            // 处理连接异常,比如打印机离线、IP不对
        }
    }
}

这个方案最省心,只要打印机在网络里,直接发数据就打,连预览界面都不会出现。

3. 用打印机厂商的专属SDK

如果你的打印机是特定品牌(比如斑马、爱普生),很多厂商都有Xamarin兼容的SDK,这些SDK已经封装好了底层的连接逻辑,还能直接调用打印接口,不仅能打文本,还能处理条码、切纸这些功能(当然你只打基础文本也完全能用)。

比如爱普生的ESC/POS SDK,直接调用API传文本就行,不用自己折腾蓝牙或网络连接的细节,稳定性也更高。

几个踩过坑的注意点

  • 不同打印机对文本编码和换行符的要求不一样,先打个"Test Print\r\n"试试,不行再换"\n"或者调整编码
  • 权限一定要处理好:Android 6.0+的危险权限(比如蓝牙需要的位置权限)要动态申请,不然会连不上设备
  • 在Xamarin.Forms项目里,你可以用DependencyService把这些平台特定的打印代码封装起来,这样共享代码里就能直接调用,不用写平台判断

内容的提问来源于stack exchange,提问作者Martin Crawley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:16:21