Как открыть / получить доступные драйверы с USB-устройства, подключенного к Android?

Я сделал аналогичный сообщение о том, как лучше всего отправлять и получать данные с USB-устройства, подключенного к Android, с помощью собственного API. Кто-то направил меня к библиотеке для последовательной связи, поэтому я пытаюсь понять, как это использовать.

Я пока использую только часть примера кода, чтобы увидеть, что что-то работает, но я застрял на попытке открыть USB-устройство. Вот подробная распечатка с USB-устройства, которое я использую. Это устройство CDC, которое должно отражать то, что ему отправлено.

Вот тот код, который у меня сейчас запущен. В приложении есть одна кнопка, которая выполняет эту функцию.

   private void DoTheThing () {

      String textMessage = "";

      // Find all available drivers from attached devices.
      UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
      List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
      if (availableDrivers.isEmpty()) {
         textMessage += "Could not find any avaliable drivers.\n";
         m_textView.setText(textMessage);
         return;
      }

      // Open a connection to the first available driver.
      UsbSerialDriver driver = availableDrivers.get(0);
      UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
      if (connection == null) {
         // add UsbManager.requestPermission(driver.getDevice(), ..) handling here
         textMessage += "Could not open device.\n";
         m_textView.setText(textMessage);
         return;
      }

      UsbSerialPort port = driver.getPorts().get(0); // Most devices have just one port (port 0)
      try {
         port.open(connection);
         port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
      } catch (IOException e) {
         textMessage += e + "\n";
         m_textView.setText(textMessage);
         return;
      }

      textMessage += "I did the thing.\n";
      m_textView.setText(textMessage);
   }

Функция останавливается при первом возврате, когда доступный драйвер не может быть найден. Раньше у меня была аналогичная проблема, когда собственный API не мог открыть устройство. Эта библиотека не может найти доступный драйвер.

Я тестирую Pixel 3. Может ли Pixel заблокировать устройство, прежде чем я смогу запустить приложение? Я подключаю Pixel к своему рабочему столу, а затем запускаю приложение из Android Studio (у меня включена отладка по USB и включены параметры разработчика). После запуска приложения я отключаю его от рабочего стола и подключаю USB-устройство. Может ли это странным образом изменить состояние?

РЕДАКТИРОВАТЬ:

Получил работу с добавлением разрешений.

PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(INTENT_ACTION_GRANT_USB), 0);
manager.requestPermission(driver.getDevice(), usbPermissionIntent);

введите здесь описание изображения  введите описание изображения здесь


person GhostRavenstorm    schedule 03.12.2019    source источник


Ответы (1)


для устройств CDC обычно необходимо предоставить customProber для вашего VID: PID или используйте жестко запрограммированный драйвер. Следующая проблема, с которой вы, вероятно, столкнетесь, - это отсутствие обработки привилегий.

person kai-morich    schedule 04.12.2019
comment
Хорошо. Я понял, как использовать специальный пробер. VID и PID - 0x239a и 0x800c. Библиотека нашла драйвер устройства, но остановилась при открытии устройства. Не смог открыть. Та же проблема, что и раньше, с собственным API. Это где разрешение является проблемой? Я точно не знаю, почему он не работает, когда возвращается null. - person GhostRavenstorm; 04.12.2019
comment
Получил, чтобы открыть с разрешениями. - person GhostRavenstorm; 04.12.2019