我对 Android 开发相当陌生,最近一直在探索 Usb Host。
谁能告诉我如何使用批量传输,以便我可以看到外部摄像头看到的内容,而是将其显示在我的平板电脑上?
相机:佳能 Powershot A1300 平板电脑:Iconia A200
我查看了堆栈溢出和其他一些论坛,但还没有找到关于如何使用批量传输或使用哪些常量作为检索某些数据的参数的良好解释。
我能够看到端点并与外部摄像头建立连接,但我不知道从这里去哪里。
任何帮助都深表感谢。
Android 中的 USB 主机 API 相当薄,我的意思是,一旦您超越了枚举接口/端点并创建连接,它就不会为您提供更多帮助。然后,您就处于与原始 USB 数据传输进行通信的领域,其格式取决于您的相机所代表的设备类别。您的要求有点像一罐蠕虫,所以我会尽力提供有用的资源。
不幸的是,存储和媒体设备并不是最容易解释的设备类,所以如果你只是在 USB 上沾沾自喜,可能会很困难。我能给出的最好建议是查看您的相机报告的接口类的设备类规范(大多数是大容量存储或 MTP),可以在这里找到:http ://www.usb.org/developers /devclass_docs
规范文档将列举您需要用来与设备通信的命令。我还建议检查一下 USB In a Nutshell,它很好地指出了 USB 请求的一般构造方式,它可以帮助您将您在规范文档中看到的内容映射到以下方法中找到的参数UsbDeviceConnection
:http ://www.beyondlogic.org/usbnutshell/usb1.shtml
您最初可能需要将一些控制命令发送到“端点 0”以设置相机,然后剩余的传输可能会通过批量端点进行。
在 Android 术语中,控制请求只能使用 同步发送UsbDeviceConnection.controlTransfer()
,这意味着此方法会阻塞,直到传输完成。填写此方法的参数可在您的设备类的规范文档中找到。
UsbDeviceConnection.bulkTransfer()
可以使用UsbRequest
实例通过 OR 异步同步发送批量端点上的请求。您可以对UsbRequest
传输进行排队,然后稍后返回(通过UsbDeviceConnection.requestWait()
)查看结果。
我的 Github 页面上有一些使用主机 API 进行基本中断和控制传输以获取设备描述符等信息的示例。也许其中一些对您也有帮助:https ://github.com/devunwired/accessory-samples
关于您关于 USB 示例代码的问题:
此代码中发出的请求只是所有 USB 设备必须响应的通用“获取配置描述符”请求(它是核心命令,而不是特定于类的)。事实上,它是 Android API 获取您可以查询的接口和端点信息的请求。字段值来自核心 USB 规范(此命令在 3.0 规范中的第 9.4.3 和 9.6.3 节专门定义):http ://www.usb.org/developers/docs/或您提供的更有用的描述可以从 USB in a Nutshell 中找到,其中有更多讨论:http ://www.beyondlogic.org/usbnutshell/usb5.shtml#ConfigurationDescriptors
长度有些随意,它告诉驱动程序要读取或写入多少字节。大多数 USB 主机驱动程序将首先查询设备描述符,其中包括一个告诉主机设备支持的最大数据包大小的字段,然后将使用该大小作为未来请求的长度。一个全功能的驱动程序可能会发出这个命令,然后首先检查长度字节(描述符的 wTotalLength 字段)以查看缓冲区是否足够大,如果没有则修改/重新发送。在示例中,为了简单起见,我只是选择了 64,因为这是协议定义为可支持的“最大”最大数据包大小。
同样,然后请求您的设备必须提供的特定数据,这些命令将在特定的类文档中找到,而不是在核心规范中。