12

我有一个 Android 应用程序需要检测 USB 外围设备何时连接或分离。首次连接外围设备时它工作正常,但随后分离时我没有收到任何通知(即,我没有收到Intentwho 的操作是)。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>

还可能值得注意的是,LauncherActivityService在连接设备时启动服务,并在设备分离时停止服务。在任何一种情况下,LauncherActivity总是finish立即 es 本身。所有这些都发生在LauncherActivity.onCreate.

有任何想法吗?

4

5 回答 5

16

USB_DEVICE_DETACHED 是一个广播意图,因此您可能希望使用适当的意图过滤器在清单中声明 BroadcastReceiver 以进行分离操作,并附加元数据。对于感兴趣的人,USB_ACCESSORY_DETACHED 也是如此。

总结:
USB_XXX_ATTACHED是一个活动意图
USB_XXX_DETACHED是一个广播意图

(其中 XXX = 设备 | 附件)

请参阅:http: //developer.android.com/guide/components/intents-filters.html

“这些消息传递系统之间没有重叠:广播意图仅传递给广播接收者,从不传递给活动或服务”

于 2013-12-06T12:17:12.123 回答
10

尝试使用 USB_STATE 如下。

它将触发附加和分离到同一个接收器,并且在接收器中,您可以识别是附加还是分离事件。

IntentFilter filter = new IntentFilter();
filter.addAction("android.hardware.usb.action.USB_STATE");

接收者:

public class USBReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        if (intent.getExtras().getBoolean("connected")) { 
             //do your stuff
        }
    }  
}
于 2015-02-11T10:31:05.033 回答
7

所以,我从来没有ACTION_USB_DEVICE_DETACHED IntentLauncherActivity;我不知道那里有什么交易,可能是我对意图过滤器或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);
}

有点笨拙,我仍然很好奇为什么只是添加USB_DEVICE_DETACHED<intent-filter>ofLauncherActivity不起作用,但它可以满足我的需要。

于 2013-04-02T19:38:47.680 回答
0

对于它的价值,我遇到了同样的问题,因为活动被暂停,然后在设备断开连接时恢复。由于接收者在接收 之前
未在方法中注册,因此您的应用程序永远不会收到通知。OnPause()ACTION_USB_DEVICE_DETACHED

于 2015-09-13T12:50:32.187 回答
0

对我有用的修复是取消注册onPause()并再次注册onResume()

@Override
public void onPause()
{
    super.onPause();
    stopIOManager();
    if(m_UsbReceiver!=null) unregisterReceiver(m_UsbReceiver);
}

@Override
public void onResume()
{
    super.onResume();
    startIOManager();
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
    filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
    registerReceiver(m_UsbReceiver, filter);
}

然而,尽管应用程序似乎总是收到 DETACH 事件,但有时它不会收到 ATTACHED 事件。然后我需要插拔 USB 连接器,通常尝试一两次后它就可以工作。我不确定将这种奇怪行为归咎于操作系统。

于 2016-02-14T01:21:41.370 回答