Android 在USB集线器下,USB_设备_分离广播事件不会在所有分离设备上触发

Android 在USB集线器下,USB_设备_分离广播事件不会在所有分离设备上触发,android,usb,Android,Usb,我写了一个应用程序,它使用三个硬件USB设备。 当我使用任何单个设备操作时,两个事件(USB_设备连接/USB_设备分离)都会正常触发。无论我如何约束接收者-在代码或清单中手动注册。不管这个设备是如何连接的——在集线器下还是直接连接到设备上。 问题是:当我一次连接三个设备时(通过连接已填充的集线器),会为所有三个设备触发USB_device_ATTACHED事件-我通过onNewIntent回调(或通过清单绑定的独立接收器)接收通知,并执行权限批准行程。 但在物理移除集线器后的所有设备(通过分离

我写了一个应用程序,它使用三个硬件USB设备。 当我使用任何单个设备操作时,两个事件(USB_设备连接/USB_设备分离)都会正常触发。无论我如何约束接收者-在代码或清单中手动注册。不管这个设备是如何连接的——在集线器下还是直接连接到设备上。 问题是:当我一次连接三个设备时(通过连接已填充的集线器),会为所有三个设备触发USB_device_ATTACHED事件-我通过onNewIntent回调(或通过清单绑定的独立接收器)接收通知,并执行权限批准行程。 但在物理移除集线器后的所有设备(通过分离集线器本身)时,分离事件不会在所有设备上触发。它可以在随机的单个设备上触发,也可以在随机的两个设备上触发。但这三种设备上都没有

因此,UsbManager暂时持有大量未物理连接设备的死开发句柄。同时,当我在Connection/disconnection time中查看/dev/usb/文件夹时,设备文件会正确显示和删除。下一个结果是,当应用程序由于某种原因重新启动时,我无法识别哪个设备已死亡,哪个设备实际存在

该设备是华硕P1801平板电脑,操作系统4.2.1 正如我所见,这是华硕的最后一个固件(JOP40D.US_epad-10.6.1.22.5-20130715)

出于缓存目的,将包装设备的句柄I固定到应用程序单例上(当设备出现USB_device_附加事件或应用程序初始化时):

单身人士:

private static FirstDevice firstDevice;
private static SecondDevice secondDevice;
private static ThirdDevice thirdDevice;

public void refreshDevice(UsbDevice device) {
    HWDevice dev = HWDevicesFactory.newInstance(device);
    if (dev instanceof FirstDevice) {
        firstDevice = (FirstDevice) dev;
    } else if (dev instanceof SecondDevice) {
        secondDevice = (SecondDevice) dev;
    } else if (dev instanceof ThirdDevice) {
        thirdDevice = (ThirdDevice) dev;
    }
}
每个设备包装的工厂重新安装:

public static HWDevice newInstance(final UsbDevice device) {
    int vendorId = device.getVendorId();
    int productId = device.getProductId();
    if ((vendorId == FIRST_VENDOR_ID) && (productId == FIRST_PRODUCT_ID)) {
        return new FirstDevice(device);
        ...
设备包装更具体,因为每一个都非常不同。但通常它包含UsbInterface、UsbDeviceConnection、UsbEndpoints以及UsbDevice本身的缓存句柄

最重要的是,不要在随机设备上触发分离。不管它是如何被我“包裹”的

华硕的固件可能有缺陷

-或

我错过了设备连接的一些必要步骤/检查

-或-

刚刚遇到了你的问题,我看到了一点类似的东西。我有一个使用单一USB设备的应用程序。当它断开连接时,在某些情况下,
USB\u设备\u分离
会触发,而在其他情况下不会触发。我怀疑广播并不总是可靠地发送。OnePlusOne在这里运行的是天堂操作系统15.1。我认为Android的USB子系统完全不稳定/不可用。出于生产目的,NDK包装用于外部设备通信似乎是一种可行的方法。我刚刚遇到了你的问题,我看到了一些类似的东西。我有一个使用单一USB设备的应用程序。当它断开连接时,在某些情况下,
USB\u设备\u分离
会触发,而在其他情况下不会触发。我怀疑广播并不总是可靠地发送。OnePlusOne在这里运行的是天堂操作系统15.1。我认为Android的USB子系统完全不稳定/不可用。出于生产目的,NDK包装用于外部设备通信似乎是一种可行的方法。
public static HWDevice newInstance(final UsbDevice device) {
    int vendorId = device.getVendorId();
    int productId = device.getProductId();
    if ((vendorId == FIRST_VENDOR_ID) && (productId == FIRST_PRODUCT_ID)) {
        return new FirstDevice(device);
        ...