首页 > 解决方案 > 如何从连接到 Android 的 USB 设备打开/获取可用驱动程序?

问题描述

我发表了一篇类似的文章,介绍了如何最好地使用原生 API 向连接到 Android 的 USB 设备发送数据和从 USB 设备接收数据。有人把我转向了一个用于串行通信的,所以我试图了解如何使用它。

到目前为止,我只使用一些示例代码来查看某些工作,但我一直在尝试打开 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);

在此处输入图像描述 在此处输入图像描述

标签: androidserial-portusbcdc

解决方案


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


推荐阅读