-1

我创建了一个通过 wifi 将数据从 android 传输到 android 的应用程序。我正在探索 USB 主机 API 以添加对通过 USB 传输数据的支持。我正在关注主机 API 的 android 文档

https://developer.android.com/guide/topics/connectivity/usb/host

并遵循所有步骤。到目前为止,我能够授予所选设备的权限让我们说电话“A”并成功打开 USB 设备以写入数据,但我不知道如何在其他电话“B”上创建/访问 USB 设备?我看到其他手机没有收到有关 USB 连接/未连接事件的通知。当我添加“android.hardware.usb.action.USB_STATE”时,另一方会收到事件更改的通知,但我不知道如何获取/访问手机“B”上的 usbdevice 对象以初始化读/写数据?当前的主机协议是单边协议吗?在这方面的任何帮助将不胜感激。

4

2 回答 2

2

进一步阅读后,我能够确定问题所在。我不得不通过发送特殊的 controlTransfer 消息从主机强制设备中的附件模式。

我在这里找到了

https://github.com/peyo-hd/TcpDisplay/blob/master/sink/src/com/android/accessorydisplay/sink/SinkActivity.java

sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_MANUFACTURER, MANUFACTURER);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_MODEL, MODEL);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_DESCRIPTION, DESCRIPTION);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_VERSION, VERSION);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_URI, URI);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_SERIAL, SERIAL);

// The device should re-enumerate as an accessory.
conn.controlTransfer(UsbConstants.USB_DIR_OUT | UsbConstants.USB_TYPE_VENDOR,
    UsbAccessoryConstants.ACCESSORY_START, 0, 0, null, 0, 10000);
于 2019-08-27T07:00:26.037 回答
0

Phone B 是 UsbDevice,它应该使用 USB Accessory 功能与 Accessory 主机(Phone A)连接。手机B选择附件usb小工具功能,即手机B的sys.usb.config=附件。[getprop sys.usb.config => 附件]

App层级设计参考AOA:

https://source.android.com/devices/accessories/protocol https://developer.android.com/guide/topics/connectivity/usb/accessory.html#java

UsbAccessory accessory;
ParcelFileDescriptor fileDescriptor;
FileInputStream inputStream;
FileOutputStream outputStream;
...

private void openAccessory() {
    Log.d(TAG, "openAccessory: " + accessory);
    fileDescriptor = usbManager.openAccessory(accessory);
    if (fileDescriptor != null) {
        FileDescriptor fd = fileDescriptor.getFileDescriptor();
        inputStream = new FileInputStream(fd);
        outputStream = new FileOutputStream(fd);
        Thread thread = new Thread(null, this, "AccessoryThread");
        thread.start();
    }
}
于 2019-08-27T04:57:59.750 回答