BroadcastReceiver监视附加的特定USB设备

时间:2014-08-19 13:16:22

标签: android usb broadcast intentfilter

我有一项活动是在连接特定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>

我还有一个服务,我想监视连接和断开连接。我有BroadcastReceivers接线,他们触发设备连接和分离。但是,当只连接/分离我的device_filter.xml中指定的设备时,我希望触发这些广播接收器。

m_usbDisconnectReceiver = new UsbDisconnectReceiver();
registerReceiver(m_usbDisconnectReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED));

m_usbConnectReceiver = new UsbConnectReceiver();
registerReceiver(m_usbConnectReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED));

我不确定如何将我的device_filter文件附加到以编程方式创建的广播接收器。我可以在IntentFilter中为此做些什么吗?我认为提供给onReceive()的Intent有一个UsbDevice作为其附加功能之一,但最好是我可以过滤它以便事件不会触发。如果那是不可能的,我如何检查UsbDevice是否是我的device_filter的一部分?

1 个答案:

答案 0 :(得分:2)

如果您必须以编程方式创建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
       }
    }
}