最近我一直在尝试按照我见过的所有示例和示例,使用广播接收器接收意图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的“功能”。
欢迎任何相关信息!
答案 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