本文旨在解决Usb连接过程中的问题而不注重具体实现过程,如果有对Usb连接过程感兴趣的朋友可以查看Android官方文档
目录
现实背景
现在智能硬件发展迅速,各种运动相机、无人机不断发展,而其中大部分都通过Usb跟手机之间建立链路连接通信,所以怎么处理好Usb的连接问题就显得很重要。
存在问题
PS:下文中叙述Android系统指EMUI、MIUI、魅族、Android原生等合集,一般出问题比较多的是华为EMUI。
- 系统不广播Usb连接事件(android.hardware.usb.action.USB_ACCESSORY_ATTACHED)
- 系统有时不广播Usb断开事件(android.hardware.usb.action.USB_ACCESSORY_DETACHED)
- 系统有时会异常缓存UsbAccessory,导致没连接上时App却可以获取到不可用的Accessory
问题原因
问题1:系统不广播Usb连接事件
当Usb设备连接到手机时,Android系统收到了ACTION_USB_DEVICE_ATTACHED广播,然后系统通过Manifests得知App想要在Usb设备连上的时候运行,最终系统会发android.intent.action.MAIN广播打开App。所以系统不会给App发送ACTION_USB_DEVICE_ATTACHED广播,因为系统认为App知道在这种情况该怎么处理。
更详细解析请参考 StackOverflow。
问题2:系统有时不广播Usb断开事件
当Usb设备从设备拔出时,Android系统不广播USB_ACCESSORY_DETACHED,导致App无法做断开连接的逻辑。这个是系统的Bug,在华为EMUI上极容易重现。
问题3:系统有时会异常缓存UsbAccessory,导致没连接上的时候App却可以获取到Accessory
当设备拔出时,Android系统缓存UsbAccessory,导致App认为Usb设备还正在连接,导致逻辑错误。很明显这也是系统的Bug,也是在华为上极容易重现(快速插拔)。
解决方案
问题1:系统不广播Usb连接事件
这个问题解决的关键在于如何得知Usb设备已经连接上,有两种思路,一种比较可靠的是当Usb设备未连接状态通过Handler起一个Timer定时去询问Android系