Android开发Usb转移

时间:2012-12-21 21:58:30

标签: android usb transfer

我是Android开发的新手,我最近一直在探索Usb Host。

是否有人能够告诉我如何使用批量转移以便我可以看到外部相机看到的内容,而是将其显示在我的平板电脑上?

相机:佳能Powershot A1300 平板电脑:Iconia A200

我已经查看了堆栈溢出和其他一些论坛,但还没有找到关于如何使用批量传输或使用哪些常量作为检索某些数据的参数的良好解释。

我能够看到端点并与外部摄像头建立连接,但我不知道从哪里开始。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:14)

Android中的USB Host API相当薄,我的意思是,一旦你不再枚举接口/端点并创建连接,它就无法帮助你。然后,您将进行与原始USB数据传输通信的领域,其格式取决于您的摄像头所代表的设备类别。您的请求有点像蠕虫,所以我会尽我所能提供有用的资源。

不幸的是,存储和媒体设备并不是最容易解释的设备类,因此如果您只是习惯性地使用USB,可能会很困难。我能给出的最好建议是查看相机报告的接口类的设备类规范(大多数是Mass Storage或MTP),可在此处找到:http://www.usb.org/developers/devclass_docs

规范文档将枚举您需要用于与设备通信的命令。我还建议您查看USB In a Nutshell,它可以很好地指出USB请求是如何构建的,这可以帮助您将您在规范文档中看到的内容映射到{{方法中找到的参数1}}:http://www.beyondlogic.org/usbnutshell/usb1.shtml

最初可能需要将少量控制命令发送到“端点0”以设置摄像机,然后剩余的传输可能会在批量端点上进行。

在Android术语中,控件请求只能使用UsbDeviceConnection同步发送,这意味着此方法将一直阻止,直到传输完成。填写此方法的参数可在设备类的规范文档中找到。

批量端点上的请求可以通过UsbDeviceConnection.controlTransfer()或使用UsbDeviceConnection.bulkTransfer()实例异步发送。使用UsbRequest,您可以对转移进行排队,然后再检查(通过UsbRequest)获取结果。

我在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/或者您可以在Nutshell中从USB中找到更有用的描述,还有一点讨论:http://www.beyondlogic.org/usbnutshell/usb5.shtml#ConfigurationDescriptors

长度有些随意,这告诉驱动程序要读取或写入多少字节。大多数USB主机驱动程序将首先查询设备描述符,其中包括一个告诉主机设备支持的最大数据包大小的字段,然后将该大小用作未来请求的长度。一个功能齐全的驱动程序可能会生成此命令,然后首先检查长度字节(描述符的wTotalLength字段)以查看缓冲区是否足够大,如果没有则修改/重新发送。在这个例子中,为了简单起见,我只选择了64,因为这是协议定义为可支持的“最大”最大包大小。

再次,然后请求您的设备必须提供的特定数据,这些命令将在特定的类文档中找到,而不是核心规范。