Android端用Brother Barcode SDK通过USB连接QL-800打印失败
Android USB连接Brother QL-800打印机提示“cannot open usb”问题解决
问题分析
出现“cannot open usb”通常是USB权限未正确获取、设备参数配置错误或设备未被系统识别导致,结合你的代码,以下是针对性修复方案:
修复步骤
1. 补充USB权限配置与动态申请
Android 6.0+必须动态申请USB设备访问权限,同时需要在Manifest中声明设备过滤:
步骤1.1 修改AndroidManifest.xml
添加USB主机权限和设备过滤配置:
<uses-feature android:name="android.hardware.usb.host" /> <uses-permission android:name="android.permission.USB_PERMISSION" /> <activity ...> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/usb_device_filter" /> </activity>
步骤1.2 创建USB设备过滤文件
在res/xml目录下新建usb_device_filter.xml,添加Brother QL-800的厂商ID(Vendor ID:0x04f9,十进制1273)和产品ID(Product ID,QL-800的PID通常为0x209b,十进制8347):
<?xml version="1.0" encoding="utf-8"?> <resources> <usb-device vendor-id="1273" product-id="8347" /> </resources>
步骤1.3 动态请求权限
在printData方法执行前,先检查并请求USB权限:
// 获取USB管理器 UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); // 遍历已连接设备找到QL-800 UsbDevice targetDevice = null; for (UsbDevice device : usbManager.getDeviceList().values()) { if (device.getVendorId() == 1273 && device.getProductId() == 8347) { targetDevice = device; break; } } if (targetDevice == null) { Toast.makeText(this, "未检测到QL-800打印机", Toast.LENGTH_SHORT).show(); return; } // 检查权限 if (!usbManager.hasPermission(targetDevice)) { PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent("USB_PERMISSION_REQUEST"), PendingIntent.FLAG_IMMUTABLE); usbManager.requestPermission(targetDevice, permissionIntent); // 需注册广播接收器接收权限结果,权限通过后再调用printData return; }
2. 修正标签型号配置
代码中错误使用了QL1100的标签型号,需替换为QL-800对应的型号:
// 原代码:settings.labelNameIndex = LabelInfo.QL1100.W103H164.ordinal(); // 修改为: settings.labelNameIndex = LabelInfo.QL800.W103H164.ordinal();
3. 完善线程内异常捕获
当前线程内的异常无法被外层catch捕获,需在run方法内添加异常处理:
new Thread(new Runnable() { @Override public void run() { try { if (printer.startCommunication()) { runOnUiThread(() -> Toast.makeText(getApplicationContext(),"start comm", Toast.LENGTH_SHORT).show()); PrinterStatus result = printer.printImage(bitmap); if (result.errorCode != PrinterInfo.ErrorCode.ERROR_NONE) { runOnUiThread(() -> Toast.makeText(getApplicationContext(),"fail comm"+result.errorCode, Toast.LENGTH_SHORT).show()); } printer.endCommunication(); } else { runOnUiThread(() -> Toast.makeText(getApplicationContext(),"无法打开USB连接", Toast.LENGTH_SHORT).show()); } } catch (Exception e) { runOnUiThread(() -> Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_SHORT).show()); } } }).start();
4. 系统层面检查
- 确认手机已正确识别打印机:进入系统设置-USB设备,查看是否存在Brother QL-800
- 关闭其他可能占用USB设备的应用,避免设备被抢占
内容的提问来源于stack exchange,提问作者XTOO
相关产品推荐
相关产品推荐

