当USB设备在Android分离检测(Detecting when a USB device is

2019-08-19 00:38发布

我有一个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>

这也可能是值得一提的是, LauncherActivity只存在启动Service的设备连接时,当它被派遣去停止该服务。 在这两种情况下, LauncherActivity总是finish立即ES本身。 所有这一切都在发生LauncherActivity.onCreate

有任何想法吗?

Answer 1:

USB_DEVICE_DETACHED是广播的意图,因此您可能需要使用附加的元数据来声明广播接收器的清单与适当的意图过滤器的分离动作,也。 这同样适用于USB_ACCESSORY_DETACHED,对于谁是感兴趣。

摘要:
USB_XXX_ATTACHED是一个活动的意图
USB_XXX_DETACHED是广播意图

(其中XXX = DEVICE | ACCESSORY)

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

“有这些消息系统中没有重叠:广播意图仅被传递给广播接收器,再也没有活动或服务”



Answer 2:

与USB_STATE尝试如下。

它会触发附加和detatched到相同的接收器和接收器可以识别是,是否附着或detatched事件。

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
        }
    }  
}


Answer 3:

所以,我从来没有得到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>LauncherActivity没有工作,但它确实是我所需要的。



Answer 4:

对于它的价值,我有同样的问题,因为活动被暂停则当设备断开连接恢复。
由于接收器处于未注册OnPause()方法之前,为了接收ACTION_USB_DEVICE_DETACHED ,你的应用程序从未得到通知。



Answer 5:

为我工作的修复是取消注册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事件,一旦没有得到附加事件。 然后我需要插入和并拔下USB连接器,它通常是一个或两个尝试后的作品。 我已经把的OS上这种奇怪的行为的责任,不确定性。



文章来源: Detecting when a USB device is detached on Android