Определить, когда устройство USB OTG отключается

1

У меня есть приложение, которое взаимодействует с устройством USB OTG:

  • Когда USB-устройство подключается, запускается вспомогательная операция для отображения диалогового окна подтверждения Android. Это делается через IntentFilter в манифесте.
  • Вспомогательное действие запускает сервис, запускаемый отправкой ему конкретного приложения.
  • Метод onCreate() заполняет IntentFilter, добавляя действия, на которые служба должна реагировать при запуске, включая UsbManager.ACTION_USB_DEVICE_DETACHED. Добавление дополнительных выходных данных отладки говорит мне, что метод запускается, когда я ожидаю этого, т.е. IntentFilter заполняется, когда я регистрирую получателя.
  • Метод onStartCommand() вызывает внутренний метод, который регистрирует BroadcastReceiver для фильтра намерений (если служба была запущена с намерением запуска и имеет необходимые разрешения - иначе служба завершается).
  • Когда получатель получает UsbManager.ACTION_USB_DEVICE_DETACHED и устройство, о котором сообщается, является тем, которое в данный момент подключено, оно останавливает службу.
  • Существует также основная деятельность, которая не связана с обработкой USB-устройства.
  • Услуга также вызывается по другим причинам, особенно когда подключено зарядное устройство. В этом случае служба ищет устройство Bluetooth (если устройство USB уже подключено, что указывается, что элемент экземпляра службы не равен NULL, оно пропускается и служба завершается).

Теперь, если я подключаю устройство USB, я получаю подтверждение, и служба запускается, и когда я отключаю устройство, служба снова останавливается. Все идет нормально.

Однако в некоторых случаях служба продолжает работать даже после отключения устройства. Я заметил, что это всегда происходит, когда основное действие было открыто, когда я подключил устройство. Журналы показывают, что сервис никогда не получает широковещательную UsbManager.ACTION_USB_DEVICE_DETACHED.

Выполняя дальнейшие тесты (откройте основное действие и отойдите от него перед подключением устройства), я обнаружил доказательства того, что по какой-то причине может быть два экземпляра службы.

Что здесь происходит, и как я могу надежно определить, что USB-устройство было отключено?

Теги:
usb-otg

1 ответ

0
Лучший ответ

Такое поведение вызвано двумя факторами:

  • Как описано выше, служба запускается не только при подключении устройства USB, но и при других событиях, таких как подключение устройства к адаптеру переменного тока или открытие основного действия. В этих случаях он будет искать устройство Bluetooth ("автоподключение") и завершать работу, если ничего не найдено, или если устройство USB уже подключено.
  • В результате, когда автоматическое подключение включено, при открытии основного действия всегда запускается первый экземпляр службы. Если после этого USB-устройство подключается, возможно, у нас запущены два экземпляра службы. Я подозреваю, что сообщение об отключении может быть получено не тем экземпляром.
  • Если я отключаю автоподключение, служба получает событие отключения, но игнорирует его, поскольку устройства не считаются равными. Тем не менее, вывод журнала показывает, что путь к обоим устройствам одинаков. Дальнейший анализ показал, что я просто использовал != Для сравнения двух экземпляров UsbDevice, который не может перехватить два разных экземпляра класса, ссылающихся на одно и то же устройство.

Итак, нам нужно сделать две вещи:

  • Используйте UsbDevice#equals() вместо оператора равенства для сравнения.
  • Запретить запуск нескольких экземпляров службы. Убедитесь, что служба завершается, когда устройство не найдено, и содержимое доставляется в существующий экземпляр, а не запускается новое.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню