Android 至 android 使用 USB 进行数据传输

Android to android data transfer using usb

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

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

并遵循所有步骤。到目前为止,我能够授予所选设备的权限让我们说 phone "A" 并成功打开 USB 设备写入数据,但我不知道如何 create/access usbdevice on other phone "B"?我看到其他 phone 未收到有关 usb attached/unattached 事件的通知。当我添加 "android.hardware.usb.action.USB_STATE" 时,另一方会收到事件更改通知,但我不知道如何 get/access phone "B" 上的 usbdevice 对象来初始化 read/write 数据?当前的主机协议是否是单边协议?在这方面的任何帮助将不胜感激。

Phone B是UsbDevice,它应该使用USB Accessory功能来连接Accessory host(Phone A)。 Phone B 选择to accessory usb gadget function,即Phone B的sys.usb.config = accessory。 [getprop sys.usb.config => 附件]

A​​pp级设计参考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();
    }
}

进一步阅读后,我确定了问题所在。我必须通过发送特殊的 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);