USB-действия Android (ACTION_USB_DEVICE_ATTACHED и ACTION_USB_DEVICE_DETACHED) не работают в BroadcastReceiver

Я работаю над приложением, которое требует прослушивания событий USB (ACTION_USB_DEVICE_ATTACHED и ACTION_USB_DEVICE_DETACHED). Я создал приемник, который прослушивает эти действия. Но мой приемник не срабатывает, когда происходит какое-либо из этих событий.

Манифест Android:

<uses-feature android:name="android.hardware.usb.host" />

<receiver android:name=".USBEventReceiver">
            <intent-filter >
                <action android:name="android.hardware.usb.action.USB_STATE"/>
                <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/usb_device"/>
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"
                android:resource="@xml/usb_device"/>
 </receiver>

Метод BroadCastReceiver onReceive:

public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        UsbManager usbManager = (UsbManager)context.getSystemService(Context.USB_SERVICE);

        if (intent.getExtras().getBoolean("connected")) {
            Log.d(TAG, "onReceive: connected");
        } else if (!intent.getExtras().getBoolean("connected")) {
            Log.d(TAG, "onReceive: disconnected");
        }

        if (usbManager != null) Log.d(TAG, "onReceive: " + usbManager.getDeviceList().toString());

        if (device != null) Log.d(TAG, "USB Attached: " + device);


        if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
            Log.d(TAG, "onReceive: " + device.getManufacturerName());
            Log.d(TAG, "onReceive: " + device.getProductName());
            Log.d(TAG, "onReceive: " + device.getSerialNumber());
            Log.d(TAG, "onReceive: " + device.getSerialNumber());
        } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
            Log.d(TAG, "onReceive: " + device.getManufacturerName());
            Log.d(TAG, "onReceive: " + device.getProductName());
            Log.d(TAG, "onReceive: " + device.getSerialNumber());
        }

    }

person Vamshi Krishna    schedule 21.03.2017    source источник
comment
Вы получили решение этого?   -  person RohitMat    schedule 10.05.2017
comment
@RohitMat Да, я получил один.   -  person Vamshi Krishna    schedule 01.02.2018


Ответы (1)


Этот вопрос старый, но я все равно попробую его. Чтобы что-то действовало на эти USB-команды, я использовал BroadCast Receiver. ```

private final Broadcast Receiver mUsbReceiver = 
    switch(intent.getAction() {
        case UsbService.ACTION_USB_ATTACHED:
           //do something
        case UsbService.ACTION_USB_DETACHED:
            //do something

```

Где вам нужно зарегистрировать свой приемник с чем-то вроде:

private void setFilters() {
    IntentFilter filter = new IntentFilter();

    //New Service Filters
    filter.addAction(UsbService.ACTION_USB_ATTACHED);
    filter.addAction(UsbService.ACTION_USB_DETACHED);    
    registerReceiver(mUsbReceiver, filter);
}
person Karl Taht    schedule 05.02.2018