thon-ju/bluetooth_print

打印安卓二维码浓度低,无法使用和连接异常和断开连接异常的问题

DeanNode opened this issue · 2 comments

我的蓝牙打印机在打印QRCODE(二维码)中安卓打印的清晰度太低,导致无法正常使用,后来在printContext中把打印浓度的枚举类从7(好像是7)改成了15,之后可以安卓打印二维码就可以非常清晰了。但是现在存在以下问题:
1:无法判断当前蓝牙设备是否已经正常连接,判断结果往往是错的bluetoothPrint.isConnected和bluetoothPrint.state.listen监听的结果汪汪是错的。
2:bluetoothPrint.connect(device)方法中,往往device不是null反而会出现NullException。
3:bluetoothPrint.disconnect()这个方法经常使用时会导致应用直接崩溃掉(闪退)
`import 'package:bluetooth_print/bluetooth_print.dart';
import 'package:bluetooth_print/bluetooth_print_model.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:guards/bean/BlueJurisdiction.dart';
import 'package:guards/utils/interface/BluetoothFactory.dart';

/// @description BluetoothFactoryImpl
/// @author Activation
/// @Date 2021/1/26 11:14
class BluetoothFactoryImpl implements BluetoothFactory {
BluetoothPrint bluetoothPrint = BluetoothPrint.instance;
bool isConnFlag = false;

@OverRide
Future disconnect() async {
await bluetoothPrint.stopScan();
await bluetoothPrint.disconnect();
await bluetoothPrint.destroy();
}

@OverRide
Future checkBluetoothAccess() async {
bool openFlag = await bluetoothPrint.isOn;

if (!openFlag) {
  //DialogUtil().showMsg(context, "请您先开启蓝牙");
  return BlueJurisdiction(false, "请您先开启蓝牙");
}
bool authorityFlag = await bluetoothPrint.isAvailable;
if (!authorityFlag) {
  //DialogUtil().showMsg(context, "请您先授予蓝牙的使用权限");
  return BlueJurisdiction(false, "请您先授予蓝牙的使用权限");
}
return BlueJurisdiction(true, "可以连接蓝牙");
//bluetoothPrint.isConnected.then((value) => print(value));

}

@OverRide
Future joinBluetooth() async {
EasyLoading.show(status: "连接蓝牙中。。");
try {
await bluetoothPrint.startScan(timeout: Duration(seconds: 4));
Stream<List> tempStream = bluetoothPrint.scanResults;
print(tempStream);
bool tempFlag = false;
//执行自动连接
tempStream.listen((event) async {
for (BluetoothDevice device in event) {
if (device.name.startsWith(r"Printer_")) {
tempFlag = true;
if (tempFlag && device != null) {
// await bluetoothPrint.disconnect();
print("这里是连接的设备信息$device");
await bluetoothPrint.connect(device);
await bluetoothPrint.stopScan();
}
}
}
});
await bluetoothPrint.isConnected.then((value) {
print("这里是对应的当前值是否已经连接的返回值$value");
});
bluetoothPrint.state.listen((state) {
print("这里是正在监听值的变化$state");
switch (state) {
case BluetoothPrint.CONNECTED:
print("蓝牙已经连接了");
isConnFlag = true;
break;
case BluetoothPrint.DISCONNECTED:
isConnFlag = false;
print("蓝牙还没有连接");
break;
default:
break;
}
});
} catch (e) {
print("这里是对应的异常信息");
print("${e.runtimeType}${e.toString()}");
} finally {
EasyLoading.dismiss();
}
}

@OverRide
Future executePrint(List tempLists) async {
print("这里已经执行了$isConnFlag");
if (isConnFlag) {
await bluetoothPrint.printLabel(config, tempLists);
} else {
throw Exception("当前设备未连接,请关闭蓝牙之后再重试");
// await joinBluetooth().then((value) {
// bluetoothPrint.printLabel(config, tempLists);
// });
}
}

@OverRide
Map<String, dynamic> config = {'width': 300, 'height': 220, 'gap': 30};
}
`
然后我希望您能联系我,我可以协助您完善这个组件,因为我也需要使用这个组件,并且希望他可以成熟。
我的打印机型号为:GP-M322
我的QQ:1067252205
还有楼主的群号重新发下吧。。。。。 我也想进群交流讨论

对于判断是否成功连接的代码补充。通过查看源码发现:如果根据PrinterReader中的 readDataImmediately(buffer) 如果返回结果值不为-1似乎就可以判断为已经连接蓝牙打印机设备。
`
class PrinterReader extends Thread {
private boolean isRun = false;

    private byte[] buffer = new byte[100];

    public PrinterReader() {
        isRun = true;
    }

    @Override
    public void run() {
        try {
            while (isRun) {
                //读取打印机返回信息,打印机没有返回纸返回-1
                Log.e(TAG,"wait read ");
                **int len = readDataImmediately(buffer);**
                Log.e(TAG," read "+len);
                if (len > 0) {
                    Message message = Message.obtain();
                    message.what = READ_DATA;
                    Bundle bundle = new Bundle();
                    bundle.putInt(READ_DATA_CNT, len); //数据长度
                    bundle.putByteArray(READ_BUFFER_ARRAY, buffer); //数据
                    message.setData(bundle);
                    mHandler.sendMessage(message);
                }
            }
        } catch (Exception e) {//异常断开
            if (deviceConnFactoryManagers[id] != null) {
                closePort(id);
                mHandler.obtainMessage(Constant.abnormal_Disconnection).sendToTarget();
            }
        }
    }

    public void cancel() {
        isRun = false;
    }
}

`

非常感谢,你可以推送下你的修改,我合并进去