蓝牙打印插件:
https://github.com/xiyuxiaoxiao/flutter_public/tree/main/zs_bluetooth_printer
简介
- 语言 Flutter, 支持 Android、 iOS
- 由于项目需求涉及蓝牙打印,所以把打印模块单独写成了插件
- 插件功能:
- 含有连接蓝牙设备的UI;
- 使用指令打印
· 小标签打印, 使用CPCL指令打印, 会读取是否打印成功 在打印下一张,如果打印机断开或者没纸张了, 当打印机再次连接会重新打印,
· 小票也可以直接将escpos指令传入打印 - 打印机型号 建议使用佳博型号:GP-M322
CPCL指令打印 已经支持封装好模版了,模版规范参考菜鸟组件; 只需要设置模版即可
最后只需要引入 zs_bluetooth_printer 即可
zs_bluetooth_printer
使用 步骤 一
引入:
zs_bluetooth_printer:
git:
url: https://github.com/xiyuxiaoxiao/flutter_public.git
path: zs_bluetooth_printer
配置项目 添加蓝牙相关权限
Android
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/>
如果SDK报错 :
android/build.gradle 下修改 minSdkVersion:19 compileSdkVersion targetSdkVersion 为 28;
Ios
-- info.plist
Privacy - Bluetooth Always Usage Description
Privacy - Bluetooth Peripheral Usage Description
-- Background Modes
Uses Bluetooth LE accessories
需要录制打印视频上传优酷或者直接在appstore附件中添加视频说明
1. 继承ZsBluetoothPrinterApi 实现相关方法 ( class MyPrinter extends ZsBluetoothPrinterApi )
在mian中初始化
await ZsBluetoothPrinterManager.initPrinter(MyPrinter());
2. MaterialApp 中对 ScreenUtil 初始化 (因为内部使用了比例布局计算)
builder: (context, child) {
ScreenUtil.init(context, designSize: Size(750, 1334), allowFontScaling: false);
return child;
},
3. 路由中监听 判断是否是插件内部的页面 是的话直接使用插件的onGenerateRoute
onGenerateRoute: (RouteSettings settings){
var route = ZsBluetoothPrinterManager.onGenerateRoute(settings);
if (route != null) {
return route;
}
},
4. 在assets: 添加包内部资源文件
- packages/zs_bluetooth_printer/img/dialog_error.png
- packages/zs_bluetooth_printer/img/small_label_barcode.png
- packages/zs_bluetooth_printer/img/ic_back.png
5. 使用打印方法
// 检测是否有连接了打印
var res = PrintUtil.checkPrinterConnect();
// 检测模版是否配置
awiat PrintUtil.checkSmallPrintTemple();
// 加入打印队列
PrintUtil(printJson: {}).addTask();
6. 监听蓝牙通知用
需要监听对象实现接口 ZSNotifcationCenterDelegate
abstract class ZSNotifcationCenterDelegate {
observeNotify(String key, dynamic param); // observeNotify为通知回调
}
// 添加监听
ZSNotifcationCenter.addObserveForKey(observe, Notify_Observe_StoreBluetooth_Key);
// 移除监听
ZSNotifcationCenter.removeObserve(observe);
通知相关Key
Notify_Observe_BlueState_Key; // 蓝牙状态变化
Notify_Observe_StoreBluetooth_Key; // 存储连接的设备
二. 字体单位映射 默认使用毫米单位
1. 如果需要映射 设置 ZsBluetoothPrinterApi 的 fontSizeUnitMillimeter = false;
2. 重写 ZsBluetoothPrinterApi 的 fontSizeMapToMillimeter 默认使用系统的像素映射毫米
三. 显示浮窗显示任务个数
1. 设置 ZsBluetoothPrinterApi 的 showPrintTaskOverlay = true;
2. 需要在Page build中设置 appContent
ZsBluetoothPrinterManager.setAppContext(context);
3. 自定义浮窗Widget 否则使用默认的
重写 ZsBluetoothPrinterApi 的 printTaskOverlayWidget
具体可参考案例
https://github.com/xiyuxiaoxiao/flutter_public/tree/main/printer_example/test_app
CPCL小标签模版说明
模版json数据 赋值的 表示默认值
文字会自适应大小;
字体大小规范 (2、2.5、3、4、5、6、7、8、9)mm 等大小
[{
String fieldType = “text”; // 打印类型 text 、 barcode
String field; // 内容对应的key
String fieldHidden; // 动态隐藏标签字段 json[fieldHidden] == 1 显示
String text; // 标题 实际不同 对应菜鸟别名 (当 field 空的时候 展示的内容)
String description; // 描述 用于展示模版的信息
String left; // 定位 左
String top; // 定位 上
String width; // 控件所占宽度
String height; // 控件所占高度
String fontSize = “3”; // 字体大小
String fontWeight = “0”; // 字体是否加粗 0 不加粗 1加粗
int rotation = 0; // 旋转角度 90度
int hideText = 1; // 是否隐藏barcode的文字: 0不隐藏 1隐藏
int bgBlack = 0; // 背景是否黑色 1为黑色 0 白色
String textAlign = “left”; //水平方向有效 只需要设置 left center right
String textAlignVertical = “top”;//垂直方向有效 top center bottom
}]