我使用usb api撞墙了。我试图使用广播接收器来接收意图ACTION_USB_DEVICE_ATTACHED,但它不会。
为了澄清我通过清单工作得很好,但创建了一个新活动(并添加到后台)。我发现这是不受欢迎的,特别是鉴于我的应用程序(终端)的性质。
我的猜测是设备过滤器xml元数据需要添加到intent过滤器,但我不知道如何。
欢迎任何反馈!
编辑 - 一些代码。 这是清单中多汁的部分。请注意,意图过滤器已被注释掉,以便动态注册的BroadcastReceiver获取意图(我假设您必须这样做)。
//<intent-filter>
// <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
// <category android:name="android.intent.category.DEFAULT" />
//</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter"/>
以下是连接我的接收器的代码
//register for attachment
IntentFilter attachedFilter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
registerReceiver(mUsbAttachedReceiver, attachedFilter);
这是BroadcastReceiver声明
private final BroadcastReceiver mUsbAttachedReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
//BREAKPOINT HERE IS NEVER HIT
String action = intent.getAction();
showDebugToast(action);
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
synchronized(this)
{
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (device != null){
getDevicePermission(device);
}
}
}
}
};
我避免在清单中声明接收器,因为我不完全确定在那里使用的做法(接收器与任何活动分开存在)。我认为只要应用程序正在运行,接收器就会运行,或者即使在清单中声明它也是前台的吗?任何关于此的文献都表示赞赏。
我已经绕过这个问题,因为活动是'singleTop'启动模式并实现onNewIntent()。这给了我想要的行为,同时也允许在没有活动运行的情况下启动(使用清单)。这是我的最终目标。但是,我真的希望了解这种行为并对解决方案保持高度兴趣!
进一步编辑:我的调试设备是三星Galaxy S3。我没有改变ROM。
答案 0 :(得分:0)
是的,您需要使用Activity添加元数据:
<meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
android:resource="@xml/accessory_filter" />
accessory_filter:
<resources>
<usb-accessory manufacturer="Acme, Inc" model="Whiz Banger" version="7.0" />
</resources>
查看此Android开发人员博客 A Bright Idea: Android Open Accessories