Android BroadcastReceiver监控连接的特定USB设备

Android BroadcastReceiver监控连接的特定USB设备,android,usb,broadcast,intentfilter,Android,Usb,Broadcast,Intentfilter,我有一个活动,在连接特定USB设备时启动,如设备筛选器文件中所指定,它非常有效: <activity android:name="com.mycompany.DerpApp.MainActivity" android:launchMode="singleTask" android:label="@string/app_name" > <intent-filter>

我有一个活动,在连接特定USB设备时启动,如设备筛选器文件中所指定,它非常有效:

<activity
            android:name="com.mycompany.DerpApp.MainActivity"
            android:launchMode="singleTask"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"  />
            </intent-filter>
            <meta-data
                android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/device_filter" />
        </activity>

我不确定如何将我的设备\u过滤器文件连接到通过编程创建的广播接收器。我可以在IntentFilter中为此做些什么吗?我认为提供给onReceive()的意图中有一个UsbDevice作为它的一个附加项,但最好是将其过滤掉,这样事件就不会触发。如果这不可能,我如何检查USB设备是否是我的设备过滤器的一部分?

如果您必须以编程方式创建BroadcastReceiver,那么您也需要以编程方式过滤设备

试试这个:

public void onReceive(Context context, Intent intent)
{
    if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED))
    {
        UsbDevice d = (UsbDevice)
            intent.getExtras().get(UsbManager.EXTRA_DEVICE);

       if (d.getVendorId() == MY_VENDOR_ID && d.getDeviceId() == MY_DEVICE_ID)
       {
              // Your code here
       }
    }
}

我可以为服务或整个应用程序定义广播接收器吗?您所说的“为服务”是什么意思?您的意思是希望在触发广播接收器onReceive时通知服务吗?如果是这样,您可以在onReceive中绑定到该服务,并在该服务上传递您想要处理的任何数据。我的意思是服务拥有并注册Bro。当然可以。您可以在android清单中声明广播接收器,在这种情况下,android将为您创建广播接收器。或者,您可以在服务内创建一个扩展BroadcastReceiver的静态内部类,并使用registerReceiver()动态注册它。
public void onReceive(Context context, Intent intent)
{
    if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED))
    {
        UsbDevice d = (UsbDevice)
            intent.getExtras().get(UsbManager.EXTRA_DEVICE);

       if (d.getVendorId() == MY_VENDOR_ID && d.getDeviceId() == MY_DEVICE_ID)
       {
              // Your code here
       }
    }
}