使用C#通过USB连接安卓手机时触发ArgumentException异常
问题分析与解决方案
可能的原因及对应修复方式
1. UWP应用未正确声明USB设备权限
UWP应用必须在Package.appxmanifest中声明要访问的USB设备,否则即使能获取到UsbDevice实例,发送控制请求时也会触发参数异常。
需要添加如下声明(替换为你的设备VID/PID):
<Capabilities> <DeviceCapability Name="usb"> <Device Id="vid:1004 pid:633E"> <Function Type="classId:ff subclass:42 protocol:01"/> <!-- ADB接口的类/子类/协议 --> <Function Type="vendorSpecific"/> </Device> </DeviceCapability> </Capabilities>
注:ADB接口的USB类通常是0xFF(Vendor Specific),子类0x42,协议0x01,需要和设备管理器中显示的接口信息一致。
2. 错误使用UsbDevice直接发送控制请求
UWP中,控制请求应该发送到具体的USB接口,而非直接使用UsbDevice实例。ADB设备包含多个接口,你需要先筛选出支持Vendor控制请求的接口:
修改代码,获取目标接口后再发送请求:
if (usbDevice != null) { // 筛选ADB对应的接口(类0xFF,子类0x42,协议0x01) UsbInterface targetInterface = usbDevice.Interfaces.FirstOrDefault( i => i.ClassCode == 0xFF && i.SubclassCode == 0x42 && i.ProtocolCode == 0x01); if (targetInterface == null) { // 未找到目标接口,处理错误 return; } byte[] bytes = new byte[2]; IBuffer buf = bytes.AsBuffer(); UsbSetupPacket initSetupPacket = new UsbSetupPacket() { RequestType = new UsbControlRequestType() { Direction = UsbTransferDirection.In, Recipient = UsbControlRecipient.Device, ControlTransferType = UsbControlTransferType.Vendor, }, Request = 51, Value = 0, Index = 0, Length = 2 }; // 使用目标接口发送控制请求 IBuffer result = await targetInterface.SendControlInTransferAsync(initSetupPacket, buf); }
3. WinUSB驱动绑定问题
确保WinUSB驱动是绑定到ADB接口而非设备的其他接口。可以通过设备管理器查看:
- 展开“Android Phone” -> “Android Composite ADB Interface”
- 右键属性 -> 详细信息 -> 硬件ID,确认是否包含
USB\VID_1004&PID_633E&MI_xx(MI是接口编号) - 确认驱动是WinUSB.sys,而非其他ADB驱动
4. SetupPacket参数验证
虽然你的参数符合AOA规范,但需确认:
RequestType的位编码正确:UWP的UsbControlRequestType会自动处理位编码,但需确保Direction设置为In(对应AOA协议中主机读取版本号的请求)Length设置为2,对应AOA协议返回的16位版本号,缓冲区大小需完全匹配
额外排查步骤
- 启用UWP的USB调试:在Visual Studio中,进入“调试” -> “选项” -> “调试” -> “USB调试”,启用日志,查看更详细的错误信息
- 使用USBView工具查看设备的接口描述符,确认目标接口的端点和支持的控制请求类型
内容的提问来源于stack exchange,提问作者e.g.
相关产品推荐
相关产品推荐

