我在这个意图注册中缺少什么?

时间:2012-12-06 07:21:59

标签: android usb

我在ICS,我正试图安装一个接收器,当USB设备和/或附件插入/拔出平板电脑时将被调用。

基于文档和其他Stack问题,它看起来像我应该需要的是下面的代码,但是当我运行此代码时没有任何事情发生...很难说,因为我的设备已插入USB配件进/出它,所以我的调试只是我写东西到文件,而不是实际的调试,但它似乎没有做任何事情。

  IntentFilter attachFilter = new IntentFilter();
  attachFilter.addAction(ACTION_USB_PERMISSION);
  attachFilter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);     
  registerReceiver(mAttachReceiver, attachFilter);

  IntentFilter detachFilter = new IntentFilter();
  detachFilter.addAction(ACTION_USB_PERMISSION);
  detachFilter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
  registerReceiver(mDetachedReceiver, detachFilter);

接收器看起来像这样(我为了简洁而将它们剪下来,但它们是有效的接收器)......

private final BroadcastReceiver mAttachReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        logMsg("ACTION = " + action);
        ... }

}

我的清单包含此条目:

<uses-feature android:name="android.hardware.usb.host" />

有什么我想念的吗?我已经尝试了ACTION_USB_DEVICE_ATTACHED而不是ACCESSORY,但这似乎没有产生任何不同的结果。此外,我可以在应用程序中连接后与设备通信,因此,它被识别,后续代码发送/接收来自连接设备(它是NFC读卡器)的消息按预期工作。唯一持续失败的是通知初始电缆连接。

TIA

1 个答案:

答案 0 :(得分:8)

ACTION_USB_DEVICE_ATTACHED只能是Activity的intent过滤器而不是BroadCastReciever。

UsbManager只解析活动(既不是服务也不是BroadcastReciever)并启动它们。

所以你没有收到任何广播。

修改 Android开发者网站确实说它是一个广播,但Android Source只是解析活动。 虽然您可以使用ACTION_USB_ACCESSORY_DETACHED在接收方中分离更新

<强> EDIT2 : 就Receiver而言,您的代码没有任何问题。由于广播USB_ACCESSORY_ATTACHED的方式,您的代码无法正常工作。 USB_ACCESSORY_ATTACHED不是真正意义上的广播,Android Frameworks仅启动活动意图,因此您没有在广播接收器中接收到意图。

您只能对ATTACHED Intent使用Activity而不能使用接收器

<activity android:name=".YourActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
    </intent-filter>

    <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
               android:resource="@xml/accessory_filter" />
</activity>