【问题标题】:Proper way to close a USB accessory connection关闭 USB 附件连接的正确方法
【发布时间】:2011-11-26 01:54:33
【问题描述】:

在 Android 中关闭与UsbAccessory 的连接的正确方法是什么? 似乎即使在股票 Google 示例中,如果我连接和附件,退出应用程序然后返回它,连接不会重新建立。

仔细看,好像是在FileDescriptor上调用了close()之后,就再也打不开了,并且发出了“could not open /dev/usb_accessory”的日志。 不调用close() 是一个不好的选择,因为read() 上的线程阻塞将不会被释放。物理断开/重新连接设备后一切正常。

退出应用程序然后再次打开它的简单用例在参考应用程序中不起作用似乎真的很令人惊讶,如果它不可行,那就更令人惊讶了。

我使用的是运行 Android 2.3.6 的 Nexus S。

【问题讨论】:

  • 我遇到了同样的问题,“无法打开/dev/usb_accessory”消息,但每当我尝试重新连接我的设备时:(顺便说一句,我的应用程序仍然打开。

标签: android usb adk accessory


【解决方案1】:

问题是读取线程永远不会退出,因此文件描述符保持打开状态,并且在应用程序恢复时无法再次打开。

已确认这是一个错误: http://code.google.com/p/android/issues/detail?id=20545

如果你关心这个错误,请投票。

【讨论】:

  • 是的,太好了,我喜欢那些错误 :( 你是如何规避这个问题的?你正在应用任何解决方法吗?
  • 我解决这个问题的方法是从 Android 发送一个“软关闭”命令,这会导致从附件返回一个“软关闭”命令到 Android,这反过来又取消阻止读取()。只有当应用程序正常存在并且协议不会失去同步时,它才会起作用。在实践中,它并不完美,但总比没有好。
  • 谢谢!我认为这也是我将实现它的方式。
  • 那么如何实现“软关闭”?
  • 还更新了 Android 错误 20545:已开发修复程序但尚未合并到 Android 主干中:code.google.com/p/android/issues/detail?id=61390
【解决方案2】:

尝试重新连接两次 它似乎第一次不成功将关闭连接,然后再次尝试打开它会起作用! 对我来说它有效!

【讨论】: