Android USB OTG设备在拔下和重新拔下后不工作
我正在尝试与Android上的USB OTG设备接口。由于代码有点长,我将仅概述基本内容:Android USB OTG设备在拔下和重新拔下后不工作,android,hid,usb-otg,Android,Hid,Usb Otg,我正在尝试与Android上的USB OTG设备接口。由于代码有点长,我将仅概述基本内容: 清单中声明了一个活动,该活动附带了一个针对USB\u设备\u的意向筛选器(针对我感兴趣的设备ID进行了筛选) 当以该特定目的启动活动时,它将启动服务并将USB设备作为参数传递 当服务启动时,它为USB\u设备注册一个广播接收器,然后连接到设备并开始与之交互(当前会生成一些日志输出) 当接收到USB断开连接广播且设备是当前正在使用的设备时,USB设备连接会调用close(),服务停止 该设备是一个Si4
- 清单中声明了一个活动,该活动附带了一个针对
USB\u设备\u的意向筛选器(针对我感兴趣的设备ID进行了筛选)
- 当以该特定目的启动活动时,它将启动服务并将USB设备作为参数传递
- 当服务启动时,它为
USB\u设备注册一个广播接收器,然后连接到设备并开始与之交互(当前会生成一些日志输出)
- 当接收到USB断开连接广播且设备是当前正在使用的设备时,USB设备连接会调用
,服务停止close()
- 我不会在连接之间保留任何与设备相关的数据结构。与USB连接相关的所有内容都在类实例中,当检测到设备时会创建这些实例,这些类的所有静态成员都是最终的
- 在重新加载设备后,有些事情可以工作,例如读取设备类型和固件版本的寄存器(通过获取USB HID功能报告来工作)。初始化还设置了一些寄存器(通过发送USB功能报告),这些寄存器不会返回错误,但更改频率(也包括设置寄存器)不起作用
- 拔出和重新拔出之间约15分钟的间隔无效(设备不工作)。另一方面,如果我拔掉设备插头,关闭服务并重新插入,它会立即工作,因此问题肯定出在Android端,而不是设备端
我需要做什么才能使USB设备在一个拔掉/重新拔掉的周期后工作?我仍然不完全理解这里发生了什么,但它现在似乎可以工作了 我应该提到的是,该应用程序是多线程的,并且Si470x包装器类是从多个线程调用的 由于这导致了竞争条件(一个线程在另一个线程刚刚关闭设备时访问该设备),因此我正确地将所有方法声明为
synchronized
,以便没有两个线程可以同时访问tuner类的方法。插上设备,拔下它,再插上它,瞧,它改变了频率,并以它应该的方式吐出RDS数据
怀疑:
UsbDeviceConnection#close()
可能不是线程安全的
结论:
- 使用完设备后(包括分离设备时),始终调用
UsbDeviceConnection#close()
- 如果您的应用程序是多线程的,请确保访问USB连接(直接或间接)的所有内容都已正确同步