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

时间:2011-09-10 12:37:27

标签: android file-io usb

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

我使用USB主机模式,找到设备,获得连接它的权限(使用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 Dev Usb Host的文档,但它不是很明确,我找到了一个非常好的教程Android Usb Host Tutorial - AdbTest,但它使用了异步通信。

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

非常感谢任何有关更明确文档的提示或指示。

谢谢

2 个答案:

答案 0 :(得分:4)

Android USB主机API仅提供原始USB访问。要访问内存设备上的文件,您的应用程序必须自己在USB Apis之上实现USB大容量存储模式,然后在文件系统的代码之上实现。

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

答案 1 :(得分:1)

您的连接已设置,端点基本上是设备上的标志,包含有关数据传输的信息。

对于你的手杖,你需要做一些类似VV的事情,以确定你拥有多少个端点,

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常量文档有其他类型),以及是否可以在该端点向设备发送数据(usb_dir_in以测试输入)。你想要的端点是设备特定的,我的例子从0开始,你的将是不同的

要重新保存文件,您需要执行类似

的操作
mConnection.bulkTransfer(mEndpointOut, bytes, 512, TIMEOUT);

每次填充文件输出流时,我一直在保存缓冲区,这可能是低效的(因为我假设bulktransfer已经在某处保存了)但文档很少。