Android Development Usb Transferencia

Soy bastante nuevo en Android Development y recientemente he estado explorando Usb Host.

¿Alguien podría decirme cómo usar Bulk Transfer para que pueda ver lo que una cámara externa ve, pero en lugar de mostrarlo en mi tableta?

Cámara: Canon Powershot A1300 Tablet: Iconia A200

He mirado alrededor del desbordamiento de la pila y de algunos otros foros pero todavía no he podido encontrar una buena explicación sobre cómo utilizar la transferencia a granel o qué constantes utilizar como parámetros para recuperar ciertos datos.

Puedo ver los extremos y establecer una conexión con la cámara externa, pero no sé a dónde ir desde aquí.

Cualquier ayuda es muy apreciada.

Las API de Host USB en Android son bastante delgadas, por lo que quiero decir una vez que han ido más allá de la enumeración de las interfaces / puntos finales y la creación de una conexión que no hace mucho más para ayudarle. Usted está entonces en el ámbito de la comunicación con las transferencias de datos en bruto USB, cuyo formato depende de la clase de dispositivo de su cámara representa. Su solicitud es un poco una lata de gusanos, por lo que haré todo lo posible para proporcionar recursos útiles.

Desafortunadamente, los dispositivos de almacenamiento y medios de comunicación no son las clases de dispositivos más simples de interpretar, por lo que puede ser difícil si usted está recibiendo los pies mojados en USB en general. El mejor consejo que puedo dar es echar un vistazo a las especificaciones de clase del dispositivo para la clase de interfaz de sus informes de cámara (la mayoría son de almacenamiento masivo o MTP), que se puede encontrar aquí: http://www.usb.org/developers / Devclass_docs

El documento spec enumerará los comandos que debe utilizar para comunicarse con el dispositivo. También recomendaría revisar USB En una cáscara de nuez, que hace un gran trabajo de señalar cómo se construyen las solicitudes USB en general, lo que puede ayudar a asignar lo que se ve en la especificación docs a los parámetros encontrados en los métodos de UsbDeviceConnection : http://www.beyondlogic.org/usbnutshell/usb1.shtml

Es probable que haya un puñado de comandos de control que necesite enviar al "punto final 0" inicialmente para configurar la cámara y, a continuación, las transferencias restantes probablemente tendrán lugar sobre los puntos finales masivos.

En términos de Android, las solicitudes de control sólo se pueden enviar de forma síncrona utilizando UsbDeviceConnection.controlTransfer() , lo que significa que este método se bloquea hasta que la transferencia se haya completado. Los parámetros que rellenan este método se encuentran en los documentos de especificaciones para su clase de dispositivo.

Las solicitudes en puntos finales masivos se pueden enviar de forma síncrona a través de UsbDeviceConnection.bulkTransfer() O de manera asíncrona utilizando una instancia UsbRequest . Con UsbRequest puedes UsbRequest cola una transferencia y luego comprobar de nuevo (a través de UsbDeviceConnection.requestWait() ) para los resultados.

Tengo algunos ejemplos en mi página de Github en usar las APIs del anfitrión para hacer algunas transferencias básicas de la interrupción y del control para conseguir la información como descriptores del dispositivo. Tal vez algunos de los que le serán de ayuda también: https://github.com/devunwired/accessory-samples


Con respecto a su pregunta sobre el código de ejemplo USB:

La solicitud hecha en este código es sólo una petición genérica de "Get Configuration Descriptor" a la que todos los dispositivos USB deben responder (es un comando básico, no específico de la clase). De hecho, es la solicitud donde las API de Android obtienen la información que puede consultar para interfaces y puntos finales. Los valores de campo provienen de la Especificación USB Core (este comando se define específicamente en la sección 9.4.3 y 9.6.3 en la especificación 3.0): http://www.usb.org/developers/docs/ o una descripción más útil que usted Puede encontrar desde USB en una cáscara de nuez, que tiene un poco más de discusión: http://www.beyondlogic.org/usbnutshell/usb5.shtml#ConfigurationDescriptors

La longitud es algo arbitraria, esto le dice al conductor cuántos bytes para leer o escribir. La mayoría de los controladores de host USB consultarán primero el descriptor del dispositivo, que incluye un campo que indica al host el tamaño máximo de paquetes que admite el dispositivo y, a continuación, usará ese tamaño como longitud para solicitudes futuras. Un controlador con todas las funciones probablemente haría este comando y verificará primero los bytes de longitud (el campo wTotalLength del descriptor) para ver si el búfer era lo suficientemente grande y modificar / reenviar si no. En el ejemplo, escogí 64 por simplicidad porque ese es el "máximo" tamaño máximo de paquetes que el protocolo define como soportable.

Una vez más, a continuación, hacer las solicitudes de los datos específicos de su dispositivo tiene para ofrecer, esos comandos se encuentran en el documento de clase específica, no la especificación de núcleo.

  • Interfaz USB en Android
  • No se puede depurar Android: este dispositivo no se puede iniciar. (Código 10)
  • Compila y enlaza contra libusb para android
  • ¿Conexión USB host-a-serie Android?
  • Android Tablet no puede encontrar el dispositivo USB a través de puerto USB, pero puede a través de OTG cable
  • Cómo enviar un mensaje de Android a Windows mediante USB
  • Acceso a los formatos FAT32 y NTFS USB Pendrive de la tableta android
  • ¿Cómo puedo comunicar un accesorio para Android con un puerto serie USB?
  • ¿Cómo instalo el controlador USB para Nexus One en Windows 7 con fines de depuración?
  • USB Accessory API en el Samsung Galaxy S2 Android
  • Android: Comunicación con un dispositivo USB que actúa como host
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.