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
相关产品推荐
相关产品推荐

