Определить, когда устройство USB OTG отключается - PullRequest
1 голос
/ 06 марта 2019

У меня есть приложение, которое взаимодействует с устройством 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-устройство было отключено?

1 Ответ

0 голосов
/ 07 марта 2019

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

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

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

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