Определение событий подключения и отключения устройств USB |
![]() |
Добавил(а) microsin |
Можно настроить и зарегистрировать BroadcastReceiver примерно так: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... //Регистрация broadcast receiver IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); registerReceiver(mUsbReceiver, filter); ... Нужно также определить обработчик для события BroadcastReceiver: private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { usbdev = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); UsbManager usbmanager = (UsbManager)context.getSystemService(Context.USB_SERVICE); usbmanager.requestPermission(usbdev, mPermissionIntent); } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { usbdev = null; } } }; Здесь usbdev глобальная для класса Activity переменная типа UsbDevice. [Ошибка приема события USB_DEVICE_ATTACHED] На некоторых устройствах Android событие USB_DEVICE_ATTACHED не срабатывает [2], хотя USB_DEVICE_DETACHED отслеживается нормально. Но как тогда определить ситуацию, что устройство USB подключено к Android? В документации [1] сказано, что можно определить intent-filter в файле AndroidManifest.xml для того, чтобы отследить событие подключения устройства USB к Android как хосту: ... < 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/all_usb_devices_filter" /> < /activity > ... Здесь ресурс xml/all_usb_devices_filter задает файл xml/all_usb_devices_filter.xml такого содержания (здесь нет фильтрации по VID и PID устройства, поэтому фильтр будет срабатывать на все подключаемые устройства USB, подробнее см. [1]): < ?xml version="1.0" encoding="utf-8"? > < resources > <usb-device /> < /resources > События подключения теперь будет отслеживать обработчик onResume экземпляра Activity программы: @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); } События отключения будет отслеживать обработчик BroadcastReceiver, как уже было показано выше. В таком способе определения событий подключения/отключения устройств USB кроется еще одна проблема. Если программа уже запущена, то подключение устройства приводит к запуску второго экземпляра программы (еще одного экземпляра activity), что нежелательно, и может запутать пользователя. Зачем при каждом подключении устройства USB запускать новые экземпляры программы и тратить на это ресурсы?. Чтобы этого избежать, можно определить атрибут android:launchMode для activity в значение singleTask, чтобы программа работала только в одном экземпляре. ... < activity android:name="com.usbrelay.MainActivity" android:label="@string/app_name" android:launchMode="singleTask" > ... [Ссылки] 1. Android как хост USB. |