2011-09-10 6 views
9

Ok, więc mam tablet z Androidem 3.1 (Acer Iconia Tab, który jest świetny przy okazji), którego mogę używać z Androidem Interfejs USB API do połączenia z urządzeniem pamięci masowej USB (zwykła pamięć USB).We/wy na plikach na podłączonym urządzeniu pamięci USB w trybie hosta USB (Android 3.1 i nowsze)

Używam trybu hosta USB, znajdź urządzenie, uzyskaj uprawnienia do łączenia się z nim (używając BroadcastReceiver). Wszystko działa świetnie. Problem polega na tym, że nie wiem dokładnie, co zrobić, aby skopiować plik z katalogu zewnętrznego na nośnik USB.

To, co mam tak daleko:

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); 
      } 
     } 
    } 
}; 

Czytałem dokumentację na Android Dev Usb Host ale to nie jest bardzo wyraźny i znalazłem całkiem dobry samouczek Android Usb Host Tutorial - AdbTest ale wykorzystuje asynchroniczną komunikację.

Po prostu chcę wiedzieć, jak skonfigurować połączenie i użyć punktu końcowego (nie dostałem części punktu końcowego, dlaczego są potrzebne), aby móc po prostu utworzyć nowy plik na urządzeniu pamięci masowej USB i skopiuj zawartość innego pliku, prawdopodobnie używając metody bulkTransfer().

Wszelkie wskazówki lub wskazówki do bardziej wyraźnej dokumentacji byłyby mile widziane.

Dziękuję

Odpowiedz

1

Twoje połączenie jest skonfigurowane punkty końcowe są w zasadzie flagi na urządzeniu z informacjami na temat transferu danych.

Dla kij trzeba zrobić coś podobnego VV, aby dowiedzieć się, ile masz punktów końcowych,

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) { 

to pozwoli Ci zorientować się, czy punkt końcowy jesteś zainteresowany to bulk (stałe usb dokumenty mają inne typy) i jeśli możesz wysyłać dane do lub z urządzenia na tym punkcie końcowym (usb_dir_in do testowania w). Co punktu końcowego chcesz to konkretne urządzenie, mój przykład zaczyna się na 0, twoje będą różne

Aby ponownie zapisać plik trzeba zrobić coś jak

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

byłem zapisując bufor każdym razem, gdy wypełnia się Strumień wyjściowy pliku, jest to prawdopodobnie mało efektywne (ponieważ zakładam, że transfer danych jest już gdzieś oszczędzany), ale brakuje dokumentacji.

+0

Wow, dzięki za odpowiedź. Straciłem nadzieję na odpowiedź. Sprawdzę to dzisiaj i zaakceptuję twoją odpowiedź, jeśli zadziała :). – Bandreid

+1

@Bandreid Nie rozumiem, jak określasz, co chcesz przenieść. Gdzie mówisz: "wyślij mi plik" abc.txt "z"/docs/alphabet/"? –

+0

@Mike Ortiz - Nie dodałem tej części kodu w moim pytaniu – Bandreid

4

Interfejs API hosta USB systemu Android zapewnia tylko nieprzetworzony dostęp USB. Aby uzyskać dostęp do plików na urządzeniu pamięci, Twoja aplikacja musi sama zaimplementować tryb pamięci masowej USB na USB Apis, a następnie kod systemu plików.

Kilka niestandardowych wersji Androida zainstaluje urządzenie pamięci masowej USB z rozpoznawalnym systemem plików na poziomie systemu operacyjnego, ale nie jest to obecnie część standardowego systemu Android. Możliwe jest również, że jeśli masz zrootowane urządzenie, możesz go użyć do przekonania kernela do zamontowania takiego systemu plików.

+1

Nie mogę znaleźć żadnego dobrego przykładu wdrożenia trybu pamięci masowej USB. Czy jest ktoś, kto może wskazać? –

+0

Nie jestem tego świadomy - ale pamięć masowa jest łatwą częścią, potrzebna jest również implementacja systemu plików. –

+0

Czy istnieje jakaś biblioteka, która mogłaby ułatwić proces? –