USB OTG 设备在拔出并重新插入后不工作

USB OTG device does not work after unplugging and replugging

我正在尝试连接 Android 上的 USB OTG 设备。由于代码有点长,我就简单概括一下:

该设备是一个 Si4701 USB FM 调谐器,显示为 USB HID 设备。

当我第一次插入设备时,我看到我的服务连接到它,可以更改频道并接收 RDS 数据。

然而,当我拔下它并重新插入时,我看到服务再次连接到它(显然再次成功读取设备寄存器),但它无法更改频率并且我从未看到任何 RDS 数据。

如果我强制应用程序在拔出和重新插入设备之间停止,设备在重新插入后可以正常工作。

这表明某些清理工作未能进行,或者某些资源未正确释放。然而:

我需要做什么才能使 USB 设备在 unplug/replug 周期后正常工作?

我仍然不完全明白这里发生了什么,但现在似乎可以工作了。

我应该提到该应用程序是多线程的,Si470x 包装器 class 从多个线程调用。

由于这导致了竞争条件(一个线程在另一个线程刚刚关闭设备时访问该设备),我正确地将所有方法声明为 synchronized 以便没有两个线程可以访问调谐器的方法 class同时。插入设备,拔掉它,再重新插入——你瞧,它改变了频率并按照预期的方式吐出 RDS 数据。

怀疑:

UsbDeviceConnection#close() 可能不是线程安全的。

结论:

  • 总是在使用完设备后调用 UsbDeviceConnection#close()(包括分离设备时)。
  • 如果您的应用程序是多线程的,请确保访问您的 USB 连接(直接或间接)的所有内容都已正确同步。