2011-09-10 45 views
9

好的,所以我有Android 3.1平板电脑(宏碁Iconia Tab,这很棒),我可以使用Android USB API连接到USB大容量存储设备(一个简单的USB记忆棒)。在USB主机模式下安装的USB存储设备上的文件I/O(Android 3.1及更高版本)

我使用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 Host但它不是很明确,我发现了一个很不错的教程Android Usb Host Tutorial - AdbTest但它使用异步通信。

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

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

谢谢

回答

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常数docs还有其他类型),并且您可以在该端点上向设备发送数据或从该设备发送数据(usb_dir_in以进行测试)。你想要什么端点设备具体,我的例子在0开始,你的将是不同的

重新保存,你需要做的是这样

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

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

+0

哇,谢谢你的回答。我失去了得到答案的希望。我会今天检查它,并接受你的答案,如果它的工作:)。 – Bandreid

+1

@Bandreid我不明白你是如何指定你想要传输的。你在哪里说“send me file'abc.txt'位于'/ docs/alphabet /'? –

+0

@Mike Ortiz - 我没有在我的问题中添加这部分代码 – Bandreid

4

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

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

+1

我找不到任何实施USB Mass Storage Mode的好例子。有人可以指出吗? –

+0

我不知道任何 - 但大容量存储是容易的部分,你也需要一个文件系统的实现。 –

+0

是否有任何可以缓解过程的库? –

相关问题