E / S de archivo en un dispositivo de almacenamiento USB montado en modo host USB (Android 3.1 y versiones posteriores)
Ok, por lo que tengo una tableta Android 3.1 (Acer Iconia Tab, que es genial por cierto) que puedo utilizar con Android USB API para conectar con un dispositivo de almacenamiento masivo USB (un simple memory stick USB).
Uso el modo USB Host, busco el dispositivo, obtengo permiso para conectarme (usando BroadcastReceiver). Todo funciona muy bien. El problema es que no sé exactamente qué hacer para copiar un archivo del directorio de almacenamiento externo a la memoria USB.
- Permisos de archivos Linux para dispositivos USB en Android
- Anfitrión USB Android y dispositivos ocultos
- Usb atar y depurar al mismo tiempo
- ¿Cómo hacer una aplicación básica Android Host USB?
- ¿Cómo utilizar el dispositivo USB en Android Versión inferior como Android 2.2?
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); } } } };
He leído la documentación en el Android Dev (http://developer.android.com/guide/topics/usb/host.html), pero no es muy explícito y he encontrado un buen tutorial (http://www.basic4ppc. Com / forum / basic4android-getting-started-tutorials / 11289-android-usb-host-tutorial-adbtest.html) pero utiliza la comunicación asíncrona.
Sólo quiero saber cómo debo configurar la conexión y utilizar el punto final (no obtuve la parte de punto final, por qué son necesarios) para poder crear un nuevo archivo en el dispositivo de almacenamiento USB y copiar el contenido de un Archivo diferente, probablemente utilizando el método bulkTransfer ().
Cualquier sugerencia o indicación a la documentación más explícita sería muy apreciada.
Gracias
- Modificar libusb para aceptar descriptor de archivo
- ¿Por qué adb vuelve a estar sin conexión después de la cadena del dispositivo?
- Causa de android adb "dispositivo usb no encontrado" problemas?
- Android USB API: cambia entre carga y envío de datos
- Uso de libusb en Android sin enraizamiento
- C #: Control de teléfono Android
- Escritura de controlador USB para Android
- ¿Se pueden transferir datos a través de USB Host API a PC vía cable USB?
Su conexión está configurada, los puntos finales son básicamente banderas en el dispositivo con información sobre la transferencia de datos.
Para tu palo necesitas hacer algo como VV para averiguar cuántos puntos finales tienes,
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 en el que está interesado es un bulk (docs de constantes usb tiene otros tipos) y si puede enviar datos desde o hacia el dispositivo en ese punto final (usb_dir_in para probar en). Qué punto final que desea es específico del dispositivo, mi ejemplo comienza en 0, el suyo será diferente
Para volver a guardar el archivo, necesitas hacer algo como
mConnection.bulkTransfer(mEndpointOut, bytes, 512, TIMEOUT);
He estado guardando el búfer cada vez que se llena con un flujo de salida de archivo, esto es probablemente ineficaz (como supongo bulktransfer ya está ahorrando en algún lugar), pero la documentación es escasa.
Las API de host USB de Android proporcionan sólo acceso USB sin procesar. Para acceder a los archivos de un dispositivo de memoria, la aplicación debe implementar el modo de almacenamiento masivo USB encima del Apis USB y, a continuación, el código de un sistema de archivos.
Algunas versiones personalizadas de Android montarán un dispositivo de almacenamiento masivo USB con un sistema de archivos reconocido a nivel del sistema operativo, pero que actualmente no forma parte del androide estándar. También es posible que si tiene un dispositivo con raíz puede utilizarlo para convencer al kernel de montar dicho sistema de archivos.
- ¿Por qué usar Fragmentos "regulares" cuando tienes el Paquete de Compatibilidad de Android?
- Convertir json a objeto Map.Entry con Gson