9

最近,我一直在尝试根据我见过的所有示例和示例使用广播接收器接收意图 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 设备会寻找要启动的活动,而分离则广播分离意图。根据上述样本,情况不应该如此。

我是否遗漏了一些关于元数据的激烈内容?我对 android.hardware.usb.action.USB_DEVICE_DETACHED 没有任何问题。也许这是安装在galaxy s3上的android版本的错误?也许这是 ICS 的“功能”。

欢迎任何相关信息!

4

3 回答 3

4

这是一个已知的缺陷:

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

和这里:

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

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

于 2012-08-12T00:29:08.313 回答
1

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

编辑:我发现放入android:launchMode="singleTask"清单似乎“注册”了 的意图USB_ACCESSORY_ATTACHED,尽管它从来没有这样显示它确实像它正在做的那样工作。

于 2013-02-19T20:31:20.770 回答
1

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

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

当您的活动正在运行并附加您的 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 设备上测试:Samsung Galaxy tab 750

于 2015-03-16T10:00:45.707 回答