2011-09-10 38 views
9

Ok, quindi ho un tablet Android 3.1 (Acer Iconia Tab, che comunque è ottimo) che posso utilizzare con Android USB API per connettersi con un dispositivo di archiviazione di massa USB (una semplice memory stick USB).I/O file su un dispositivo di archiviazione USB montato in modalità Host USB (Android 3.1 e versioni successive)

Io uso la modalità Host USB, trova il dispositivo, ho il permesso di collegarci ad esso (usando BroadcastReceiver). Tutto funziona alla grande. Il problema è che non so esattamente cosa fare per copiare un file dalla directory di archiviazione esterna alla memory stick USB.

Questo è quello che ho finora:

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

ho letto la documentazione su Android Dev Usb Host ma non è molto esplicito e ho trovato un buon tutorial di Android Usb Host Tutorial - AdbTest ma utilizza la comunicazione asincrona.

Voglio solo sapere come configurare la connessione e utilizzare l'endpoint (non ho ottenuto la parte dell'endpoint, perché sono necessari) per poter creare un nuovo file sul dispositivo di archiviazione USB e copiare i contenuti di un file diverso lì, probabilmente usando il metodo bulkTransfer().

Qualsiasi suggerimento o puntatore a documentazione più esplicita sarebbe molto apprezzato.

Grazie

risposta

1

La connessione è impostato, i punti finali sono fondamentalmente bandiere il dispositivo con le informazioni sul trasferimento dei dati.

Per la vostra chiavetta è necessario fare qualcosa di simile VV per capire quanti punti finali si dispone,

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

Questo vi permetterà di capire se l'endpoint che ti interessa è una massa (costanti usb docs ha altri tipi) e se è possibile inviare dati ao dal dispositivo a tale endpoint (usb_dir_in to test for in). Cosa endpoint che si desidera è un dispositivo specifico, il mio esempio inizia il 0, il vostro sarà diverso

Per salvare nuovamente il file è necessario fare qualcosa di simile

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

ho salvare il buffer ogni volta che si riempie di un flusso di output di file, questo è probabilmente inefficiente (come presumo che bulktransfer stia già salvando da qualche parte) ma la documentazione è scarsa.

+0

Wow, grazie per aver risposto. Ho perso la speranza di ottenere una risposta. Lo controllerò oggi e accetterò la tua risposta se funziona :). – Bandreid

+1

@Bandreid Non capisco come si specifica ciò che si desidera trasferire. Dove dici "inviami il file 'abc.txt' che si trova in"/docs/alphabet/'? –

+0

@ Mike Ortiz - Non ho aggiunto questa parte di codice nella mia domanda – Bandreid

4

Le API host USB Android forniscono solo l'accesso USB non elaborato. Per accedere ai file su un dispositivo di memoria, l'app deve implementare essa stessa la modalità di archiviazione di massa USB sopra l'apis USB, quindi il codice di un filesystem in primo piano.

Alcune versioni personalizzate di Android installate dal fornitore installeranno un dispositivo di archiviazione di massa USB con un file system riconosciuto a livello di sistema operativo, ma attualmente non fa parte dello standard Android. È anche possibile che se si ha un dispositivo rooted si possa essere in grado di usarlo per convincere il kernel a montare un tale filesystem.

+1

Non riesco a trovare alcun buon esempio per l'implementazione della modalità di archiviazione di massa USB. C'è qualcuno che può indicare? –

+0

Non ne sono a conoscenza - ma la memoria di massa è la parte facile, è necessaria anche un'implementazione del filesystem. –

+0

c'è qualche libreria che potrebbe facilitare il processo? –

Problemi correlati