2011-09-10 15 views
9

Ok, tengo una tableta Android 3.1 (Acer Iconia Tab, que es genial por cierto) que puedo usar con Android USB API para conectar con un dispositivo de almacenamiento masivo USB (un simple dispositivo de memoria USB).Archivo de E/S en un dispositivo de almacenamiento USB montado en el modo de host USB (Android 3.1 y superior)

Uso el modo de host USB, encuentro el dispositivo, obtengo permiso para conectarme (usando BroadcastReceiver). Todo funciona genial El problema es que no sé exactamente qué hacer para copiar un archivo del Directorio de almacenamiento externo a la memoria USB.

Esto es lo que tengo hasta ahora:

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

leí la documentación sobre el Dev Android Usb Host pero no es muy explícito y me encontré con un muy buen tutorial Android Usb Host Tutorial - AdbTest pero utiliza comunicación asíncrona.

Solo quiero saber cómo debo configurar la conexión y usar el punto final (no obtuve la parte del punto final, por qué son necesarios) para poder crear un nuevo archivo en el dispositivo de almacenamiento USB y copie el contenido de un archivo diferente allí, probablemente utilizando el método bulkTransfer().

Cualquier sugerencia o puntero a documentación más explícita sería muy apreciada.

Gracias

Respuesta

1

Su conexión se establece, los puntos finales son básicamente banderas en el dispositivo con la información sobre la transferencia de datos.

para su memoria que tiene que hacer algo como VV de averiguar cuántos puntos finales que tiene,

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

Esto le permitirá averiguar si el punto final que le interesa es una mayor (constantes USB docs tiene otros tipos) y si puede enviar datos hacia o desde el dispositivo en ese punto final (usb_dir_in para probar). ¿Qué punto final que queremos es un dispositivo específico, mi ejemplo comienza en 0, la suya será diferente

Para volver a guardar el archivo que hay que hacer algo como

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

He estado ahorrando el cada vez que se llena con tampón una secuencia de salida de archivo, esto es probablemente ineficiente (como supongo que bulktransfer ya está guardando en alguna parte) pero la documentación es escasa.

+0

Guau, gracias por responder. Perdí la esperanza de obtener una respuesta. Lo verificaré hoy y aceptaré tu respuesta si funciona :). – Bandreid

+1

@Bandreid No entiendo cómo especifica lo que desea transferir. ¿Dónde dices, "enviarme archivo 'abc.txt' ubicado en '/ docs/alphabet /'? –

+0

@Mike Ortiz - No agregué esta parte del código en mi pregunta. – Bandreid

4

Las API de host USB de Android solo proporcionan acceso USB puro. Para acceder a los archivos en un dispositivo de memoria, su aplicación debe implementar el Modo de almacenamiento masivo USB en la parte superior de los Apis USB, y luego el código de un sistema de archivos además de eso.

Algunas versiones de Android personalizadas por el fabricante montan un dispositivo de almacenamiento masivo USB con un sistema de archivos reconocido a nivel del sistema de operación, pero que actualmente no es parte de un android estándar. También es posible que, si tiene un dispositivo rooteado, pueda usarlo para convencer al kernel de que monte dicho sistema de archivos.

+1

No encuentro ningún buen ejemplo para implementar el modo de almacenamiento masivo USB. ¿Hay alguien que pueda señalar? –

+0

No conozco ninguno, pero el almacenamiento masivo es la parte fácil, también necesita una implementación del sistema de archivos. –

+0

¿hay alguna biblioteca que pueda facilitar el proceso? –

Cuestiones relacionadas