hombre: Hola. Hola y bienvenido a la
charla sobre accesorios abiertos de Android. Um, me alegro que todos hayan venido.
[aplausos y aplausos] Hombre: Bienvenidos
a la charla secreta. Entonces, como escucharon
en la conferencia magistral de esta mañana, hemos estado trabajando mucho
en Android, para hacerlo más abierto y permitir que los
usuarios y desarrolladores utilicen más y diferentes
periféricos interesantes, más USB. Entonces, ya sabes,
anteriormente con Android, ya sabes,
el dispositivo Android admitía una cierta cantidad de, um,
interfaces. Puede conectarse a él
como un dispositivo de almacenamiento masivo USB. Podrías conectarte a él, eh, para ejecutar Android Debug Bridge,
etc. Uh, pero ahora hemos ampliado
esas capacidades con nuevas API, um, y nuevas capacidades para conectar accesorios y conectarse a, uh,
periféricos de dispositivos USB en modo host tradicional. Así que realmente voy a
comenzar esta charla. Um, debería presentarme. Mi nombre es Jeff Brown. Soy miembro
del equipo de marco de Android. Y este es Mike Lockwood. También es miembro
del equipo del marco de Android. Y Erik Gilling
del equipo de sistemas Android.
Entonces voy a… voy a hablar sobre, um,
dispositivos de entrada. Tenemos USB, que, ya sabes, modo host USB,
lo que significa que ahora tenemos acceso a todos los
periféricos USB estándar e interesantes a los que estás acostumbrado en una PC. Así que tengo
un teclado USB aquí y un mouse USB. Estos son…
son inalámbricos y, con suerte, funcionan.
[risas] Y, um,
actualmente están conectados, uh, los… los dongles están conectados
a un concentrador USB estándar.
Está bien, ya sabes, más o menos
lo que esperarías. Tenemos un teclado USB. Deberíamos poder
usarlo para escribir. Muy bien, tengo
la aplicación AK Notepad de Android Market. Solo usaré esto
como un editor de texto básico. Muy bien, teclado. Me encanta Android… más o menos.
[risas] Brown: Bueno,
definitivamente me encanta Android. Brown: Um, entonces tienes un…
entonces tienes un teclado. Así que puedes hacer
todas las cosas básicas que esperarías hacer
con un teclado, ya sabes, controlar-C,
copiar, pegar, todo eso.
Um, ayudaría si realmente
pudiera ver lo que estoy haciendo. Ahí estamos.
Es un teclado. Um, también tenemos un ratón. Entonces tienes el cursor del mouse
dando vueltas. Um, admitimos la rueda de desplazamiento y hay nuevas API
que las aplicaciones pueden usar para escuchar eventos de desplazamiento
del mouse y eventos de desplazamiento. Esto se implementa en todos los
widgets del marco estándar, por lo que puede desplazarse por las listas. Um, también puedes desplazarte
por las páginas del navegador web. Entonces, ahora que tienes, ya
sabes, un teclado y un mouse, y puedes conectar tu tableta a una pantalla HDMI, ya no necesitas
tu computadora portátil. Otra cosa de la que
quiero hablar , que se mencionó
durante la conferencia magistral, es que también admitimos
controladores de juegos. Um, ahora tenemos nuevas API
para… para joysticks.
Um, hay una nueva devolución de llamada
que puedes usar: puedes registrarte en tus vistas
llamada onGenericMotionEvent, y expone todos los diversos
ejes del joystick que existen
en un controlador de juego. Um, también funciona con
palancas de vuelo y otras cosas así. Uh, tenemos más de 30
ejes diferentes conectados, um, incluidos, ya sabes, los
controles del acelerador. Si tienes un
equipo para conducir automóviles, eso funciona.
Um, el mouse de posicionamiento 3D
es como un joystick. Sólo tiene seis ejes. Um, entonces puedes…
también puedes escucharlos en tu aplicación. Así que les mostraré
muy rápidamente una muestra de demostración de API simple. Ya viste esta mañana
el joystick usado para ejecutar "Quordy". Um, pero tenemos una pequeña muestra que está en el SDK de Honeycomb 3.1, um, que demuestra todos los datos
que se pueden obtener de un joystick. Entonces, en el panel izquierdo, tenemos una lista de ejes. Hay algunas API nuevas
que puedes usar para enumerar los dispositivos de entrada
que están presentes en el sistema y consultar las capacidades, consultar los ejes que están
disponibles en los joysticks, consultar los botones
que están disponibles y sus rangos. Y a la derecha tengo un juego muy sencillo
basado en la física. [risas] Entonces, um, de todos modos, eso es…
Eso es todo
para los dispositivos de entrada por ahora. Y le pasaré la palabra
a Erik Gilling,
quien les contará más sobre cómo funciona realmente el USB y qué
podemos hacer con él. Gilling: Gracias, Jeff. Muy bien, tenemos
dos accesorios más realmente interesantes
de los que hablar, pero para apreciar realmente
la diferencia entre ambos,
quiero sentar las bases al ponernos a todos
en la misma página sobre cómo funciona el USB.
desde un nivel muy alto. Um, en USB, hay un host y una colección de dispositivos.
Es importante saber que
el anfitrión siempre está a cargo. Tiene que realizar un seguimiento
de cuándo se conectan y desconectan cosas y qué tipo
de cosas hay allí. Inicia toda la transferencia de datos. Entonces el anfitrión siempre está a cargo. La forma en que el host realiza un seguimiento
y descubre qué tipo de dispositivos
están conectados es cuando se conectan,
lee una lista de descriptores.
Ahora los descriptores
son un formato estándar , en la especificación USB de, ya sabes,
un montón de tipos diferentes. Son jerárquicos.
Entonces, comience con: cada dispositivo
tiene un descriptor de dispositivo. Esto describe quién lo hizo, qué tipo de producto es, si es una
clase estándar de dispositivo o
un dispositivo específico del proveedor, y un par de cadenas que
puede mostrar al usuario. Un dispositivo puede tener
más de una configuración, aunque en la mayoría de los dispositivos Android
solo verás una. Uh, y solo puedes estar en
una configuración a la vez. Ahora una configuración
tiene una lista de interfaces, y aquí es donde las cosas se
ponen interesantes. Las interfaces generalmente se emparejan
uno a uno con un controlador
en su sistema operativo. Entonces puedes pensar en una
combinación de mouse y teclado con, como, un panel táctil
en tu teclado.
Cada uno de ellos será
una interfaz separada. Ambos serán dispositivos de entrada y cada uno tendrá una instancia a
la que conectó el controlador de entrada. Y luego una interfaz se compone
de varios descriptores. Y ahora aquí es donde sus datos
comienzan a moverse. Tienen cuatro tipos diferentes. Tienen una dirección. Tienen un tamaño de paquete máximo. Um, y… sí,
entonces tenemos cuatro… nuestros cuatro tipos diferentes. El control se utiliza principalmente para acceder a esos descriptores,
agregar enumeraciones, cuando se coloca un dispositivo, se interroga al dispositivo y se
configura. Puede tener algunas
solicitudes de control específicas del proveedor. Uh, a granel, que son
realmente los caballos de batalla del USB. Uh, puede enviar solo datos masivos de tamaños bastante grandes
hacia adentro o hacia afuera, solo una dirección por punto final. Si desea hacerlo bidireccional,
necesita dos puntos finales.
Luego está la interrupción,
que es muy similar a los puntos finales masivos. La única diferencia aquí es que son encuestados con
mucha más frecuencia, recordando que el anfitrión
siempre tiene el control. Cada transferencia de datos la
inicia el host, por lo que no querrás enviar
muchos datos a través de ellas. Pero para cosas
como tus dispositivos de entrada ( teclados, ratones, joysticks)
usan la interrupción para que cuando presiones
ese botón para matar a tu amigo en "Quake", realmente suceda a tiempo. Y luego los isócronos, que se utilizan para cosas
como el audio. Es realmente complicado
lidiar con ellos y olvídate de ellos ahora.
Brown: [risas] Gilling: Entonces, como dije, tenemos
dos tipos diferentes de API accesorias en el futuro.
Para hablar sobre el primero,
el modo anfitrión, se lo dejaré
a Mike Lockwood. Lockwood:
[hablando indistintamente] Estoy aquí en, eh, en Google. Um, tenemos dos nuevas API,
um, para USB en Android 3.1. La primera de la que
hablaré es la API de host, y esto es para dispositivos Android que tienen soporte de host USB. Um, no servirá de nada en dispositivos que solo actúan
como dispositivo. Um, y esto se puede usar para escribir aplicaciones
que puedan comunicarse con periféricos estándar diseñados para una PC. O podría desarrollar
nuevas piezas de hardware que,
específicamente para Android , y usar estas API
con eso.
Lockwood: Um, entonces la API tiene
varias clases nuevas. Um, los primeros tres corresponden
directamente a algunos de los descriptores de los que
Erik acaba de hablar. Hay una clase de dispositivo USB
que tiene el ID del proveedor
y el ID del producto. Um, primero… ya sabes,
cuando se conecta algo, lo miras y dices: "Esto es algo con lo que
me interesa hablar".
Y puede hacerlo basándose
en el ID del proveedor y el ID del producto o quizás en función de la
clase, subclase y protocolo del dispositivo, que normalmente se utilizan
para definir tipos estándar de cosas,
como ratones, teclados, cámaras, etc. donde realmente no sabes
cuál es el fabricante, te importa cuál es el fabricante, pero te importa
más la funcionalidad que tiene. Um, y luego desde
la clase UsbDevice puedes obtener una lista
de las interfaces, y eso también puede tener una clase,
subclase y campo de protocolo que podrían interesarte.
Y luego, finalmente,
desde la interfaz, obtienes una lista
de las puntos finales. Y los dos que nos interesan aquí
son los
tipos de punto final masivo e interrupción. Ese es el tipo que
normalmente usarías. Um, cada uno de estos
tiene una dirección específica. Ya sabes, si quieres
hablar en ambas direcciones, debes tener un punto final
en la dirección de salida, lo que significa, de PC a dispositivo
o de host a dispositivo, y luego de entrada
es del dispositivo a host. Um, y luego dos clases más… um, las
clases UsbDeviceConnection y UsbRequest.
Um, UsbDeviceConnection
es como un descriptor de archivo
cuando abres… es algo que usas que… cuando abres el dispositivo
, esto te permite comunicarte y enviar datos de un lado a otro
a través de los puntos finales. Otra cosa importante
es la reclamación y liberación de interfaces. La pila USB en Linux tiene la noción
de reclamar una interfaz, lo que significa que estás
hablando específicamente con esa interfaz en el dispositivo USB,
por lo que no tienes dos programas intentando comunicarse con el mismo
hardware al mismo tiempo. . Um, y luego tenemos soporte para
comunicación sincrónica y asincrónica. Um, para
comunicación asincrónica, tenemos la clase UsbRequest, y eso simplemente encapsula una,
um, una solicitud, ya sea para enviar o recibir datos
a través de un punto final en particular. Lockwood: Um, entonces voy a
repasar rápidamente un código de muestra aquí. Um, esto… este es un código que básicamente obtiene
el dispositivo USB y decide: ¿
puedo hablar con esto? ¿ Dónde están los puntos finales
con los que quiero hablar? Entonces, primero, podría mirar
el ID del proveedor y el ID del producto y ver si coinciden con
algunos valores que me interesan.
Luego busco
la primera interfaz en el dispositivo. Digamos que debería esperar
dos puntos finales, luego digo cuál es
la dirección de entrada y cuál es
la dirección de salida. Luego, finalmente, consigo el EP
y el EP, o los dos puntos finales, los dos puntos finales masivos
de los que quiero hablar. Lockwood: Y luego,
una vez que tengo eso, hay varias formas
de comunicarse con el dispositivo,
dependiendo de si lo está haciendo sincrónico
o asincrónicamente y de qué tipo de punto final
está hablando. Um, hay una llamada:
UsbManager openDevice le brinda
UsbDeviceConnection. Una vez que hagas eso, querrás
reclamar la interfaz. Um, y luego a partir de ahí,
hay varias cosas diferentes que puedes hacer.
Ahí está la transferencia de control. Es para enviar o recibir
solicitudes en el punto final cero. Erik mencionó que
normalmente se usa para la enumeración y determinar qué hay
disponible en el dispositivo.
Pero también se puede utilizar
para algunas extensiones, ya sea para un proveedor en particular
o una clase particular de dispositivo. Puedes enviar y recibir, um, tus propios comandos allí. Um, y la llamada de transferencia masiva…
hay… esta es una llamada sincrónica. Puede transmitir el punto final,
el búfer, el tamaño del búfer y el tiempo de espera, y enviar o recibir
datos de forma sincrónica. Y la dirección, ya sea que
esté enviando o recibiendo, está determinada por la dirección
del punto final. Y finalmente, las
solicitudes asincrónicas, eh, son buenas si desea
obtener un mayor ancho de banda en los puntos finales masivos y
poner en cola varias solicitudes. En lugar de esperar
a que una termine antes de comenzar la siguiente, puede poner en cola
varias solicitudes y sus solicitudes, um,
y luego esperar a que , um, se
completen, ya sea enviándolas o recibiéndolas. Y también, si está interesado
en escuchar las interrupciones de algo como el teclado, donde presiona un botón
y sucede algo, eso
sucederá de forma asincrónica, por lo que pone en cola una solicitud
y luego simplemente espera…
Simplemente espera
hasta que suceda algo. , y obtienes el USB:
el objeto UsbRequest, um, se devuelve
cuando se hace. Y creo que eso cubre las API del host. Y le devolveré la palabra
a Erik… Gilling: ¿Hacer la demostración? Lockwood: para hablar
ahora de accesorios. Gilling: ¿Demostración?
Lockwood: Oh, la demostración. Dios. Gilling: La demostración…
tienes que hacer la demostración. Lockwood: Mira, es por eso que
no me dejan salir muy a menudo para hablar en público.
[risas] Lockwood: Entonces…
Gilling: [risas] [aplausos] Lockwood: Y esto, um,
es una pieza estándar de equipo de oficina que muchos de ustedes probablemente tengan
en su oficina.
También la segunda razón por la que
no me dejan salir muy seguido, porque termino
haciendo cosas así. Entonces, este es
un lanzador de misiles USB que puedes conseguir en varios
sitios web excelentes. Um, y está diseñado
para una PC. Hay una aplicación de Windows
que lo ejecuta, pero resulta que el protocolo
con el que se comunica es bastante simple. Entonces tengo
una tableta Android aquí con soporte de host.
Lo voy a enchufar. Lockwood: Y aparece
un cuadro de diálogo que dice: "¿Quieres ejecutar
la aplicación de lanzamiento de misiles para hablar con este dispositivo?" Haga clic en "Aceptar" y… tengo, este es un ejemplo
de mi diseño de interfaz de usuario. Así que lo conecté
al acelerómetro, incliné la tableta y el lanzador de misiles
comenzó a girar. [risas] Lockwood: Eleve
un poco la trayectoria aquí. Y luego hay un botón
llamado "¡Fuego!" [risas]
Lockwood: Ahí vamos.
[aplausos] Lockwood: Después de esto,
quiero conseguir un trabajo en los juegos de baloncesto disparando las camisetas
al público. [risas] Lockwood: Um, está bien,
ahora se lo devolveré a Erik,
ya que me quedé sin misiles. Gilling: [risas]
Gracias, Mike. Gilling: Muy bien, entonces, ya sabes, Jeff te mostró
algunos aportes interesantes y repasó
un poco cómo llegó a jugar
en el tiempo de la empresa.
Mike acaba de mostrarte
cómo consiguió comprar juguetes durante el tiempo de la empresa. Pero es posible que algunos de ustedes hayan visto
un juguete grande arriba. Creo que no es
un juego ni nada parecido, pero si lo fuera, estaba ganando.
[risas] Gilling: Esto nos lleva
a los accesorios abiertos de Android, de los que hablamos
en la conferencia magistral. Ahora bien, no todos los dispositivos Android
tienen modo host. De hecho, muy pocos
dispositivos Android tienen ahora el modo host. Esperamos que más personas lo hagan, pero ¿qué pasa con el resto
de los robots? Bueno, todo dispositivo Android que sea compatible con CTS debe tener ADB, lo que significa que debe ser
un dispositivo USB.
Así que demos la vuelta al paradigma
. ¿ Y si el accesorio
es el anfitrión? Bueno, eso es exactamente
lo que hemos hecho con el Accesorio Abierto. Es un protocolo USB simple. El accesorio es el anfitrión y proporciona energía… [se aclara la garganta] Sí. De todos modos… [risas] De todos modos, a diferencia de Mike y de Jeff, no puedo salir
y no puedo comprar uno de estos. Aquí es donde entra en juego ADK. Es una placa sencilla. Está basado en Arduino
con algunos circuitos USB. Gilling: Aclaremos un poco
el tema. Gilling: 4,3.
Ahí vamos. Gilling: Parece que nos
falta un cable USB.
Nunca temas. [suspiro] Muy bien, entonces tiene
un tablero simple. Tiene el protector de host USB
integrado. Y además hemos creado
nuestro propio pequeño escudo de Google. Esto tiene una E/S muy divertida. Tiene algunos botones.
Tiene un joystick. Incluso le hemos incluido un pequeño servo. Y, al igual que
con un accesorio anfitrión, puedes ver que una vez que lo emparejamos
con un dispositivo, notarás que
estoy usando el Nexus S, que ejecuta nuestra última
versión de Gingerbread, que hemos impulsado. afuera. Esto no tiene soporte de host, por lo que no puede escribir
un periférico de host para esto. Ahora voy a conectar
la conexión USB. Y se abre el mismo diálogo básico que vio con los periféricos del modo host
.
Nos permite iniciar una aplicación. Gilling: Ahora ya lo sabes, esta es
una aplicación de demostración bastante sencilla. Um, mis habilidades de diseño de UI no son mejores
que las de Mike Lockwood, pero engañé a
uno de nuestros amables diseñadores de UI para que hiciera que esto se
viera bonito para nosotros, así que… Uh, puedes ver, ya sabes, tenemos una Un montón de E/S que
van desde la placa al dispositivo.
Si vamos a la pestaña "Salida", puedes ver que tenemos un montón de datos en dirección contraria. Oh, el verde
no es particularmente bo… ambos verdes son un poco aburridos. Uh, y también tenemos algunos relés en el tablero aquí, que puedes encender y apagar. Y lo que es muy divertido
son algunos servos. Ahora tomé
este pequeño servo… y lo puse dentro de
una de estas pequeñas figuras de Android
que todos conocemos y amamos. Entonces, ya sabes, Android también te ama. ¿ Por qué no saludas
a todos, Android? [voz aguda] Hola. [risas] Gilling: Entonces,
el código fuente para esto, los diseños de la placa, el firmware y la aplicación ya están disponibles y publicados en accesorios.android.com. Ahí está la aplicación para tableta.
Gilling: Entonces, para ser
uno de estos periféricos, no es necesario ser un ADK. Esto es sólo una muestra. Microchip tiene
un kit de desarrollo. Otras personas están saliendo
con kits de desarrollo. Puede hacerlo con su propio
hardware personalizado, siempre que sea un anfitrión, y pueda proporcionar la potencia especificada por USB
, que es de 500 miliamperios a, eh, 5 voltios.
Establecerse…
es bastante simple. Um, tú, uh… Cuando obtienes un evento de conexión en caliente, necesitas interrogar
el dispositivo USB. Y le envía una de estas
solicitudes de control específicas del proveedor de las que hablamos. Éste se nos ocurrió; lo llamamos
versión "Obtener protocolo". Y simplemente le devuelve
un número de versión. Ahora, si le devuelve
un número de versión, su dispositivo Android es compatible con
el protocolo Open Accesorio. Si no es así, no es así. Una vez hecho esto,
envía datos para identificar su periférico. USB tiene toda esta información, todo este procedimiento sobre cómo identificar
un dispositivo USB en el host, pero en realidad no hay nada
al revés.
Así que tuvimos que inventar
un procedimiento para hacerlo. Realmente… envías
tu información básica y simple: quién eres,
qué eres y dónde conseguir software
para ello. Haces eso y luego dices:
"Está bien, estoy listo para comenzar". Ahora bien, esto es un poco complicado. En este punto,
su dispositivo Android se desconectará del bus USB. Uh, y volverá a encenderse como un dispositivo específico de Google. Tiene nuestro ID de proveedor de Google y un ID de producto muy específico.
Una vez que veas uno de estos, sabrás que
estás en modo accesorio. Ve a buscar en
esos descriptores USB. Encuentra su primer punto final masivo de "entrada" y su primer
punto final masivo de "salida". Recuerde,
esos son los caballos de batalla. Aquí es donde
pasan tus datos. Estableciste tu configuración en 1 y ahora estás listo para comenzar. Obtendrá
el mismo diálogo que vio y podrá tener
una comunicación bidireccional a través de la aplicación. Entonces, ¿cómo te comunicas
con la aplicación? Le devolveré la palabra
a Mike "API" Lockwood y él les informará.
Lockwood: [risas] Lockwood: Bueno, en realidad
tenemos dos versiones diferentes de las API accesorias.
Um, esto es
un poco confuso, pero lo hicimos para poder
tener soporte para accesorios tanto en
Android 3.1 y posteriores como también en Gingerbread. Entonces, en Android 3.1, tenemos un nuevo paquete
llamado android.hardware.usb, y se usa tanto para
el host como para las API accesorias. Um, si sabes
que tu aplicación será Honeycomb 3.1 o posterior,
esto es lo mejor que puedes usar. Um, esto es en 3.1,
que saldrá hoy en Xoom y estará en otros…
otros dispositivos. Um, también queríamos que
esto funcionara en teléfonos como el Nexus S aquí. Entonces tenemos una
biblioteca de compatibilidad. Es un paquete diferente. Las API son casi
exactamente las mismas, um, pero como no pudimos agregar
ninguna API nueva a Gingerbread, debe vincularla a
esta… esta biblioteca. Y, por supuesto,
esta biblioteca también existirá en futuras versiones
de Android, por lo que puede usarla si desea
admitir Gingerbread en el futuro.
Y si tienes un Nexus 1
o Nexus S con la última actualización, has estado caminando en secreto
con esto en tu bolsillo
durante las últimas dos semanas sin darte cuenta. Um, entonces hay
un par de pasos aquí. Primero, debe realizar
la conexión entre el hardware
y su aplicación. Esta API
es básicamente una tubería directa desde su aplicación
al hardware. Um, y la forma en que hacemos esto es que hay algunos
metadatos adicionales que adjuntas a tu aplicación
a través del manifiesto que describe
el tipo de, um, accesorio con el que deseas hablar.
Y, um, cuando algo
se conecta, el administrador de USB dirá,
bueno, tengo esto… esto… ya sabes,
este nombre de fabricante, este nombre de producto
y esta versión, y lo revisará y vea
qué aplicaciones hay disponibles que hacen eso. Y luego aparece el diálogo
que surgió en el que yo… también suceden cosas muy similares
en la API del host que cuando conecté
el lanzador de misiles. Estamos haciendo
lo mismo. Según lo que se conecta, decimos qué aplicaciones están disponibles
para hacerlo. Luego, finalmente,
una vez que el usuario hace clic en "Aceptar", también puedes decir que
siempre uses esta aplicación, para que no te siga preguntando
una y otra vez. Um, si tienes una actividad
que comenzó con un accesorio USB
conectado al intent. Y adjunto a eso
hay información sobre el accesorio con el que puede
comunicarse. Y finalmente, hay
otro intent que se envía cuando te desconectas. Um, aquí hay
una especie de ejemplo rápido de lo que pondrías
en tu manifiesto. Tienes que tener una actividad
que se registre para la intención del accesorio USB
adjunto.
Y luego hay
una cosa de metadatos que básicamente enlaza
con un archivo XML separado que describe con qué accesorio
o accesorios puedes hablar. Y el archivo… ese archivo XML
se vería así aquí. Hay un accesorio USB y puedes decir, "fabricante
'Acme Corporation', modelo USB Anvil, versión 1.0". Um, si omites
la versión, entonces sería
como un comodín para cualquier versión en particular. Um, lo mismo con el modelo…
si quisieras… si quieres trabajar con
algo de Acme Corporation, puedes omitir los otros dos. Y puede enumerar
varias aquí si tiene una aplicación
que puede funcionar con varias cosas diferentes.
Es bastante flexible.
Um, y luego hay
dos clases. La API es muy simple,
especialmente, ya sabes, en comparación con
las API del host, hay muchas más funciones
en el lado del host que en el lado del dispositivo,
por lo que este lado es bastante simple. Hay una clase UsbAccessory que, um, describe
todos los campos de cadena que se pasan
desde el hardware hasta el marco
que identifica lo que es: Fabricante, Modelo. Uh, la descripción visible para el usuario
es lo que mostramos en el cuadro de diálogo
cuando se conecta algo. La versión. Hay una URL que
puede utilizar para dirigirse a su sitio web, al que puede acceder para obtener
información sobre el accesorio o descargar la aplicación. Um, y luego también hay
un número de serie, que es opcional,
pero si su aplicación realmente quiere…
necesita realizar un seguimiento de piezas
de hardware específicas individuales, puede crear su
número de serie único aquí.
Y es el Fabricante,
Modelo y Versión los que se tienen en cuenta para elegir la aplicación
del accesorio. Um, y luego está
la clase de administrador USB, que se usa tanto para las
API del host como para las accesorias. Las llamadas relacionadas con accesorios obtienen una lista
de los accesorios adjuntos. Ya sabes, en este momento
solo puede haber uno, ya que solo hay un puerto USB
en esos dispositivos, pero tal vez eso cambie
en el futuro.
Open Accesorio le ofrece
un descriptor de archivo personal, que es una clase de Android que encapsula
un descriptor de archivo que puede traspasar los
límites del proceso
con Binder. Y luego, desde allí,
puedes, ya sabes, hablar con el accesorio. Luego también hay un par de llamadas para obtener permiso para hablar
con el hardware. El usuario, por ejemplo, el usuario no hace clic en "Aceptar", pero luego
inicia la aplicación y desea conectarse
al hardware, puede usar estas API para
recuperar ese diálogo, um, para obtener permiso
para hablar con el hardware, um, lo que plantea una diferencia interesante
entre cómo funciona esto
y muchas otras cosas. No hay ningún permiso que usted ponga
en su manifiesto. Para la cámara, tienes que decir que esta aplicación
habla con la cámara o que esta aplicación quiere hablar
con el GPS.
Um, y para USB, no tenía
mucho sentido, porque no quieres
decir que esta aplicación puede comunicarse con cualquier dispositivo USB posible. Entonces, en cambio, se
elige dinámicamente. Cuando el usuario hace clic
en el diálogo, dice que esta aplicación puede comunicarse
con este hardware, pero no tiene acceso
a todos los dispositivos. Es una especie de
sistema de permisos más detallado y dinámico. Y finalmente aquí… aquí está la muestra
de cómo tú, ya sabes, hablas
con el accesorio en sí. Cuando comience,
comenzará con la
intención adjunta del accesorio.
Puedes llamar a getIntent
desde tu actividad para obtener la intención. Um, y luego está
la función auxiliar aquí que saca el
objeto accesorio USB de la intención. Esto es necesario
para la API de compatibilidad. Um, la API 3.1,
puedes simplemente llamar a la intención, getParcelableExtra, para obtener
el objeto directamente de esa manera. Um, luego llamas a openAccessory para obtener el
descriptor del archivo parcelable. getFileDescriptor le proporciona
un descriptor de archivo estándar. Luego obtienes un flujo de entrada
y un flujo de salida al abrir el descriptor de archivo. Y luego puedes simplemente leer
y escribir datos usando flujos de entrada y salida. Básicamente, el accesorio
parece una lima. Y en realidad debajo, es… el descriptor de archivo
simplemente te da, uh, un archivo que… directamente al controlador del kernel
que se comunica con el hardware.
Básicamente, lea y escriba
como un archivo normal y estará enviando y recibiendo
datos a su hardware. Y luego, a partir de ese nivel,
depende de ti. No hay ningún protocolo definido. Es solo enviar
y recibir bytes. Puedes inventar
tu propio protocolo, hacer lo que quieras.
Y, um, depende de ti. Entonces, le daré la palabra
a Erik, quien tiene una cosa más
que decirnos a todos. Gilling: Muy bien,
bueno, si sentías que nos estábamos apresurando en esto, en cierto modo lo
estábamos, porque puedo decir que todos están
entusiasmados con esto y queremos dejar suficiente
tiempo para preguntas. Pero creo que, ya sabes,
hay una pregunta que
todo el mundo tiene en mente, que es la misma que CNET, ya
sabes: "¿Cuándo vamos a hacer que
esto esté disponible?" Bueno, al menos para todos
en esta sala, tenemos 180K
para cada uno de ustedes.
[aplausos y aplausos] Gilling: Bueno, aplauda
también a todos los que hicieron que esto funcionara. Ahora no sólo tenemos
la placa que está aquí, sino que también te proporcionamos dos servos y todos los cables que necesitas. Así que quiero que salgan y fabriquen los próximos, mejores y
mejores accesorios para Android. Y ahora lo abriré
a preguntas y respuestas. [aplausos] Gilling: Sólo levántense. Sí. Entonces, si todos
tienen alguna pregunta, ¿ podrían por favor ir al micrófono
al otro lado del pasillo? y de esa manera, la grabación
también podrá recibirlo. hombre: Erik, ¿cuándo
recibirán las tablas? Gilling: ¿Cuándo
recibirás las tablas? Ah, pregunta muy importante.
hombre: [risas] Gilling: Uh, recibirás
una tarjeta cuando salgas por la puerta, uh, y luego puedes llevarla
a donde conseguiste tu tableta
, tu camisa y todo, y puedes cambiarla por una. de estos…
tubos blancos y verdes fríos. Sí. hombre: [hablando indistintamente] Gilling: Oh, ¿podemos poner
el micrófono por aquí? hombre: Esta mañana recuerdo
haber mencionado Bluetooth.
¿ Cómo será la APA
para eso? Gilling: Bueno, en este momento, tenemos un
soporte Bluetooth basado en RFCOMM bastante rico , por lo que no hay ETA para extender esta API
a eso. Sin embargo, está
bajo consideración. Brown: Bueno, en realidad, quiero decir,
ya existe una API de Bluetooth bastante rica, um, pero en términos
de dispositivos de entrada humana, el mismo soporte para USB
también funciona con Bluetooth, por lo que debería poder usar Bluetooth MySQL. teclados
y joysticks. Gilling: Y está aquí J.K.,
que es nuestro encargado de Bluetooth. Levántate y luce avergonzado. [risas]
[aplausos] Gilling: ¿
Tiene algo que agregar? J.K.: [hablando indistintamente]
Gilling: ¿Lo siento? J.K.: [hablando indistintamente]
Gilling: Muy bien. hombre: Entonces mencionaste que
el costo del administrador USB solo era compatible
con un dispositivo a la vez, pero antes
trabajabas con el teclado
y el mouse, etc., entonces, ¿estaba
disponible para ti o para mí? ¿
Entendiste mal algo? Lockwood: Bueno,
es un poco confuso, porque tenemos
soporte para host y soporte para accesorios.
Con soporte de host, como una PC, puedes conectar varias cosas
a una PC con mucha facilidad. El soporte de accesorios
es donde, um, estás hablando con… a
través de… esta conexión aquí,
que no es host, por lo que solo se puede conectar
a una cosa a la vez. Entonces, tal vez en el futuro,
si construimos un teléfono con múltiples puertos
en la parte inferior o algo así, habrá una manera de hacerlo, pero ahora mismo,
es solo uno a la vez para el lado de los accesorios. hombre: Entonces digamos que
quería hacer algo como un osciloscopio donde esa, uh,
tasa de datos bastante alta, tasa de muestreo que se necesitaba,
una gran cantidad de datos ingresando, um, ¿puedo hacer eso con…
con el modo masivo? ¿ O necesitaría este
modo isócrono de pesadilla para hacer eso? Brown: [risas] Gilling: Uh, bueno, quiero decir,
hasta donde yo lo entiendo, no he tratado con
el modo isócrono antes…
Um, se trata más de
un ancho de banda garantizado y no de un ancho de banda tan alto. ,
entonces… Y todos los que conozco
que lo han usado han dicho que es un verdadero dolor de
cabeza. Así que primero seguiría
la ruta masiva y vería si funciona
para usted. hombre: ¿Pero ambos son compatibles?
Gilling: Ah, ¿el anfitrión? hombre: Ambos son compatibles
con las API de esto… Gilling: ¿
Admitimos isócrono? Lockwood: Ah, todavía no admitimos la
isócrona. Gilling: Muy bien, bueno,
hay otra respuesta a tu pregunta.
[risas] hombre: Gracias.
Gilling: Sí. Oh. hombre: Hola. Uh, durante la conferencia magistral, vimos algo sobre
tal vez cargar una aplicación desde el dispositivo USB.
Gilling: Correcto. Así que lo pasé por alto
y es culpa mía. Uh, una de esas cadenas
que su accesorio abierto, como parte del
protocolo de enlace de enumeración, envía a su dispositivo Android
es un URI, y puede ser una página web. Podría ser cualquier ubicación. Entonces, lo que debe hacer es, cuando
esté construyendo su dispositivo y cuando esté listo para
lanzarlo, colocar una URL que describa dónde
obtener el software.
Hombre: Quería ver si están familiarizados con
la placa IOIO y si esa es la misma especificación
y todo. Han estado…
Lockwood: Um… hombre: Preordenándolos
por un tiempo. Lockwood: Eso es
bastante diferente. Eso es usar ADB,
que ha sido… ADB es la herramienta que se usa para
depurar y trabajar con el SDK, y que está disponible
en todos los dispositivos Android. Um, pero no está habilitado
de forma predeterminada, y realmente no
garantizamos que vaya a existir en su forma actual
por siempre jamás, por lo que en realidad no se admite
el uso de ADB para estos fines, pero hasta hoy,
esa era la única manera de poder hacerlo.
Realmente hago
algo así, por eso IOIO
lo está usando. hombre: Entonces veré si puedo cancelar
mi pedido anticipado. Gracias. Gilling: No, no, no. De hecho,
puedo hablar un poquito más. Hemos estado en contacto
con esas personas, um, y… y fue… esto se
inspiró en parte en eso. Um, y no hay ninguna razón por la cual
su dispositivo IOIO, o yo-yo, creo que lo llaman,
no pueda hablar este protocolo. Así que mantenlo en orden.
Es un dispositivo genial. Lockwood: Sí, quiero decir, es… dependiendo de lo que
intentes hacer, si es para hackear
y para aficionados, está bien. Simplemente no quiero que la gente
construya, ya sabes, costosos artículos comerciales y de consumo
utilizando ADB en este momento. [risas]
Gilling: [risas] hombre: Gracias. hombre: Um, entonces el ADB…
o la placa ADK, um, está construido alrededor de
la plataforma Arduino. ¿ Supongo que estás lanzando
el firmware completo para eso?
Gilling: Sí, absolutamente. Como dije antes, el software
del lado de Android, el software
del lado de Arduino, los archivos de la placa, los diseños,
los esquemas, las bombas, todo está disponible
en accesorios.android.com. hombre: Impresionante.
Gilling: Sí.
Gracias. hombre: Entonces, USB On-The-Go ha sido compatible con tabletas
con Android por un tiempo. ¿ Significa esto que
ustedes no presionarán para introducir esto en el espacio de los teléfonos móviles en el
corto plazo? Es decir, ¿veremos un teléfono que
actúe como un host real, un host USB,
en los próximos dos años? Gilling: Así que ciertamente
no hay nada que pueda detener eso. Lockwood: Correcto. Um, sí, las API están ahí ahora
si un teléfono las admite. Realmente depende de los OEM. Creo que una de las principales
limitaciones es simplemente el poder. Quiero decir, si estás proporcionando
medio amperio a algo , los usuarios se confundirán
y pensarán, Oh, esto es genial,
hasta que se agote la batería, y
creo que esa es la principal preocupación.
Gilling: Está bien. hombre: Sí, me preguntaba sobre
la disponibilidad de API 12. Mencionaste que eso es
lo que necesitaremos usar. ¿ Cuándo será eso? Gilling: ¿Te refieres
desde la perspectiva del SDK? hombre: Sí. Gilling: Creo que el SDK
ya se lanzó, ¿no? Lockwood: Creo que
esto salió hoy. hombre: Está bien, gracias.
hombre: ¿Puede un dispositivo, un dispositivo Android
habilitado para host, comportarse como un d… como
un dispositivo accesorio que puede funcionar con el ADK? Lockwood: Si tiene
USB On-The-Go, entonces sí. hombre: Está bien.
Gilling: Sí. hombre: Um, ¿cuál es el tiempo de configuración para
establecer una conexión USB? Gilling: Eh, ¿un USB qué? hombre: ¿Cuánto dura el tiempo de configuración para iniciar
todo este apretón de manos? Gilling: Oh, ¿
todo el apretón de manos? Debido a que hacemos la remuneración,
lleva un poco de tiempo, pero solo ocurre una vez
en el complemento. hombre: No, pero ¿cuántos…
cuántos segundos? Gilling: N-no tengo
ese número. Lo lamento. hombre: Oh, está bien, porque la razón
por la que lo menciono es que parece que una solución
al problema de los múltiples accesorios es que si
tienes múltiples accesorios, simplemente se hace una especie de round robin sobre quiénes son, quién es el anfitrión
y quién es.
't. Lockwood: OOH.
Gilling: Eh… hombre: Pero eso depende de
un tiempo de preparación rápido. Gilling: Sí, suena
muy complicado y probablemente rompa
la especificación USB. hombre: Bueno, quiero decir,
en lo que respecta a lo complicado, no es peor que lo que
eran las netbooks Token Ring hace años, así que… Gilling: Bueno…
Lockwood: [risas] hombre: Para cualquier
accesorio personalizado de Android, habrá ¿Algún tipo
de proceso de certificación o algo que deba hacerse para obtener un sello de aprobación,
o no? Gilling: Uh, no tenemos
nada planeado. Creo que eso es…
es una característica, no un error. hombre: Genial.
[risas, aplausos] Hombre: Sí, normalmente
hemos visto que, eh, en el mundo sin Android era el LIBUSB el que
proporcionaría el tipo de interfaces que utiliza su aplicación de Android, el
espacio de Android.
Entonces, ¿tiene usted algún tipo
de LIBSEE biónico ahora? Uh, Bionic… Gilling: Está hablando
de LIBUSB. hombre: LIBUSB, lo siento. Brown: Oh,
no estamos usando LIBUSB. Gilling: Bueno, Mike… Mike puede
contarte todo sobre eso. Lockwood: Mmm, todavía
no escuché la pregunta. Gilling: Oh, estaba preguntando,
ya sabes, en un sistema Linux normal
tienes LIBUSB para hacer cosas de host USB.
Lockwood: Ah. Gilling: ¿Tenemos eso,
estamos usando algo diferente o tenemos una versión biónica?
Lockwood: Um, bueno, supongo que en Honeycomb
está… el kernel proporciona
el sistema de archivos USBFS. Es algo similar a LIBUSB que te brinda un CAPI, y luego el marco usa JNI
para, um, con las API de Java
además de eso. No estamos usando el mismo LIBUSB
que está disponible en las distribuciones estándar de Linux,
principalmente solo para licencia. Queríamos
una solución Apache 2 para eso. hombre: Está bien. hombre: Sí, solo quería
asegurarme de haber visto correctamente que los adaptadores USB Ethernet
serán compatibles. [risas]
Brown: [suspiros] Resulta que un par de ellos
funcionan ahora. [risas]
hombre: Sí. [risas] ¿ Hay alguna manera de que
podamos obtener esa lista? Brown: Pero no cuentan
con soporte oficial.
Gilling: Oh. Oh, sé exactamente a
qué te refieres. hombre: Sí. Gilling: Y es
al revés. En, digamos, como el Nexus S actual,
puedes hacer conexión, y tu Nexus S pretende ser un dispositivo USB Ethernet
para tu computadora portátil, es lo que teníamos en las diapositivas. hombre: Sí,
pero al revés, cuando estás en una demostración
y no quieres depender de la conexión inalámbrica
para hacer una demostración, por ejemplo, voz
o, ya sabes, reconocimiento de voz. y terminas recibiendo
un mensaje de "No se puede conectar". Gilling: Entonces, lo mejor que
puedo decir es que no hay soporte oficial
para eso en este momento. Lockwood: Sí, ahora mismo.
Puedes… puedes hacerlo si tienes acceso a la ruta.
Puedes, ya sabes, ejecutar ifconfig y abrir cosas
desde un shell de ruta. hombre: Y si estás haciendo una demostración,
te animo a que la hagas. Lockwood: El marco no
se da cuenta de que está ahí. Podría decir
"No hay conexión a Internet", pero en realidad está funcionando porque es una especie de
truco de bajo nivel, pero es posible que veas gente
haciendo eso en lugares como este donde el Wi-Fi no es tan confiable.
hombre: Ajá.
[risas] hombre: Está bien. hombre: Entonces, dos preguntas… Um, esto puede ser una pregunta tonta, pero, um, ¿esto afecta
en algo los requisitos de energía con respecto a tener que,
por ejemplo, agarrar los bloqueos de activación
mientras está en el modo USB? Lockwood: ¿En qué modo? ¿ Estás hablando del anfitrión
o del… o del accesorio? hombre: Um, tampoco.
Supongo que el accesorio. Lockwood: En el modo accesorio,
el teléfono probablemente se esté cargando sin conexión a
lo que esté conectado. En el modo anfitrión,
es al revés, desde donde el teclado
o el lanzador de misiles obtienen energía
de su dispositivo Android. Entonces es, ya sabes,
parte de la especificación USB. Quien tenga el host
tiene que ser una batería para el otro lado del cable. Gilling: Pero creo que también, a
lo que te refieres es específicamente al entorno, a mantener el dispositivo
y la pantalla despiertos.
No tomamos ningún
peso explícito: bloqueos de activación en ninguno de los lados del protocolo. Uh, entonces si tienes
una aplicación interactiva con la que no quieres que
la pantalla se duerma, debes confiar en la
forma estándar de Android de hacerlo. hombre: Está bien. No hay nada
automático. Eso es lo que quiero decir. Gilling: No.
Hombre: Está bien. Gilling: No, no tenemos ningún truco
bajo la manga. hombre: Está bien, genial. Y la segunda pregunta es: ¿
Puede darnos ejemplos de algunos accesorios reales
que están fabricando algunas empresas reales? ¿
Qué debemos esperar? Gilling: Bueno, viste
una bicicleta estática ahí arriba. hombre: Está bien, aparte de eso. Gilling: Um, sí,
hay robots de telepresencia. Quiero decir, esta es una iniciativa muy nueva
para nosotros. Lo que queremos hacer es que
la tecnología esté disponible y, ya saben, queremos que todos ustedes
creen el próximo mejor accesorio.
Hombre: Genial. hombre: ¿Puedes enumerar
qué dispositivos admiten el modo host ahora? Gilling: Um,
puedo enumerar uno, que es nuestro Motorola Xoom.
Lockwood: Motorola Xoom. Gilling: Um… [risas] Brown: Creo que todas
las tabletas de seguimiento rápido. Gilling: Sí, creo que
todos los seguidores rápidos. Esta es… Supongo que
la verdadera pregunta es que no lo sé en este momento. Iría a
accesorios.android.com y al menos habría
información de contacto allí. hombre: estoy de vuelta.
Gilling: Ah, sí. hombre: Uh, para el ejemplo del host, mostró un teclado
y un mouse que obviamente se
conectaban al sistema operativo y llevaban la información
a la aplicación. ¿ Existe algo equivalente
para el lado del dispositivo, donde Android es el dispositivo
y el accesorio es el periférico para vincularlo
a las funciones del sistema operativo? Lockwood: Actualmente,
la API accesoria va directamente de la aplicación
al hardware.
Um, ya sabes, eso es… eso es… eso es, ya
sabes, genial para abrir un montón de nuevas
posibilidades para los desarrolladores, pero las cosas que faltan son, ya sabes,
como la entrada y salida de audio. Nuestros dispositivos de entrada
sobre el modo accesorio, esas son cosas que estamos
considerando para versiones futuras donde podemos vincularlos directamente al marco del
sistema Android. hombre: Um, acabas de mencionar la
entrada y salida de audio. Um, en Honeycomb
con el modo isócrono sería posible hacer
audio USB compatible con este protocolo, o… Lockwood: Um, bueno, no
tenemos soporte isócrono en la API. En este punto,
entonces, eso no es realmente algo que
puedas hacer tan fácilmente, hacerlo usando isócrono. Um, podrías, sin embargo, ya
sabes, usar los dos puntos finales masivos
y enviar datos de audio usando tu propio
protocolo Homebrew.
Sin embargo, no serían compatibles
con los dispositivos USB de audio estándar que existen actualmente. hombre: Entonces, en este punto,
eso todavía está por determinar. Lockwood: Sí.
hombre: Está bien. Gracias. hombre: Para nosotros que viajamos, ¿
prevé algún problema para pasar un tubo con una
placa de circuito por seguridad? [risas] Lockwood: ¿Qué dice?
Gilling: Está bien. ¿A qué hora? ¿Quieres que
lo ponga en diez minutos? Marrón: No lo pongas
en tus zapatos. [risas] Gilling: Entonces, ¿cinco minutos más
o diez minutos más? Mujer: Cinco minutos más.
Gilling: Está bien. Marrón: ¿Alguna otra pregunta? Gilling: Muy bien, bueno,
a favor de la conveniencia… [aplausos] Gilling: Y para asegurarnos de que
las próximas personas tengan tiempo suficiente para instalarse..