如何从连接到 Android 的 USB 设备打开/获取可用的驱动程序?

How to open / get available drivers from a USB device connected to Android?

我为串行通信做了一个类似的 about how I can best send data to and receive data from a USB device connected to Android using the native API. Someone turned me toward a library,所以我想了解如何使用它。

到目前为止,我只使用了一些示例代码,只是为了看看是否能正常工作,但我一直在尝试打开 USB 设备。这是我正在使用的 USB 设备的详细信息 print out。这是一个 CDC 设备,应该回显发送给它的内容。

这是我现在 运行ning 的代码。该应用程序有一个按钮可以执行此功能。

   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);
   }

函数在第一个 return 处停止,其中找不到可用的驱动程序。 我之前遇到过类似的问题,本地 API 无法打开设备。该库无法找到可用的驱动程序。

我正在 Pixel 3 上进行测试。在我可以 运行 我的应用程序之前,Pixel 是否可以自行锁定设备?我将 Pixel 插入我的桌面,然后从 Android Studio 'run app'(我打开了 USB 调试并启用了开发选项)。应用程序 运行ning 后,我将其从桌面上拔下并插入我的 USB 设备。这会以一种奇怪的方式改变状态吗?

编辑:

已添加权限。

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

对于 CDC 设备,您通常必须为 VID:PID 提供 customProber 或使用硬编码驱动程序。您很可能 运行 遇到的下一个问题是缺少权限处理。