Android开发USB转移

我对Android开发相当陌生,最近我一直在探索USB主机。

任何人都可以告诉我如何使用批量传输,以便我可以看到外部相机看到什么,而是显示在我的平板电脑上?

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

我已经浏览了堆栈溢出和其他一些论坛,但尚未能find一个很好的解释如何使用批量传输或使用什么常量作为检索某些数据的参数。

我能够看到端点,并与外部相机build立连接,但是我不知道从哪里走。

任何帮助深表谢意。

Solutions Collecting From Web of "Android开发USB转移"

Android中的USB Host API非常简单,我的意思是说,一旦你超越了枚举接口/端点并创build连接,它不会帮你做更多的事情。 然后,您就可以与原始USB数据传输进行通信,其格式取决于相机所代表的设备类别。 您的请求有点像蠕虫,所以我会尽我所能提供有用的资源。

不幸的是,存储设备和媒体设备并不是最简单的设备types,所以如果你只是在一般情况下使用USB,可能会很困难。 我可以给出的最好的build议是看看你的相机报告的接口类的设备类规格(大多数是大容量存储或MTP),可以在这里find: http : //www.usb.org/developers / devclass_docs

spec文档将枚举您需要用来与设备进行通信的命令。 我还build议查看一下USB的内核,它能够很好地指出USB请求是如何构build的,这可以帮助您将在规范文档中看到的内容映射到UsbDeviceConnection方法中的参数: http://www.beyondlogic.org/usbnutshell/usb1.shtml

您最初可能需要将一些控制命令发送到“端点0”,以便设置摄像机,然后其余传输将可能发生在大量端点上。

在Android术语中,控制请求只能使用UsbDeviceConnection.controlTransfer()同步发送,这意味着此方法将阻塞直到传输完成。 填写此方法的参数可在设备类的规格文档中find。

可以通过UsbDeviceConnection.bulkTransfer()或使用UsbRequest实例asynchronous发送批量端点上的请求。 使用UsbRequest您可以对传输进行排队,然后稍后(通过UsbDeviceConnection.requestWait() )检查结果。

我在我的Github页面上有一些例子,使用主机API来做一些基本的中断和控制传输来获取设备描述符等信息。 也许其中一些对你也有帮助: https : //github.com/devunwired/accessory-samples


关于你关于USB示例代码的问题:

此代码中的请求只是所有USB设备必须响应的通用“获取configuration描述符”请求(这是一个核心命令,而不是类特定的)。 实际上,它的请求是Android API获取您可以查询的接口和端点的信息。 字段值来自核心USB规范(该命令具体在3.0规范的第9.4.3和9.6.3节中定义): http : //www.usb.org/developers/docs/或更有帮助的描述可以从USB中find一个Nutshell,里面有更多的讨论: http : //www.beyondlogic.org/usbnutshell/usb5.shtml#ConfigurationDescriptors

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

再次,然后提出您的设备所提供的特定数据的请求,这些命令将在特定的类文档中find,而不是核心规格。