android - 如何从连接到 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);
解决方案
对于 CDC 设备,您通常必须为您的 VID:PID 提供customProber或使用硬编码驱动程序。您可能会遇到的下一个问题是缺少特权处理。
推荐阅读
- laravel - 如何仅在laravel中的前一周记录上添加编辑按钮
- c# - .NET Core 中不支持此类接口 (0x80004002)
- android - 未处理的异常:键入“列表”
' 不是类型 'List 的子类型 '颤动中的共享偏好 - python - PyQt QPushButton leaveEvent 同时按下 QPushButton
- mysql - 使用多个表的 SQL 查询
- java - 将 NDI 流保存到 mp4 时出现 FFMPEG 错误
- c# - 使用 C# 将文档插入 CosmosDB
- javascript - 如何在反应中访问它之外的.map()方法的索引
- vb.net - 位运算符 AND 不返回值
- css - CSS border-radius 改变背景角