在USB-hub下,USB_DEVICE_DETACHED广播事件不会在所有分离设备

时间:2015-11-18 14:05:26

标签: android usb

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

结果,UsbManager拥有许多没有物理连接设备的死亡处理器。同时,当我在连接/断开连接时查看/ dev / usb /文件夹时,设备文件会出现并正确删除。接下来的结果是,当由于某种原因重新启动app时,我无法识别哪个设备已经死亡以及哪个设备实际存在。

该设备是华硕P1801平板电脑,OS 4.2.1 我可以看到,它是华硕的最后一个固件(JOP40D.US_epad-10.6.1.22.5-20130715)

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

public class HWMountReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Application.getAppContext().isAppReady() && (Application.getAppContext() != null) && (Application.getAppContext().getUsbHWManager() != null)) {
            UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
            Application.getAppContext().getUsbHWManager().refreshDevice(device);
            PendingIntent mPermissionIntent = PendingIntent.getBroadcast(Application.getAppContext(), 0, new Intent(Application.MED_ONLINE_DEVICE_PERMISSION), 0);
            ((UsbManager) Application.getAppContext().getSystemService(Context.USB_SERVICE)).requestPermission(device, mPermissionIntent);
        }
    }
}

单身人士:

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);
        ...

Device-Wrapper更具体,因为每一个都非常不同。但通常它包含UsbInterface,UsbDeviceConnection,UsbEndpoints以及最终UsbDevice本身的缓存句柄。

主要的事情 - DETACH没有在随机设备上触发。不管怎么被我的“包裹”

ASUS固件中是否存在可能的错误,

- 或 -

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

- 或 - ?

0 个答案:

没有答案