【问题标题】:How to open / get available drivers from a USB device connected to Android?如何从连接到 Android 的 USB 设备打开/获取可用驱动程序?
【发布时间】:2019-12-03 13:42:25
【问题描述】:

我做了一个类似的post,关于如何最好地向使用本机 API 连接到 Android 的 USB 设备发送数据和从 USB 设备接收数据。有人将我转向library 进行串行通信,所以我试图了解如何使用它。

到目前为止,我只使用了一些示例代码来查看某些功能,但我一直在尝试打开 USB 设备。这是我正在使用的 USB 设备的详细 print out。它是一个 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);

【问题讨论】:

    标签: android serial-port usb cdc


    【解决方案1】:

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

    【讨论】:

    • 好的。我想出了如何使用自定义探测器。 VID 和 PID 分别为 0x239a 和 0x800c。库找到了设备驱动程序,但在打开设备时停止了。打不开。与本机 API 相同的问题。这是许可的问题吗?我不完全知道为什么在返回 null 时它会失败。
    • 用权限打开它。
    猜你喜欢
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    相关资源
    最近更新 更多