Mic*_*ael 7 android android-intent
我有一个Android应用程序,需要检测USB外围设备何时连接或分离.它工作正常,当外围首先连接,但我没有收到任何通知(即我没有收到Intent,其作用是ACTION_USB_DEVICE_DETACHED),当它随后被拆卸.
这是我的相关部分AndroidManifest.xml:
<activity android:name=".LauncherActivity">
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" />
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" android:resource="@xml/device_filter" />
</activity>
Run Code Online (Sandbox Code Playgroud)
还可能值得注意的是,LauncherActivity只有Service在连接设备时才启动,并在分离时停止服务.在任何一种情况下,LauncherActivity总是finish立即自己.所有这些都发生在LauncherActivity.onCreate.
有任何想法吗?
小智 13
USB_DEVICE_DETACHED是广播意图,因此您可能希望在清单中声明BroadcastReceiver,并使用适当的intent-filter进行分离操作,同时附加元数据.USB_ACCESSORY_DETACHED也是如此,感兴趣的是谁.
摘要:
USB_XXX_ATTACHED是一个活动意图
USB_XXX_DETACHED是一个广播意图
(其中XXX =设备|附件)
请参阅:http://developer.android.com/guide/components/intents-filters.html
"这些消息传递系统中没有重叠:广播意图仅传递给广播接收者,而不传递给活动或服务"
尝试使用USB_STATE,如下所示.
它将连接和分离到相同的接收器和接收器,您可以识别是附加还是分离事件.
IntentFilter filter = new IntentFilter();
filter.addAction("android.hardware.usb.action.USB_STATE");
Run Code Online (Sandbox Code Playgroud)
接收器:
public class USBReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (intent.getExtras().getBoolean("connected")) {
//do your stuff
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我从来没有ACTION_USB_DEVICE_DETACHED Intent去过LauncherActivity;我不知道那笔交易是什么,可能是我对意图过滤器或Activity生命周期回调没有正确的了解。
我最终使用的解决方案来自Pratik链接的帖子。我基本上把一切都花光USB_DEVICE_DETACHED了AndroidManifest.xml。然后,在的onCreate方法中Service,我这样注册BroadcastReceiver:
@Override
public void onCreate() {
detachReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED))
stopSelf();
}
};
IntentFilter filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
registerReceiver(detachReceiver, filter);
}
Run Code Online (Sandbox Code Playgroud)
有点麻烦,而且我还是好奇,为什么只是添加USB_DEVICE_DETACHED到<intent-filter>的LauncherActivity是行不通的,但它确实是我所需要的。
| 归档时间: |
|
| 查看次数: |
20722 次 |
| 最近记录: |