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

在USB主机模式(Android 3.1及更高版本)下安装的USB存储设备上的文件I/O,android,file-io,usb,Android,File Io,Usb,好的,我有一个安卓3.1平板电脑(Acer Iconia Tab,顺便说一句,它很棒),我可以用它和安卓USB API连接USB大容量存储设备(一个简单的USB记忆棒) 我使用USB主机模式,找到设备,获得连接到它的权限(使用BroadcastReceiver)。一切都很好。问题是,我不知道如何将文件从外部存储目录复制到USB记忆棒 这就是我到目前为止所做的: final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

好的,我有一个安卓3.1平板电脑(Acer Iconia Tab,顺便说一句,它很棒),我可以用它和安卓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开发人员的文档,但不是很明确,我发现了一个很好的教程,但它使用异步通信

我只是想知道我应该如何设置连接和使用端点(我没有得到端点部分,为什么需要它们),以便能够在USB存储设备上创建一个新文件,并在其中复制不同文件的内容,可能使用bulkTransfer()方法

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


谢谢

您的连接已建立,端点基本上是设备上带有数据传输信息的标志

对于你的棍子,你需要做一些类似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测试in)。您想要的端点是特定于设备的,我的示例从0开始,您的端点将不同

要重新保存文件,需要执行以下操作

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

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

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


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

Wow,谢谢你的回答。我失去了得到答案的希望。我今天会检查并接受你的答案,如果它有效:)。@Bandreid我不明白你是如何指定要传输的内容的。你说呢,,“将文件'abc.txt'发送给我,该文件位于“/docs/alphabet/”?@Mike Ortiz-我没有在我的问题中添加这部分代码。我不理解这个答案。在哪里指定文件夹名称?文件名在哪里?@AlikElzin kilaka-这个答案基本上是不完整的,因为它无法解决android USB主机API只支持原始访问的事实。文件系统级访问要求应用程序本身实现USB大容量存储模式,并在其上实现一个文件系统。我找不到任何实现USB大容量存储模式的好例子。是否有人可以指出这一点?我不知道有人这样说——但大容量存储是最简单的部分,您也需要一个文件系统实现。是否有任何库可以简化这一过程?这是一个有趣的问题。但是,要求查找库或非现场资源的请求在这里正式脱离主题。@Bandreid,你找到解决方案了吗?我的使用案例是,我需要通过在安卓设备上创建文件,将数据从安卓设备传输到连接的USB大容量存储器。可能吗?