我在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
答案 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>