当前位置: 首页 > news >正文

android实现USB通讯

在 Android 上枚举 USB 设备除了使用 UsbManager.getDeviceList() 方法外,还有以下几种常见的方式:

1. 使用 USB 设备过滤器(XML 配置)

通过在 AndroidManifest.xml 中配置 USB 设备过滤器,可以让系统自动检测并通知应用匹配的 USB 设备。

步骤:

  1. 创建 USB 设备过滤器 XML 文件(例如 res/xml/usb_device_filter.xml):
  1. <?xml version="1.0" encoding="utf-8"?>
    <resources><usb-device vendor-id="1234" product-id="5678" /> <!-- 指定具体 VID/PID --><!-- 或使用通配符匹配所有设备 --><!-- <usb-device /> -->
    </resources>
    
  2. 在 AndroidManifest.xml 中声明过滤器
  1. <activity android:name=".UsbDeviceActivity"><intent-filter><action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /></intent-filter><meta-dataandroid:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"android:resource="@xml/usb_device_filter" />
    </activity>
    
  2. 在 Activity 中处理 USB 设备连接
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = getIntent();String action = intent.getAction();if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (device != null) {// 处理连接的 USB 设备}}
}

2. 使用广播接收器监听 USB 设备插拔事件

通过注册广播接收器,可以实时监听 USB 设备的插入和拔出事件。

示例代码:

// 注册广播接收器
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (device != null) {// 处理新连接的 USB 设备}} else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (device != null) {// 处理断开连接的 USB 设备}}}
};// 注册广播接收器
IntentFilter filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
registerReceiver(usbReceiver, filter);// 记得在 Activity 销毁时取消注册
@Override
protected void onDestroy() {super.onDestroy();unregisterReceiver(usbReceiver);
}

3. 使用 Android USB Host API(API 级别 12+)

通过 USB Host API,可以主动枚举和管理连接的 USB 设备。

示例代码:

UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();// 遍历设备列表
for (UsbDevice device : deviceList.values()) {Log.d(TAG, "Device: " + device.getProductId() + ", VID: " + device.getVendorId());// 请求设备权限PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_IMMUTABLE);usbManager.requestPermission(device, permissionIntent);
}

4. 使用 USB 设备类过滤

可以根据设备类(如 HID、CDC、MIDI 等)来过滤和枚举特定类型的 USB 设备。

示例代码:

for (UsbDevice device : deviceList.values()) {// 获取设备类int deviceClass = device.getDeviceClass();// 根据设备类过滤(例如,查找 HID 设备)if (deviceClass == UsbConstants.USB_CLASS_HID) {// 处理 HID 设备}
}

5. 使用 USB 设备接口过滤

通过检查设备的接口(Interface)和端点(Endpoint),可以进一步筛选出符合条件的 USB 设备。

示例代码:

for (UsbDevice device : deviceList.values()) {// 遍历设备的所有接口for (int i = 0; i < device.getInterfaceCount(); i++) {UsbInterface usbInterface = device.getInterface(i);// 根据接口类过滤(例如,查找串口设备)if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_CDC_DATA) {// 处理 CDC 数据接口}}
}

6. 使用 USB 设备权限管理

在访问 USB 设备前,需要获取用户权限:

private static final String ACTION_USB_PERMISSION = "com.example.USB_PERMISSION";// 请求权限
PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_IMMUTABLE);
usbManager.requestPermission(device, permissionIntent);// 处理权限回调
private final BroadcastReceiver permissionReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (ACTION_USB_PERMISSION.equals(action)) {synchronized (this) {UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {if (device != null) {// 权限已授予,可以访问设备}} else {Log.e(TAG, "USB 权限被拒绝");}}}}
};

总结

以上方法各有适用场景:

  • XML 过滤器:适合静态匹配特定 VID/PID 的设备。
  • 广播接收器:适合实时监听设备插拔事件。
  • USB Host API:适合主动枚举和管理设备。
  • 设备类 / 接口过滤:适合筛选特定类型的 USB 设备。

实际开发中,通常需要结合多种方法来实现完整的 USB 设备管理功能。

相关文章:

  • Go语言中的函数类型参数:深入理解`func()`
  • CPU、GPU、内存、服务负载、数据库资源暂占用、数据库连接的概念关系详解
  • 纯css实现蜂窝效果
  • Java 性能调优全解析:从设计模式到 JVM 的 7 大核心方向实践
  • 力扣-102.二叉树的层序遍历
  • 5.14 note
  • Android 适配之——targetSdkVersion 30升级到31-34需要注意些什么?
  • 探索自我重复的奇妙之旅--递归
  • 构建你的第一个 MCP 服务
  • 2025年PMP 学习十三 第9章 项目资源管理(9.1,9.2)
  • 【工奥阀门科技有限公司】签约智橙PLM
  • deepseek梳理java高级开发工程师微服务面试题-进阶版
  • Linux grep -r 查找依赖包是否存在依赖类 Class
  • 【进程控制二】进程替换和bash解释器
  • Oracle where条件执行先后顺序
  • Seata源码—1.Seata分布式事务的模式简介
  • 数字信号处理-大实验1.1
  • 《Python星球日记》 第68天:BERT 与预训练模型
  • 视频图像压缩领域中 DCT 的 DC 系数和 AC 系数详解
  • C++取时间戳窗口
  • 李家超:明日起香港特区护照持有人可免签入境阿联酋
  • “中国神湖”加快放大资源规模!3亿美元换海外年产380万吨钾盐项目
  • 四部门:强化汛期农业防灾减灾,奋力夺取粮食和农业丰收
  • 横跨万里穿越百年,《受到召唤·敦煌》中张艺兴一人分饰两角
  • 多家外资看好中国市场!野村建议“战术超配”,花旗上调恒指目标价
  • 视觉周刊|纪念苏联伟大卫国战争胜利80周年