基于Xamarin的Android USB PC键盘模拟应用开发求助
Xamarin Android 模拟USB PC键盘实现思路
一、让电脑识别为USB HID键盘
- 修改
AndroidManifest.xml,配置HID相关权限与过滤规则- 添加USB权限声明:
<uses-permission android:name="android.permission.USB_PERMISSION" /> - 在
<application>节点内添加元数据,关联USB设备过滤文件:<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/usb_device_filter" /> - 新建
res/xml/usb_device_filter.xml文件,定义HID键盘的匹配规则(可根据需求调整vendor-id和product-id,留空则匹配所有HID设备):<?xml version="1.0" encoding="utf-8"?> <resources> <usb-device /> </resources>
- 添加USB权限声明:
- 调整Android设备的USB模式:进入开发者选项-USB配置,选择键盘/输入设备模式(不同品牌路径可能略有不同)
二、实现按键编码发送逻辑
- 用
UsbManager管理USB连接- 获取
UsbManager实例:var usbManager = (UsbManager)GetSystemService(Context.UsbService); - 枚举已连接的USB设备,筛选出符合HID键盘类的设备(接口类为
UsbConstants.USB_CLASS_HID,子类UsbConstants.USB_SUBCLASS_BOOT,协议UsbConstants.USB_PROTOCOL_KEYBOARD) - 请求USB设备权限:创建
PendingIntent,调用usbManager.RequestPermission(targetDevice, permissionIntent);,通过广播接收器接收权限回调
- 获取
- 构造并发送HID键盘报告
- 标准HID键盘报告为8字节:第1字节是修饰键位掩码(如Shift=0x02、Ctrl=0x01),第2字节保留,第3-8字节为按键编码(最多支持6个同时按键)
- 示例:发送字母'A'的报告(无修饰键)
byte[] pressReport = new byte[8]; pressReport[2] = 0x04; // A对应的HID按键码 - 通过
UsbDeviceConnection.BulkTransfer发送报告,指定输出端点(需从设备接口中获取正确的输出端点) - 按键发送后必须发送空报告,模拟按键抬起,避免持续输入:
byte[] releaseReport = new byte[8]; usbConnection.BulkTransfer(outEndpoint, releaseReport, releaseReport.Length, 1000);
三、调试与注意事项
- 确认设备支持USB OTG功能,连接PC时可能需要OTG转接线(部分PC的USB口可直接识别)
- 用Logcat查看USB设备枚举、权限请求、传输错误等日志,快速定位问题
- Windows系统通常会自动安装HID驱动,macOS和Linux一般无需额外驱动,若识别异常可检查系统设备管理器
- 所有USB传输操作要放在异步线程中执行,避免主线程阻塞导致ANR
内容的提问来源于stack exchange,提问作者morbak
相关产品推荐
相关产品推荐

