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

Android设备以USB Accessory模式连接PC的设备发现问题求助

问题分析与解决方案

模式选择:必须用USB Accessory模式

你的场景是PC作为USB主机,Android作为配件设备接收数据,所以正确的模式就是USB Accessory模式——该模式下Android是从设备,由PC端主动发起通信和设备枚举。

为什么accessoryList为空?

核心原因是:Windows不会自动以USB Accessory模式与Android通信,必须有Windows端应用/驱动模拟符合Google规范的USB Accessory设备逻辑,否则Android无法识别到Accessory设备,自然accessoryList返回null。

除此之外,还要排查以下几点:

  1. 手动切换Android的USB模式:部分设备连接PC后需要手动选择"USB配件"模式(而非MTP、充电等),否则Android不会进入Accessory识别状态。
  2. 验证accessory_filter.xml配置:xml中的参数必须和Windows端模拟的Accessory信息完全匹配,示例配置如下:
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <usb-accessory
            manufacturer="CustomPCManufacturer"
            model="PCAccessoryDemo"
            version="1.0"/>
    </resources>
    
  3. 设备兼容性:确保你的Android设备系统版本在3.1以上(Accessory模式的最低要求),且未被定制ROM限制该功能。

设备发现的必要条件

是的,必须要有Windows端应用来实现USB Accessory的模拟逻辑,核心步骤包括:

  1. Windows端通过USB API(比如libusb、Windows USB驱动框架)识别连接的Android设备,获取设备句柄;
  2. 向Android发送符合Google规范的Accessory标识信息:依次发送厂商名、产品名、版本号、序列号、URL这5个字符串;
  3. 发送模式切换命令,触发Android重启USB连接并进入Accessory模式;
  4. 此时Android端的usbManager.accessoryList就能获取到对应的Accessory设备,后续可建立数据传输通道。

补充排查代码

在Android端可主动请求USB权限,避免权限问题导致设备无法被获取:

val usbManager = context.getSystemService(USB_SERVICE) as UsbManager
val accessory = usbManager.accessoryList?.firstOrNull()
accessory?.let {
    val permissionIntent = PendingIntent.getBroadcast(context, 0, Intent("com.example.USB_PERMISSION"), 0)
    usbManager.requestPermission(it, permissionIntent)
}

也可通过adb命令查看USB状态,确认设备是否被识别:

adb dumpsys usb

内容的提问来源于stack exchange,提问作者hu yuanyao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:55:09