我正在尝试与Android上的USB OTG设备连接。由于代码有点冗长,我将概述基础知识:
USB_DEVICE_ATTACHED
(我感兴趣的设备ID已过滤)的Intent过滤器活动。USB_DEVICE_DETACHED
注册广播接收器,然后连接到设备并开始与它进行交互(当前会生成一些日志输出)。close()
,服务停止。该设备是Si4701 USB FM调谐器,可作为USB HID设备使用。
当我第一次插入设备时,我看到我的服务连接到它,可以更改频道并接收RDS数据。
然而,当我拔下它并将其重新插入时,我看到服务再次连接到它(并且显然已成功读取设备寄存器),但它无法改变频率,我从未看到任何RDS数据。
如果我强制应用程序在拔出设备和重新插入设备之间停止,则设备会在插入电源后正常工作。
这表明某些清理无法进行,或者某些资源未正确释放。但是:
拔出/重新插拔后,我需要做些什么才能使USB设备正常工作?
答案 0 :(得分:0)
我仍然不完全了解这里发生了什么,但它现在似乎有效。
我应该提到应用程序是多线程的,并且从多个线程调用Si470x包装器类。
由于这导致竞争条件(一个线程在另一个线程刚关闭时访问设备),我正确地将所有方法声明为synchronized
,这样就没有两个线程可以访问调谐器类的方法了。同时。将设备插入电源插头,拔下电源插头,插入电源插头,然后观察它会改变频率并按照预期的方式喷出RDS数据。
<强>怀疑:强>
UsbDeviceConnection#close()
可能不是线程安全的。
<强>结论:强>
UsbDeviceConnection#close()
(包括拆卸设备时)。