有人能告诉我如何使用批量转移,以便我可以看到外部相机看到的东西,而不是在我的平板电脑上显示它?
相机:佳能Powershot A1300
平板电脑:Iconia A200
我已经查看了堆栈溢出和其他一些论坛,但还没有找到关于如何使用批量传输或使用哪些常量作为检索某些数据的参数的良好解释.
我能够看到端点并与外部摄像头建立连接,但我不知道从哪里开始.
非常感谢任何帮助.
解决方法
不幸的是,存储和媒体设备并不是最容易解释的设备类,因此如果您只是习惯于使用USB,可能会很困难.我能给出的最好建议是查看相机报告的接口类的设备类规范(大多数是Mass Storage或MTP),可在此处找到:http://www.usb.org/developers/devclass_docs
spec文档将枚举您需要用于与设备通信的命令.我还建议您查看USB In a Nutshell,它可以很好地指出USB请求的构造方式,这可以帮助您将您在规范文档中看到的内容映射到UsbDeviceConnection方法中的参数: http://www.beyondlogic.org/usbnutshell/usb1.shtml
最初可能需要将少量控制命令发送到“端点0”以设置摄像机,然后剩余的传输可能会在批量端点上进行.
在Android术语中,控制请求只能使用UsbDeviceConnection.controlTransfer()同步发送,这意味着此方法将一直阻塞,直到传输完成.填写此方法的参数可在设备类的规范文档中找到.
批量端点上的请求可以通过UsbDeviceConnection.bulkTransfer()异步发送,也可以使用UsbRequest实例异步发送.使用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中的Nutshell中找到更有用的描述,其中包含更多内容讨论:http://www.beyondlogic.org/usbnutshell/usb5.shtml#ConfigurationDescriptors
长度有些随意,这告诉驱动程序要读取或写入多少字节.大多数USB主机驱动程序将首先查询设备描述符,其中包括一个字段,告诉主机设备支持的最大数据包大小,然后将该大小用作未来请求的长度.一个功能齐全的驱动程序可能会生成此命令,然后首先检查长度字节(描述符的wTotalLength字段)以查看缓冲区是否足够大,如果没有则修改/重新发送.在这个例子中,为了简单起见,我只选择了64,因为这是协议定义为可支持的“最大”最大包大小.
再次,然后请求您的设备必须提供的特定数据,这些命令将在特定的类文档中找到,而不是核心规范.