正确的关闭USB附件连接方法

22

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

仔细观察后,似乎在调用close()关闭FileDescriptor后,它就无法再次打开,并且系统会输出“could not open /dev/usb_accessory”的日志。不调用close()是个不好的选择,因为阻塞在read()上的线程将不会被释放。当物理断开/重新连接设备时一切正常。

令人惊讶的是,在参考应用程序中,简单的退出应用程序然后重新打开它似乎并不起作用,更令人惊讶的是如果这是不可行的。

我正在使用运行原始Android 2.3.6的Nexus S。


我遇到了完全相同的问题,即“无法打开/dev/usb_accessory”消息,但每当我尝试重新连接我的设备时:( 顺便说一下,我的应用程序仍然在运行。 - Paulina D.
2个回答

15

2
我解决这个问题的方法是从 Android 发送一个“软关闭”命令,这会导致附件发送一个“软关闭”命令回到 Android,进而解除 read() 的阻塞。这种方法只有在应用程序正常退出且协议不失步的情况下才能起作用。实践中并不完美,但总比什么都没有要好。 - Ytai
2
那么如何实现“软关闭”呢? - Luis
@Leco 我认为他是在要求附件端关闭连接。这很有道理,我也会尝试一下。顺便说一句,我可能还会请求一个libusb_reset_device,这肯定会强制进行循环。 - svachalek
可能可以通过使用libusb而不是UsbManager来解决这个问题,尽管我自己没有尝试过:https://dev59.com/pGQo5IYBdhLWcg3wiv_A#16234205。它支持异步模式,因此可以避免对本地代码的阻塞调用,我的看法是。 - Mixaz
1
另外关于Android bug 20545的更新:已经开发了一个修复程序,但尚未合并到Android主干中:https://code.google.com/p/android/issues/detail?id=61390。 - Mixaz
显示剩余2条评论

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接