Android UsbAccessory中你需要小心的坑及解决方案

本文旨在解决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系

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值