以USB主机模式安装的USB存储设备上的文件I / O(Android 3.1及更高版本)

好的,所以我有一个Android 3.1平板电脑(Acer Iconia Tab,这很棒),我可以使用Android USB API与USB大容量存储设备(一个简单的USB记忆棒)连接。

我使用USB主机模式,find设备,获得连接到它的权限(使用BroadcastReceiver)。 所有的作品很好。 问题是,我不知道如何将外部存储目录中的文件复制到USB记忆棒。

这是我迄今为止:

final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { if (device != null) { // Got to a point where I should set up connection // I'm setting up a very simple connection, just want some file transfer UsbInterface intf = device.getInterface(0); UsbEndpoint endpoint = intf.getEndpoint(0); UsbDeviceConnection connection = UsbManager.openDevice(device); if (connection.claimInterface(intf, true)) { UtilsAndDialogs.print(getApplicationContext(), "Connected to device"); // Copy file to USB... } else UtilsAndDialogs.print(getApplicationContext(), "Could not connect!"); } } else { UtilsAndDialogs.print(getApplicationContext(), "Permission denied"); Log.d(UtilsAndDialogs.LOG_TAG, "Permission denied for device " + device); } } } }; 

我阅读了Android开发文档(http://developer.android.com/guide/topics/usb/host.html),但它不是很明确,我find了一个很好的教程(http://www.basic4ppc。 com / forum / basic4android-getting-started-tutorials / 11289-android-usb-host-tutorial-adbtest.html),但它使用asynchronous通信。

我只是想知道如何设置连接并使用端点(我没有得到端点部分,为什么需要)才能够在USB存储设备上创build一个新文件并复制一个那里有不同的文件,可能使用bulkTransfer()方法。

任何提示或指向更明确的文档将不胜感激。

谢谢

Solutions Collecting From Web of "以USB主机模式安装的USB存储设备上的文件I / O(Android 3.1及更高版本)"

您的连接已build立,终点基本上是在设备上的标志与数据传输的信息。

对于你的棒,你需要做一些像VV的东西来找出你有多less端点,

 UsbInterface intf = device.getInterface(0); // checks for 2 endpoints if (intf.getEndpointCount() != 2) { Toast toast = Toast.makeText(context, "could not find endpoint", duration); toast.show(); return; } UsbEndpoint ep = intf.getEndpoint(0); if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { if (ep.getDirection() == UsbConstants.USB_DIR_OUT) { 

这将让你找出你感兴趣的端点是否是一个批量(usb常数文档有其他types),并且你可以发送数据到该端点的设备(usb_dir_in来testing)。 你想要的端点是设备特定的,我的例子从0开始,你的将是不同的

要重新保存文件,你需要做类似的事情

 mConnection.bulkTransfer(mEndpointOut, bytes, 512, TIMEOUT); 

每次使用文件输出stream填充缓冲区时,我一直在保存缓冲区,这可能是低效的(因为我认为bulktransfer已经在保存某处),但文档很less。

Android USB主机API仅提供原始USB访问。 要访问存储设备上的文件,您的应用程序必须自己在USB Apis上实现USB Mass Storage Mode,然后在其上执行文件系统的代码。

一些供应商定制版本的Android将在操作系统级别上安装具有公认文件系统的USB大容量存储设备,但目前这不是标准的Android的一部分。 如果你有一个固定的设备,你也可以使用它来说服内核挂载这样一个文件系统。