2011-09-10 73 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

是否有任何可以緩解過程的庫? –

相關問題