检测Android设备何时分离

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

"这些消息传递系统中没有重叠:广播意图仅传递给广播接收者,而不传递给活动或服务"


pra*_*yet 8

尝试使用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)


Mic*_*ael 5

所以,我从来没有ACTION_USB_DEVICE_DETACHED Intent去过LauncherActivity;我不知道那笔交易是什么,可能是我对意图过滤器或Activity生命周期回调没有正确的了解。

我最终使用的解决方案来自Pratik链接的帖子。我基本上把一切都花光USB_DEVICE_DETACHEDAndroidManifest.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是行不通的,但它确实是我所需要的。