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

基于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>
      
  • 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 06:22:25