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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:32:20