Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android USB OTG设备在拔下和重新拔下后不工作_Android_Hid_Usb Otg - Fatal编程技术网

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

我正在尝试与Android上的USB OTG设备接口。由于代码有点长,我将仅概述基本内容:

  • 清单中声明了一个活动,该活动附带了一个针对
    USB\u设备\u的意向筛选器(针对我感兴趣的设备ID进行了筛选)
  • 当以该特定目的启动活动时,它将启动服务并将USB设备作为参数传递
  • 当服务启动时,它为
    USB\u设备注册一个广播接收器,然后连接到设备并开始与之交互(当前会生成一些日志输出)
  • 当接收到USB断开连接广播且设备是当前正在使用的设备时,USB设备连接会调用
    close()
    ,服务停止
该设备是一个Si4701 USB FM调谐器,它本身就是一个USB HID设备

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

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

如果我强制应用程序在拔掉和重新拔掉设备之间停止,设备在重新插上电源后会正常工作

这表明某些清理失败,或者某些资源没有被正确释放。然而:

  • 我不会在连接之间保留任何与设备相关的数据结构。与USB连接相关的所有内容都在类实例中,当检测到设备时会创建这些实例,这些类的所有静态成员都是最终的
  • 在重新加载设备后,有些事情可以工作,例如读取设备类型和固件版本的寄存器(通过获取USB HID功能报告来工作)。初始化还设置了一些寄存器(通过发送USB功能报告),这些寄存器不会返回错误,但更改频率(也包括设置寄存器)不起作用
  • 拔出和重新拔出之间约15分钟的间隔无效(设备不工作)。另一方面,如果我拔掉设备插头,关闭服务并重新插入,它会立即工作,因此问题肯定出在Android端,而不是设备端

我需要做什么才能使USB设备在一个拔掉/重新拔掉的周期后工作?

我仍然不完全理解这里发生了什么,但它现在似乎可以工作了

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

由于这导致了竞争条件(一个线程在另一个线程刚刚关闭设备时访问该设备),因此我正确地将所有方法声明为
synchronized
,以便没有两个线程可以同时访问tuner类的方法。插上设备,拔下它,再插上它,瞧,它改变了频率,并以它应该的方式吐出RDS数据

怀疑:

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

结论:

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