Java 使用usb进行Android到Android的数据传输

Java 使用usb进行Android到Android的数据传输,java,android,usb,usb-hostcontroller,Java,Android,Usb,Usb Hostcontroller,我创建了一个应用程序,可以通过wifi将数据从android传输到android。我正在探索usb主机API,以增加对usb数据传输的支持。我正在关注主机API的android文档 并遵循所有的步骤。到目前为止,我能够授予所选设备权限,比如说手机A并成功打开usb设备写入数据,但我不知道如何在其他手机B上创建/访问usb设备?我看到其他手机没有收到usb连接/未连接事件的通知。当我添加android.hardware.usb.action.usb_时,事件更改会通知另一方,但我不知道如何获取/访

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


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

电话B是USB设备,它应该使用USB附件功能与附件主机电话A连接。 手机B选择附件usb小工具功能,这意味着手机B的sys.usb.config=附件。[getprop sys.usb.config=>附件]

应用程序级设计参考AOA:


在进一步阅读之后,我发现了这个问题。我必须通过发送特殊的controlTransfer消息,从主机强制设备进入附件模式

我在这里找到的

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();
    }
}
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);