USB_DEVICE_ATTACHED仅启动Galaxy S3 ICS的活动

时间:2012-06-28 10:31:58

标签: android usb

最近我一直在尝试按照我见过的所有示例和示例,使用广播接收器接收意图android.hardware.usb.action.USB_DEVICE_ATTACHED。

我在清单中宣布了一个接收者;

<receiver android:name=".UsbDeviceReceiver">
        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
    <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
                android:resource="@xml/device_filter"/>

我在活动代码中也做了类似的事情 - onStart和OnStop注册/取消注册接收器。

    IntentFilter filter = new IntentFilter();
    filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);

    registerReceiver(mUsbReceiver, filter);

但是,我发现意图刚刚被抓住了。观察logcat我可以看到附加一个usb设备寻找要启动的活动,而分离广播的是detatch intent。根据上述样本,情况并非如此。

我是否遗漏了有关元数据的大事?我对android.hardware.usb.action.USB_DEVICE_DETACHED没有任何问题。也许这是安装在galaxy s3上的android版本的bug?也许这是ICS的“功能”。

欢迎任何相关信息!

3 个答案:

答案 0 :(得分:4)

这是一个已知的缺陷:

http://code.google.com/p/android/issues/detail?id=25701

在这里:

http://code.google.com/p/android/issues/detail?id=25703

但是不要屏住呼吸等待它被修复。当您查看错误报告时,请将其加注,以便您收到有关报告更新的通知。可能会有其他人要求修复它的评论。

答案 1 :(得分:1)

我为USB_ACCESSORY_ATTACHED找到的解决方法是只有一个按钮再次调用我的OpenAccessory(accessory)方法,这似乎对我有用。也许这对USB_DEVICE_ATTACHED也适用。只是某个设备连接/未连接状态,如果没有连接,用户只需按下该按钮即可。

编辑:我发现在清单中放置android:launchMode="singleTask"似乎“注册”USB_ACCESSORY_ATTACHED的意图,虽然它从未显示出来,但它确实像它正在做的那样工作。

答案 2 :(得分:1)

您可以在清单中声明意图过滤器,如下所述:http://developer.android.com/guide/topics/connectivity/usb/host.html

然后你在onResume()中捕获android.hardware.usb.action.USB_DEVICE_ATTACHED 或者在onNewIntent()。

当你的活动正在运行并附加你的usb设备时,主要意图被抛到onResume()但是android.hardware.usb.action.USB_DEVICE_ATTACHED到onNewIntent()。根据这个调整你的代码。

你可以按如下方式声明onNewIntent():

@Override
    protected void onNewIntent(Intent intent) 
    {
        super.onNewIntent(intent);
        System.out.println("onNewIntent" + intent.getAction());
        if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())) {
        mDevice = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        if(mDevice!= null)
            mUsbManager.requestPermission(mDevice, mPermissionIntent);
        }
    }

和onResume()同样。

在android 4.0.4上测试 设备:三星Galaxy tab 750