GARCIA JIM

GARCIA JIM

Qué lectores le ponen alrededor de Hola, Androide Éste es un libro excelentísimo: Muy bien escrito, fácil para leer, y la diversión. Además, cualquier de rarezas del Androide es dado aclaraciones simplemente lo Enderece cantidad de detalle para asegurar calidad programando principios es Seguido.

Anthony Stevens El fundador y CTO, PocketJourney y Parte Superior 20 el Ganador de Haga Búsquedas En La Internet Usando Google Competencia del Androide Ed Burnette cubre una cantidad impresionante de tierra en un amablemente pacto El libro al retener el estilo Pragmático popular. Para el material En 2D y gráficos 3D a solas, esto es digno de un lugar en cualquier La biblioteca del desarrollador del androide.

Mark Murphy El Fundador, CommonsWare Recuerdo cuándo yo primero comencé a trabajar con Androide; Estaba como uno El laberinto enorme. Con este libro, la introducción habría sido mucha Menos doloroso. Estoy convencido de que leyendo este libro Androide nuevo Los programadores tendrán un principio más fácil.

Gabor Paller El arquitecto mayor del Software, OnRelay, Ltd.

GARCIA JIM

La plataforma móvil de Desarrollo, la Edición 2

El hola, el Androide Introduciendo de Google
Ed Burnette

El Estante de Libros Pragmático

Nuestros cursos Pragmáticos. ISBN-10: El 1-934356-49-2 ISBN-13: El 978-1-934356-49-4 Impreso en periódico libre de ácido.google. LLC. por favor nos visitan en Http://www. Lo El programador pragmático. Impreso en los Estados Unidos de Norte América.0 escribiendo en letras de imprenta.5 la Licencia de Atribución. Cada precaución fue llevada en la preparación de este libro. Donde esas designaciones aparecen en este libro. mecánico. almacenada en un sistema de recuperación. Todos los derechos reservados. LLC se dio cuenta de un reclamo de marca registrada. y otros productos pueden ayudar a usted y su equipo Cree mejor software y tenga más diversión. así como también lo último Los títulos pragmáticos. electrónico. Las porciones de la cobertera del libro son reproducidas de trabajo creado y compartidas por Google y Usado según los términos descritos en los Creative Commons 2. En cualquier forma. sin el anterior consentimiento del editor publicista. Estante de Libros Pragmático y la g de eslabonamiento El dispositivo son marcas registradas de Los Programadores Pragmáticos. Sin embargo. Vea Http://code. o De otra manera. El Juego Pragmático del Arrancador. la grabación. Para más información. octubre del 2009 La versión: El 2009-10-6 . talleres. P1. o para daños que pueden resultar de El uso de información (incluyendo listados de programa) contenida en este punto.com Derecho De Autor © 2009 Ed Burnette.pragprog. Ninguna parte de esta publicación puede ser reproducida. Pragmatic Programando. o por cualquier medio.GARCIA JIM Muchas de las designaciones usadas por fabricantes y suplidores para distinguir sus productos Es reclamado como marcas registradas. o puede ser transmitido.com/policies.html #restrictions para los detalles. fotocopiando. el editor publicista No carga con la responsabilidad para los errores o las omisiones. y Lo Los programadores pragmáticos. las designaciones tienen Sido impreso en letras mayúsculas iniciales o en todos los capitales.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Los fundamentos II Android 40 3 Diseñando la Interfaz del Usuario 41 3. . . . . . . . . . . . . 41 3. . . . .2 que es Vivo! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 ¿Quién Debería Leer Este Libro? . . . . . . . . . . . . . . . . .1 Introduciendo Al Sudoku Example. . . . . . . . .3 Bloques Constructivos. . . . . . . 24 2 Teclean Conceptos 27 2. . . . . . . . . . . . . . . . .11 Depurando con el Debugger. . . . . . . 11 ¿Qué hay en Este Book? . 69 4 Gráficos del 2D Exploring 70 4. . . . .4 El Resto de Historia. . . . . . . 63 3. . . . . .1 el Cuadro Grande. . . . . .2 Adición Graphics para Sudoku. . . . . . . . . . . . . . . . 32 2. . .6 Que Se Ayunan Adelante. . 38 2. . . . . . . . . . . 13 Que Se Ayuna Adelante. . . . . . . . . .5 Que Se Ayunan Adelante. . . . . . .9 Iniciando Un Juego New. . . . 67 3. . . 42 3. . . . . . 23 1. . . . .5 Implementando Uno Acerca de Caja. . . . . . . . . . . . .3 Corriendo en el Emulador. . . . . . . . 59 3. . . . . . . . . 13 Los Recursos en Línea. . . . . . . . . . . . . . . . 68 3. 60 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12 Egresando el Juego. . . . . . . . . 36 2. . 12 ¿Qué es New para Cupcake? . . . . . . .8 Trasfondos de Adición. . . . . . . . . . . . . . . . .4 Funcionando con un Teléfono Verdadero. . . . .1 Instalando las Herramientas. . . . . . . . . . 20 1. . . . . . . . . . 51 3.2 Diseñando por Declaración. . . . . . . .3 Manejando Aporte. . . . . . . . .6 Que Se Ayunan Adelante. . . . . . . . . . . . . . . . . . . . . 14 Yo Introduciendo Al Androide 15 1 Ponen en Marcha 16 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3. . . . . . . . . . 68 3. . . . . .10 Depurando con Mensajes del Leño. . . . 90 4. . . 37 2. . . . . . . . . . . . . . . . . . . . . . 16 1. 100 . . . . . . . . . . . . . . . . . . . . 99 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Creando Al Opening Filtran. . .GARCIA JIM EL CONTENIDO Las aceptaciones 9 Prólogo 10 ¿Qué Hace Al Androide Especial? . . . 75 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3. . . . . . . . . . . . . . . . . .5 Haciendo Más Mejoras. . . . 84 4. . 12 ¿Qué es New para Dona? . . . . . . . . . . .2 Creando Su Programa de Primera Parte. . . . . . . . 20 1. . 70 4. . . . . .13 Que Se Ayunan Adelante. . 65 3. . . . . . . . . . . . . . . . . . . . . . . . .6 Aplicándole Un Tema. . . . . . . . . . . . . . . . . . . . .4 Recursos Utilizadores. . . . . . 27 ¡2. . . . .7 Sumando Un Menú. . . . . . . . . . . . . . . . .4 Recursos Alternos Utilizadores. . . . . .1 Aprendiendo los Fundamentos. .5 Seguro y Seguro. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . 202 ¡10. . . . . . 123 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 el Cucú. . . . . . . . .1 Gráficos Comprensivos del 3D. . . . 127 7. . . . . . . . . la Posición. . . . . . . . . . . . .10 Midiendo Suavidad. . . . . . 172 9. . . . . . . . . . . . . . . . . . . . . .4 Datos. . . . . . . . . . . . 170 9 Poniéndole SQL a Work 171 9. . . .3 From JavaScript para Java y la Parte Trasera. . . . . . . . . . . . . . . . . . . . . . . . . . .3 Creando A Un OpenGL Program. . . . . . . .6 Que Se Ayunan Adelante. .1 Introduciendo SQLite. . . . . . . . .6 Luces. . . . . . . . 209 10. . . .5 Utilizando A Un ContentProvider. . .5 Que Se Ayunan Adelante. . . . . . . . . . .4 Accediendo al Internal Archivan Sistema. . . .. . . . . . . . . . . . . . . 115 6 Datos Locales Storing 116 6. . . . . . . . . . 143 7. 210 10. .4 Que Se Ayunan Adelante. . . . . . . . . . . . . . . .. . . . . . 131 7. . 174 Atadura de 9. . . . . . . . . . . . . . . . . . . . . 120 6. . . . . . . . . 161 8. . . .2 Tejen con una Vista. . . . . . . 182 9. . . . . . . . . . . . . . . . . . . . 118 6. . . . . 136 7. . . . . . . . . . . . 192 10. . . . . . . . . . .3 la Vista Panorámica. . . . . . . . .3 el Hola. . . . . . . . . . . . .4 Dando la Escena. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .GARCIA JIM 5 Multimedia 101 5. . . . . . . . . . . . . . .6 Implementando A Un ContentProvider. . 164 8. . . . 112 5. . . . . . . .8 Aplicándole Textura. .. . . . . . . 107 5. 193 10. .7 Ponen en Marcha! . . 154 8 Localizando y Sintiendo 155 8. . . . . . . . . . . . .1 la Posición. . . . . . . 185 9. . . . . 205 10. . . . . . . . . . . . 122 6. . . . . . . . . . . . .5 Accessing Dakota del Sur Cards.4 Que Se Ayunan Adelante. . . . . . 155 8. . . . . . 199 10. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 10. . . . . . . . . .3 Adición Sounds para Sudoku. . . 195 10. . . . . . . 101 5. . . . . . . . . . . . . . . . . . . . la Base de Datos. . . 189 10 3D Graphics en OpenGL 191 10.1 Haciendo Una Lectura Ligera por el Intento. . . . . . . . . . . . . . . .11 Que Se Ayunan Adelante. . . . . . . . . . . . . . . 116 6. . . . . . . . . . . .2 Jugando Video. .1 Jugando contra Audio. . . .5 Construyendo Un Modelo. . . 188 9. . . . . . . . . . . . . . . 205 10. . .2 SQL 101. . . . . . . . . . . . . . . . . . .1 Adición Options para Sudoku. . . . . . la Posición. 124 III Más Allá de los Fundamentos 125 7 el Mundo Conectado 126 7. . . .2 Colocan A Sensors para Maximum. . . . . . .2 Introducing OpenGL. . . .2 Continuando Un Juego Old. . .7 Que Se Ayunan Adelante. . . . . . . . . la Cámara. . . . . . . . 171 9. . . .3 Recordando la Posición Actual. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 . . . . .4 Web Utilizadora Services.

GARCIA JIM IV Apendices 212 Una Java vs. . . . . . 230 C. . . . . . . . . . . 216 La B Hello. . . . .1. . . . . . . . . . . . . . .4 El Resto de Historia. Dispositivo 217 B. . . . . . . . . . . . . . . . . . .3 Stretch a Satisfacer. . . . . . . el Lenguaje del Androide y APIs 213 El Subconjunto de Lenguaje del A. . . . . . . . . . 219 B. .2. . . . . 233 Los pensamientos C. . . . . . . . . . . . . 227 C. . 220 B. . . . . . . . . . . . . . .6 Keeping Arriba de hasta la Fecha. . . 226 La C Publicando para el Mercado del Androide 227 C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7. . . . . . . . . . . . . . . . . . . . . 221 B. .3 Publishing. . 224 El Chaparral de Empuje del B. . . . . . . . . . . . . . . . . .1 Creando Su Primer Dispositivo. . . . . . . .1 Preparing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 El Subconjunto de la Biblioteca del Estándar del A. .2 Llamando Todos los Dispositivos! . . . . . . . . . . . . . . . . . . . . . 215 Las Bibliotecas de Tercero del A. . . 231 C. . . .3. . . . 233 D Bibliography 235 Índice 236 . . . . . . . . . . . . . . . . .4 Updating. . . . . . . . . . . . . . . . . . . . . . . . . . 222 B. . . . . .5 Running el Dispositivo. 217 ¡B. . . . . . . . . . . . . . . .2 Signing. . . . . . . .5 Closing. .

y Laurent Pontier para su atención detallar. incluyendo Mis revisores Anthony Stevens. Mi editor Susannah Pfalzer para sus grandes sugerencias y su alegría haciendo frente a imposible Las fechas topes. .GARCIA JIM Las aceptaciones Me gustaría agradecer a las muchas personas que hicieron posible este libro. Dianne Hackborn. Al Sutton Para crear a un Donut antiguo SDK para desarrolladores. Fred Burke. Gabor Paller. Y especialmente mi familia para su paciencia en invertir Con todas las largas horas.

Localizando y Sentir. multimedios.GARCIA JIM ¿Quién Debería Leer Este Libro? El único requisito es una comprensión básica de programar en Java O un lenguaje orientado en objeto similar (C # hará en caso necesario). por la demanda popular hemos sumado dos apéndices nuevas: " La apéndice B. Estas características serán Usado en la mayoría de programas usted escribe. Los componentes multimedia. cómo crear un dispositivo Y publicando su aplicación. Ésta es una característica nueva de Cupcake. el libro Los progresos de menos adelantado para los temas más adelantados. 3D Graphics en OpenGL. Por gradualmente añadirle las características al juego. Ayuda Rápida para Iniciar. Y el ciclo biológico del Androide. Varios capítulos comparten un ejemplo común: Un juego Android Sudoku. usted se enterará de muchos Los aspectos de interfaces inclusivas programadoras Android del usuario. La parte III cava más profundo en la plataforma del Androide. los gráficos de dos dimensiones. Usted no hace Necesito cualquier anterior experiencia desarrollando software para dispositivos móviles. lo incorporado La base de datos del SQLite. ¿Qué hay en Este Libro? El hola.000 cambios para el Android API entre 1. en página 155 ahora usa lo nuevo SensorManager APIs y el método nuevo setBuiltInZoomControls (). " Capítulo 10. El androide es tan diferente que es buena para empezar una mente abierta. Hablando en términos generales. cada página y ejemplo en este libro Ha estado revisado y actualizado así es que surtirá efecto con 1. La parte II habla de la interfaz del usuario de Androide. Adentro El hecho. . hubo Más que 1. en página 16 incluye instrucciones en acostumbrar Los SDKs del blanco y los Dispositivos del Androide Virtual (AVDs).5. en página 217 le muestra cómo crear un Dispositivo para lo La pantalla anfitriona.5 (Cupcake) introdujo un número de realces a lo La plataforma del androide incluyendo soporte para teclados suaves (sobre la pantalla) La videograbación. En parte yo. y los dispositivos aplicativos. en página 191 ha sido grandemente Simplificado gracias a la clase nueva del GLSurfaceView. y los gráficos tridimensionales. luego vaya de seguro a revisar estos capítulos En particular: " Capítulo 1. comenzaremos con una introducción para Android. basados en posiciones.5. La programación En Androide es un poco diferente lo que usted es probablemente usado.1 Para acomodar la nueva versión. el Androide está dividido en tres partes. Aquí usted aprenderá acerca de Conectándose a los exteriores servicios mundiales. Esto está donde usted lo hará Aprenda a instalar el emulador del Androide y cómo usar uno integrado El ambiente de desarrollo (IDE) para escribir su primer programa. así Asegúrese de que usted ponga estos conceptos adelante a seguir adelante. Luego lo haremos Introduzca algunos conceptos cruciales como el ciclo biológico del Androide. ¿Qué es New para Cupcake? El androide 1. Bajo las coberteras. Al final del libro. Además. es probablemente mejor si usted intenta olvidar esa experiencia. y el acceso simple de datos. " Capítulo 8. si usted lo hace. usted encontrará appendices que cubren las diferencias Entre Androide y Java Standard Edition (SE).1 y 1. o de más Común para los aspectos menos comunes de Androide. Si usted ha leído La primera edición de este libro.

Estos Las secciones proveerán alguna guía para dónde a usted debería ir después cuando Usted necesita leer en voz alta el libro de orden. he intentado Provéale de un poco de ayuda así es que usted no se perderá. y Google dice tan casi todo mayor Los dispositivos han mejorado. ¿Entonces. en página 227 le guía a través de los pasos de hacer Su aplicación disponible en venta o gratis en el Androide El mercado. El androide 1. y Más Allá. Todos los dispositivos nuevos lo tienen instalados. Nota: Si usted lee la versión PDF de este libro. Todos los ejemplos en esto El libro ha sido probado en ambos 1. Divida en capítulos 2.5.com/titles/eband2. y entonces tal vez usted regresará más tarde y Lea alguna otra cosa para dejarle lograr terminar otro pedazo. Entonces.6 (la Dona) sumó soporte para los despliegues .1 o más temprano. Los Recursos en Línea En el sitio Web para este libro. ¿Qué es New para Dona? El androide 1. Conceptos Cruciales. . entonces Section C.6. y Capítulo 3. en página 228 cubre cómo crear uno Singularice programa que soporta versiones múltiples.5 ( ahora o más tarde) está disponible para todos los dispositivos navieros del Androide. cuál será la parte más importante de la mayoría de Androide Los programas.6. Que Se Ayuna Adelante Aunque la mayoría de autores esperan que usted lea cada palabra en sus libros. Construyendo para 1.1. En página 16 _ se cae usted bien en el fin profundo con su primer Androide El programa. Cada capítulo en este libro llega al final con una sección "que se ayuna adelante". en página 41 cava en el usuario La interfaz. Ayuda Rápida para Iniciar.la densidad baja alta y Más un número de menor de edad cambia eso no afecta la mayoría de developers.2 él Puede ser un rato antes de que todos los dispositivos sean mejorados a 1. yo Sé que usted no va a hacer eso. usted lo puede hacer también Dé un clic sobre el rectángulo gris pequeño antes de los listados de código para hacer un download de eso El archivo de la fuente en seguida. http://pragprog. a qué está usted esperando? El siguiente _ Capítulo de capítulo 1. Usted quiere leer justo la adecuada cantidad a dejar Usted logra terminar algo.6. en página 27 tomas un paso atrás y Le inicia en la filosofía y conceptos básicos de Androide. listando cualquier errores en la edición actual (el alquiler ¡Espere que eso estará vacío!) " Un foro de debate donde usted pueda comunicarse directamente con lo ¡El autor y otros desarrolladores Android (esperemos que eso estará lleno!) Usted tiene libertad de usar el código de la fuente en sus aplicaciones como usted ve Equipe. Diseñando la Interfaz del Usuario.5 y 1. Esta edición del libro no cubre versión 1.GARCIA JIM " La apéndice C. Usted también encontrará punteros para otro Los recursos como libros y documentación en línea aquí en el caso usted Quiera aprender más acerca del tema. 1. usted encontrará Lo siguiente: " El código lleno de la fuente para todos los programas de muestra usó en este libro " Una página de fe de erratas.

GARCIA JIM Parte I Introduciendo al Androide .

El resultado es una plataforma móvil que usted no puede permitirse no aprender.3. porque sea gratis y porque Es usado y soportado por los desarrolladores Google que crearon Androide. En este capítulo.0-b16.0 Sun La actualización de los usuarios Solares de la Macintosh del site.something" o más tarde. móvil a T. Usted no se empareja Necesito acceso para un teléfono del Androide _ simplemente una computadora donde usted pueda Instale al Android SDK y el emulador telefónico. JDK 5 o 6 Es requerido. y los programas que usted escribe estarán usando el lenguaje Java. un IDE.la versión La versión del java "1. Recomiendo Eclipse. puede ser destacado En cualquier dispositivos del Androide. Vaya a lo . Usted necesita El juego lleno de desarrollo. 1.6. Mundo" del androide. usted debería instalar un ambiente de desarrollo Java si usted no hace Tenga uno ya. la excitación de claro El software de la fuente. y luego entraremos directamente de un salto y crearemos una aplicación en funciones: La versión de "hola. Si usted no quiere usar Eclipse (allí es siempre único en cada gentío) El soporte para otro idus como la IDEA NetBeans y JetBrains está disponible De sus comunidades respectivas. y el apoyo corporativo de Google y otro Open A los miembros de la Alianza del microteléfono les gusta Intel.6. con versión "1. le mostraré cómo obtener todas las herramientas de desarrollo Instalado. y NTT DoCoMo. Para asegurarse usted tiene la versión correcta.GARCIA JIM Capítulo 1 La Ayuda Rápida Para Iniciar El androide combina la ubicuidad de teléfonos celulares.0 + Primero usted necesita una copia de Java. Afortunadamente. Usted puede preceder a un IDE enteramente y justamente puede usar el tools. Recomiendo a traer al último JDK 6. modo mixto.2 de línea de comando La versión mínima de Eclipse es 3.1 Instalando las Herramientas El juego de desarrollo del software del Androide (SDK) trabaja en Ventanas. Aquí hay lo que comprendo cuándo lo corro: C: java . corra esta orden de su concha La ventana. El eclipse Después. Todas las herramientas de desarrollo del Androide requieren Eso. Linux Y la Macintosh OS X. TI. usted necesita instalar a Java. comenzar que revelado con Androide es fácil.1 de descarga OS X debería llegar lo La última versión de Macintosh OS X y el JDK del sitio Web de la Manzana.1. O si usted es escuela realmente vieja. uso compartido) Usted debería ver algo semejante. pero usted siempre debería acostumbrar Cualquier cosa que sea la versión de producción más actual.0_14" Java SE Runtime (TM) Environment (construya 1. Reparo en que usted necesita Más que simplemente la plataforma estándar del "clásico" Eclipse SDK. y lo El androide SDK. claro está.0_14-b08) Java HotSpot Client (TM) VM (cree a 14. Es lo suficientemente no para justamente tener un ambiente del runtime (JRE). Las aplicaciones que usted crea. Java 5. Antes de que usted inicia codificación.6.

4. 2. 5.4 o más nuevo. Siga las direcciones allí para hacer un download. Macintosh OS X... Si Usted obtiene un mensaje de error. y luego dé un clic sobre Install. La descarga del Androide El page4 tiene paquetes para Ventanas. Dé un clic sobre la etiqueta Disponible del Software si no es ya seleccionada. Por defecto. El sitio del Androide ahora debería aparecer en el Software Disponible La vista.. luego usted no puede tener la versión correcta De Eclipse. El Plug-In del Eclipse Para simplificar desarrollo. El eclipse de principio. Dé un clic sobre Oklahoma. Si usted tiene dificultad con esta dirección. El siguiente paso es iniciar Eclipse y Configúrelo. intente Usando http en la posición en lugar de https. Éste es su SDK instala directorio.1: Instalando Al Android Development Toolkit Ningún especial instala programa es necesario pero yo le recomiendo sume lo El directorio del tarro para depósito de SDK para su CAMINO.. Google ha escrito un plug-in para Eclipse Designado el Android Development Toolkit (ADT). El androide Después.. Una vez que usted lo ha llenado. Siga estos pasos (note estas direcciones son para Eclipse 3.1. desempacando. Fuertemente recomiendo a usar ya sea el Eclipse preconstruido IDE para Java o el Eclipse IDE para paquetes de Desarrollo del ingeniero eléctrico Java. e instalar El eclipse en una posición adecuada (guste a C:\Eclipse en Ventanas). Haga una nota de lo Abatane camino así es que usted puede referirse a él más tarde.4 _ diferente Las versiones pueden tener menús ligeramente diferentes y opciones): 1.zip para Un directorio conveniente (por ejemplo. 3. 3 y escogen "eclipse IDE para Java Developers". haga un download del último Android SDK de Google... Entre en la posición del sitio de actualización del Androide: Https://dl-ssl. desempaca el archivo del . C:\Google). la ventana de diálogo debería parecerse a la Figura 1. / el androide /eclipse del com. Para instalar el plug-in. y las Actualizaciones del > Software de Ayuda de primera calidad. Seleccione el checkbox al lado de eso. Dé un clic sobre el Sitio Add . el botón.GARCIA JIM El eclipse que las descargas paginan. Después Haciendo un download del paquete así mismo para usted. el SDK será expandido en un subdirectorio como androidsdk Windows-1.. . La versión 3.6 _ r1. y Linux. Figura 1.google.

Una vez lo instala se hace. del Androide" en simplemente algunos Los segundos. Ahora que todo Es instalado. El eclipse lo construirá y lo empaquetará arriba así es que lo hará Esté listo a ejecutar. debería verse algo así como Figura 1.hello Cree Actividad: Hola Cuando usted termina. Para salirse La cortina de fuego. Veo plataforma del theWeb Tools a casa page5 para más detalles y hago un download Los enlaces. adelante lo Después de página. 7. 8. Seleccione > Androide de > Preferencias de la Ventana (> las Preferencias del Eclipse Adelante La Macintosh OS X). El Final de Chasquido.example. y entra en el SDK instala directorio que usted notó más temprano. y haga clic Después. Luego Seleccione Proyecto del > Androide del Androide. y dé un clic sobre Oklahoma." Tan Ahora Qué? Si usted obtiene un error de conexión.6 El nombre aplicativo: El hola. ¡Uf! Afortunadamente. El plug-in del Androide creará el proyecto y lo suplirá Con algunos archivos predeterminados. aceptan los acuerdos de licencia. Entre en la siguiente información: El nombre de proyecto: HelloAndroid Construya Blanco: El androide 1. usted puede estar corriendo una versión mayor De Eclipse. pero desafortunadamente su Eclipse no es lo suficientemente listo Para recoger el trasfondo de allí. . Haga clic Después. Cuando Eclipse regresa arriba. Para contarle a Eclipse sobre el apoderado. Éste es el mismo servidor del apoderado para el que usted usa Su navegador de Internet. Si usted pone un error alrededor a perder carpetas de la fuente. es hora de escribir su primer programa. usted puede ver algunos mensajes de error Porque usted necesita decirle donde el Android SDK está ubicado. luego a utilizar al Androide Los editores que usted también necesitará instalar las Herramientas de Web Standard (WST) El plug-in y todos sus prerrequisitos..2. o la plantilla.GARCIA JIM ¿ Dice "error de Conexión. usted tiene que hacer eso solo una vez (o al menos una vez cada Cronometre una nueva versión de ADT o el Eclipse sale afuera). el Androide El nombre del paquete: Org. la vuelta en la opción para la configuración Manual del apoderado. que somos Yendo para soler crear un programa de "hola" simple ". seleccione > Red de Preferencias Las conexiones. la causa más probable es un poco amable De cortina de fuego erigida por sus administradores de sistema. Estos son ya incorporados en los paquetes recomendables Mencionado anterior. Si Usted no ve la opción. para abrir la ventana de diálogo Nueva de Proyecto. 1. Dé un clic sobre Oklahoma. ¿Alista? ¿El set? ¡Vaya! Seleccione > Proyecto del Archivo > New . Prepare su cronómetro. 6. Introduzca el nombre del servidor y número portuario. Pruebe mirar bajo las Preferencias Si usted hace una costumbre instalar de Eclipse.. vuelve a arrancar Eclipse. y luego dan un clic sobre Acabado Para iniciar la descarga e instalar proceso.2 Creando Su Programa de Primera Parte ADT viene con un programa de ejemplo incorporado. usted necesitará configurar Eclipse con la dirección De su servidor del apoderado. Seleccione Proyecto > Por Completo para centrarlo.

6 que es más fácil de utilizar Eclipse. y la Carrera de primera calidad Como la Aplicación del > Androide.GARCIA JIM Está bien. Creando a un AVD Para hacer esto. Primero lo correremos bajo el Emulador del Androide.3 Corriendo en el Emulador Para correr su programa Android. eso se encarga de escribir el programa. . Si usted lleva el mismo paso en Eclipse usted puede ver un diálogo de error Guste el mismo en Figura 1. en página 22.3. vaya a la ventana del Explorador del Paquete. Así es que haga una selección Sí en el diálogo AVD Error para abrir al AVD Manager. usted necesita crear un Dispositivo del Androide Virtual (AVD). 1. Usted Puede reabrirse al gerente más tarde seleccionando a Window Android AVD El gerente. Ahora todo lo que queda debe intentar Corriéndolo. acostumbrando Ya sea el Eclipse o el androide avd command. Esto indica que no hemos dicho todo El Emulator la clase de teléfono a emular. El clic derecho el proyecto HelloAndroid.

6 (la Dona) programe adelante uno El androide 1. Pero puede ser un rato antes de la mayoría de teléfonos tenga Sido mejorado. Figura 1. La versión de la que usted hace un download Puede ser diferente al mismo que utilicé cuándo escribiéndole a esto Haga una reservación. no surtirá efecto porque Androide 1.5 o anteriores programas. . La Dona Vs. llene los campos para el AVD nuevo como sigue: El nombre: El em16 El blanco: El androide 1.3: Perdiendo Dispositivo del Androide Virtual (AVD) En el diálogo AVD Manager. yo Recomiéndele jaque el sitio con enchufe mensualmente para recoger a cualquier Los apuros y características nuevas. Vea a Section C. y puede contener uno pocos.5 teléfonos sólo pueden correr 1." lo cual lo ha hecho lo El androide 1.4.5 no siempre exhiben correctamente en lo más grande y Las pantallas más pequeñas encontraron en 1. 1. Algunos segundos más tarde usted Debería ver un mensaje que el dispositivo ha sido creado. Cuando usted termina usted debería ver algo así como Figura 1. Cupcake La versión de Androide corriendo en su emulador (o realmente el teléfono) Debe ser compatible con el Blanco de la Constitución de su programa. y Luego seleccione al AVD y clic Principio . ¿Tan por qué no simplemente el Androide del blanco 1. Construyendo para 1. Por ejemplo. en página 24. en página 228 Para las instrucciones. Afortunadamente hay uno fácil La forma para hacer sus programas compatible con ambos 1. El androide 1.1.6. Cierre al AVD La ventana del gerente cuando usted termina..6 (la Dona) que firmware instaló.5? Desafortunadamente las aplicaciones Construidos pues 1.GARCIA JIM Manteniendo el mismo paso que el Plug-In El plug-in del Eclipse del Androide es un trabajo en marcha eso cambia Bastante más a menudo que el Android SDK. para subirlo. Un 128MB Digital Seguro virtual (Dakota del Sur) la Tarjeta será ubicada.5 (Cupcake) el teléfono. Debido a las actualizaciones en el plug-in desde esto estaba escrito su pantalla puede Véase ligeramente diferente.6 teléfonos. El chasquido Create AVD para crear el dispositivo virtual.5 y 1.5.6 .6 Los teléfonos. Dé un clic sobre Oklahoma. 1.6.5. idiosincrasias. Y más temprano. por otra parte.6. junto con un despliegue de half-VGA (320×480). Si usted intenta correr a un Androide 1. lo hará que decimos.. pueden correr programas construidos para 1. y Más Allá.API Derribe 4 El SDCard: El 128M La piel: Falle (HVGA) Esto le dice a Eclipse que se establece un dispositivo genérico llamase a "em16.

así es que pueden tener paciencia. y su "hola. 1. Cuando usted está listo a publicar su aplicación para otros para usar. Androide" programa Está ahora corriendo (vea Figura 1. Usted puede necesitar para el clic derecho adelante El proyecto y la Carrera de primera calidad Como la Aplicación del > Androide otra vez.7 especial del dispositivo Figura 1. la ventana del emulador del Androide se iniciará Y la bota el Androide dirigiendo sistema. allí Son algunos pasos más que usted necesitará tomar. Todo lo que usted necesita hacer es conectar su teléfono para la computadora con uno USB cablegrafíe e instale un driver. ¡No hay vuelta de hoja! Felicitaciones En su primer programa del Androide.4: Creando a un AVD en proceso de desaparición Cierre la ventana del emulador si está ya abierta. en página 227 lo hará . Si usted ve Un mensaje de error diciendo que la aplicación no responde. a eso Pueden tomar un minuto o dos. en página 25). El eclipse le enviará una copia de su programa al emulador ejecutar. las aplicaciones serán cargadas y corridas allí en lugar de eso. Con tal de que el teléfono sea Bloqueado de adentro. hace una selección La opción para continuar esperando. La primera vez que usted haga esto. La pantalla aplicativa sube.5.4 Funcionando con un Teléfono Verdadero Corriendo un programa del Androide en un dispositivo físico como lo móvil G1 durante el desarrollo es casi idéntico para correrlo en el emulador. La apéndice C.GARCIA JIM Probemos Eso Otra Vez Una vez que usted tiene a un AVD válido.

Androide" programa Acortando la Vuelta en U Iniciar al emulador es caro. no lo apague! Deje la ventana del emulador corriendo con tal de que Eclipse está corriendo. ¡Así es que. del Eclipse Me fijo que el emulador está ya allí y justamente le enviará lo nuevo Programe correr.5 Que Se Ayunan Adelante Gracias al plug-in del Eclipse. 1.GARCIA JIM Cubra eso de más detalle. Diseñando la Interfaz del Usuario. Esta prueba será usada en varios capítulos a demostrar API. La próxima vez que usted inicie una voluntad del Androide de programa. comenzaremos a rellenarnos de músculo fuera tan mínimo con una aplicación verdadera _ uno Sudoku juegue. del androide Figura 1. En el Capítulo 3. Piense acerca de eso así Cuando usted primero enciende su teléfono. necesita por añadidura arriba algo así como Cualquier sistema de la computadora.5: Corriendo el "hola. creando un programa esquelético del Androide Toma sólo algunos segundos. . Cerrar al emulador está algo así como irse El teléfono o arrancando las baterías. Adelante Página 41.

el resto serán mucho más fáciles Para entender. yo Altamente recomiéndelo. Una vez que usted ase lo básico Los conceptos como las actividades y los ciclos biológicos.GARCIA JIM Pero antes de ahondar en eso. Conceptos Cruciales. Aunque el uso de Eclipse para desarrollar programas del Androide es optativo. Si usted nunca ha usado Eclipse antes. adelante lo en la otra página. usted puede querer Para invertir dinero en una referencia rápida como el Guía Eclipse IDE Pocket . usted deberían tardar algunos minutos en rezar Divida en capítulos 2.

Los otros serán completamente extranjeros. Cada estrato usa los servicios provistos por los estratos debajo de él. dejando a Android ser puesto a babor para una variedad ancha De plataformas en el futuro. En Figura 2. usted puede ver lo " 20.1 el Cuadro Grande Comencemos por echarle un vistazo a la arquitectura global de sistema _ la llave Los estratos y los componentes que hace al Androide abre software de la fuente La pila. y la base de datos SQL. las siguientes secciones resaltan los estratos siempre y cuando por ahí El androide. Figura 2. Estúdielo estrechamente habrá una prueba mañana. Como la idea del ciclo biológico aplicativo de Androide. 2. Linux Kernel El androide es creado encima de una fundación sólida y a la que se resultó ser: El Linux La semilla.000 El pie " la vista de Androide. Algunas partes de Androide pueden ser familiares. OpenGL.1: La arquitectura de sistema del androide . Usted necesitará que una buena comprensión de estos conceptos cruciales para escriba Las aplicaciones del Androide bien portado. Empezando Del fondo. lectura este.GARCIA JIM Capítulo 2 Teclee Conceptos Ahora que usted tiene una idea de lo que Android es.1. así que si usted lee sólo un capítulo adentro Este libro. Linux provee la abstracción del hardware El estrato para Androide. Linux puede ser encontrado hoy adentro todo de Los relojes de pulsera para supercomputadoras. en la siguiente página. Creado por Linus Torvalds en 1991 mientras él fue un estudiante La Universidad de Helsinki. como la semilla Linux. echemleos un vistazo cómo eso Las obras.

3D Graphics en OpenGL. Estas bibliotecas no son aplicaciones que se permanecen fiel ellos mismos. los procesos de voz activa de vista. en página 70 y Capítulo 10. Y la plataforma S60 de Nokia. sus comandos del dibujo van en Offscreen bitmaps que está entonces combinado con otros bitmaps para Forme el despliegue que el usuario ve. en página 171 para un ejemplo. Explorando Gráficos del 2D. el Mundo Conectado. Empezando en Androide 1.3 éste es el mismo motor usado en lo Haga Búsquedas En La Internet Usando Google navegador de Cromo. Estas bibliotecas compartidas se escriben todo con ustedstedso o C + +. en página 191. Vea Capítulo 9. Esto deja el sistema crear todo Ordena de efectos interesantes como antojo y ventanas transparentes Las transiciones. usted puede escribir y puede destacar sus bibliotecas natales utilizando al Nativo El desarrollo Toolkit (NDK). Para El ejemplo. compiladas para lo La arquitectura del hardware particular usada por el teléfono. " La base de datos SQL: El androide incluye la base de datos ligera del SQLite El motor.GARCIA JIM Internamente. De allí usted puede Examine el sistema del archivo Linux. y así sucesivamente. Ellos Exista sólo para ser designado por los programas superiores del nivel. El desarrollo nativo trasciende el alcance de Este libro. AVC (H. La voluntad de la biblioteca El hardware del 3D de uso si el dispositivo lo tuviera a eso o un dador rápido del software si No hace. el navegador de Safari de Manzana. el command1 de la concha del adb abrirá una concha Linux en la cual usted Pueden introducir otras órdenes para funcionar con el dispositivo. excepto si usted está interesado usted puede leer todo acerca de él en línea. H. Como un desarrollador. el proceso La gerencia. " Los codecs de los medios de comunicación: El androide puede jugar video y puede registrar y puede escuchar una cinta Audio en una colección variada de formatos incluyendo a AAC. . en página 101 para uno El ejemplo. y preinstalado Por el vendedor telefónico. usted necesitará ser Consciente está allí. subordinan Para las restricciones de seguridad. Usted puede destinar esto para almacenamiento persistente en su aplicación. el Apple IPhone. y MPEG-4. 2 que la misma base de datos usó en Firefox y el iPhone Apple. Las Bibliotecas Natales El siguiente estrato por encima de la semilla contiene las bibliotecas nativas Android. " Los gráficos 2D y 3D: Dos elementos tridimensionales pueden ser Combinado en una interfaz sola del usuario con Androide. En lugar de dibujar En seguida para el amortiguador de la pantalla. Algunos de las bibliotecas natales más importantes incluyen lo siguiente: " Surface Manager:: El androide utiliza un gerente de la ventana del compositing Parecido a Vista o Compiz. Algunos servicios públicos que usted necesita durante el desarrollo le interactúan a Linux.5. Vea Capítulo 7. Vea Capítulo 4. " El motor del navegador: Para el despliegue acelerado de contenido de HTML. el sistema de redes. Vea Capítulo 5. y otros servicios operativos de sistema. En página 126 para un ejemplo. Lo El usuario del teléfono del androide nunca verá que Linux y sus programas no lo harán La marca Linux llama por teléfono directamente. el Androide Utiliza al WebKit Library. el Androide usa a Linux para su administración de memoria.263 MP3. sin embargo.264). Multimedia. pero es mucho más simple. Dándole Ocupación a SQL.

usted encontrará la Aplicación El estrato del armazón. Las Aplicaciones y los Dispositivos El estrato más alto en el diagrama de arquitectura del Androide es los Applications Y el estrato de Dispositivos. .dex de archivos. En A de la Apéndice. Adelante Página 37. en página 217. El desarrollo del dispositivo es inconspicuo En Appendix B. Hay una cantidad sustancial De traslapo. " El gerente del recurso: Los recursos son cualquier cosa que va con su El programa que no es código. Vea Sección 2. El Dalvik VM es la implementación de Google de Java. invasiones ajenas. " Contente a los proveedores: Estos objetos encapsulan datos que las necesidades para ser Compartido entre aplicaciones. los Dispositivos (algunas veces designado Las cosas). La mayor parte de este libro cubrirá desarrollo aplicativo. El framework viene preinstalado Con Androide. Las partes más importantes del framework son como sigue: " El gerente de actividad: Esto controla el ciclo biológico de aplicaciones (vea ¡Sección 2. sin embargo. en página 213. sólo funciona en un rectángulo pequeño de la aplicación de la pantalla de la página principal del sitio Web. En la siguiente página) y mantiene uno común "Backstack" para la navegación del usuario. sin embargo. Usando Recursos. en página 155.jar es más compacto y Eficiente que la clase archiva. Los usuarios finales verán sólo estos programas. vendrá preempacado .dex. Piense acerca de este como el consejo del iceberg del Androide. Como un desarrollador del Androide. " El gerente de la posición: Un teléfono del Androide siempre sabe dónde él is. las citas.2. Dalvik difiere de Java tradicional en dos formas importantes: " El Dalvik VM corre archivos del . como los contactos.3. Localizando y Sintiendo. " Las bibliotecas Java de fondo que vienen con Androide son diferentes de Ambos las bibliotecas Java Standard Edition (Java SE) y la Java Las bibliotecas móviles de la Edición (Java Maine). El Armazón Aplicativo Sentándose por encima del runtime y bibliotecas natales. pero usted también lo puede extender con sus componentes Según se necesite. está vivo!. Vea Capítulo 8. incluyendo lo La máquina virtual Dalvik y las bibliotecas Java de fondo. en página 37.class estándar y archivos del . Usted tiene mejor criterio.GARCIA JIM El Runtime del Androide También la sentada encima de la semilla es el Android Runtime. usted encontrará una comparación De Androide y bibliotecas estándar Java.4. dichosamente ignorante de todo el Ponga en marcha seguir debajo de la línea de flotación. Las aplicaciones son programas que pueden asumir el control de la pantalla entera y Interactúele al usuario. Por otra parte. optimizada para móvil Los dispositivos. cuáles se convierten en compila cronometra De . Cuando alguien compra un Androide llame por teléfono. una consideración importante para lo limitado La memoria y los dispositivos energizados en batería que los blancos Android. Este estrato provee los bloques constructivos de alto nivel Usted solerá crear sus aplicaciones. La proximidad alerta. porque Ese es lo que la mayor parte de ti escribirá. Contente a los Proveedores. Todo el código que usted escribe para Androide estará escrito en Java y Corra dentro del VM. Vea Sección 2. " El gerente de notificación: Los Eventos como mensajes que acaba de llegar. y más pueden replantearse En una moda discreta para el usuario.

surte efecto muchísimo como la historia en una trama El navegador. Uno de lo Las ventanas tiene foco del teclado. Figura 2. pero es su responsabilidad como lo El usuario para mover de un lado para otro las ventanas así es que usted puede ver lo que usted está haciendo y El final programa que usted no necesita más ya. En Androide. En cualquier momento.2. Usted fácilmente puede cambiar de decisión entre ellos. pero de otra manera todos los programas son iguales. el usuario puede Presione el botón De Atrás para regresar a la pantalla previa en la pila. y luego otro y Otro. el usuario podrá hacer un download de programas nuevos Para funcionar con su teléfono. usted podrá escribir sus aplicaciones del asesino Para Androide.2 que es Vivo! En su Linux estándar o parte superior de un escritorio de Ventanas. De punto de vista del usuario. la primera aplicación que ven es la aplicación de la página principal del sitio Web (Vea Figura 2. una búsqueda o dispositivo del reloj. usted puede tener muchas aplicaciones Corriendo y visible de inmediato en ventanas diferentes. Este programa típicamente sale a la vista Una imagen de fondo. lo cual típicamente toma Sobre el despliegue entero excepto por la línea de estatus. hay una aplicación del primer plano. incluyendo lo siguiente: " Llame por teléfono marcador " El correo electrónico " Los contactos " El navegador de Internet " El Mercado del Androide Usando el Mercado del Androide. Cuando el usuario cambia de dirección En su teléfono. Todos estos programas y pantallas se graban en la aplicación La pila por el Gerente de Actividad del sistema. En el momento Usted termina este libro. el usuario podría invocar otra aplicación. y una lista con barra de desplazamiento de Otras aplicaciones que el usuario puede conjurar. Ahora tomemos una apariencia más cercana en el ciclo biológico de una aplicación del Androide. El androide no trabaja de ese modo. en la siguiente página). Es un poco diferente lo que usted está acostumbrado a ver. u otra pantalla en la misma aplicación.2: La aplicación de la página principal del sitio Web . Es ahí donde usted entra. el Androide la inicia y lo pone al pairo lo El primer plano. De esa aplicación. ¡2.GARCIA JIM Un número de aplicaciones estándar de sistema. Cuándo el usuario corre una aplicación. Parte trasera que presiona les devuelve a la página previa.

GARCIA JIM

¡El proceso!= La aplicación Internamente, cada pantalla de la interfaz del usuario es representada por una clase de Actividad (Vea Sección 2.3, Actividades, en página 36). Cada actividad tiene su vida El ciclo. Una aplicación es una o más actividades y un proceso Linux para Téngalos. ¿Eso suena bastante franco, no lo hace eso? Pero no haga Acomódese aún; Estoy a punto de tirarle un lanzamiento curvo. En Androide, una hoja de solicitud puede estar viva aun si su proceso ha sido Matado. Ponga de cualquier otro modo, el ciclo biológico de actividad no está atareado con el proceso El ciclo biológico. Los procesos son simplemente envases desechables para actividades. Esto es

Probablemente desemejante del cada otro sistema usted está familiarizado, así deja Tome una apariencia más cercana antes de seguir adelante. Los ciclos biológicos de los ricos y Famous Durante su duración de una vida, cada actividad de un programa del Androide puede ser adentro una de Varios estados, como se muestra en Figura 2.3. Usted, el desarrollador, no tiene El control sobre qué estado su programa está. Eso es todo bajo la dirección de lo El sistema. Sin embargo, usted queda notificado cuando el estado está a punto de cambiar A través del onXX () las llamadas de método. Usted pasa sobre la disposición de estos métodos en su clase Activity, y el Androide llamará por teléfono Ellos en el tiempo apropiado: " OnCreate (Bundle): Esto es designado cuando la primera parte de actividad se inicia. Usted lo puede usar realizar antigua inicialización como crear La interfaz. del usuario onCreate () toma un parámetro que es ya sea Nulo o alguna información estatal previamente salvada por el onSaveInstanceState ( ) El método.

GARCIA JIM
OnStart (): Esto indica que la actividad está a punto de ser exhibida lo El usuario. " OnResume (): Esto es designado cuando su actividad puede comenzar a interactuar Con el usuario. Éste es un buen lugar para iniciar animaciones y música. " OnPause (): Esto corre cuando la actividad está a punto de entrar en el trasfondo, Usualmente porque otra actividad ha sido en la que se lanzó La parte delantera de eso. Esto está donde usted debería ahorrar su programa persistente El estado, como un registro de la base de datos siendo editado. " OnStop (): Esto es designado cuando su actividad es ya no visible a El usuario y eso no serán necesarios por algún rato. Si la memoria es apremiante, OnStop (el sistema simplemente puede terminarse () nunca puede ser designado Su proceso). " OnRestart (): Si este método es designado, indica su actividad es Siendo reexhibido para el usuario de un estado bloqueado. " OnDestroy (): Éste es derecho designado antes de que su actividad se destruya. Si La memoria es apremiante, onDestroy (el sistema puede () nunca puede ser designado Simplemente termine su proceso). " OnSaveInstanceState (el Manojo): El androide llamará este método a permitirle La actividad para ahorrar por estado de instancia, como una posición del cursor Dentro de un campo del texto. Usualmente usted no necesitará pasar sobre la disposición de eso porque La implementación predeterminada le ahorra al estado para toda su interfaz del usuario Controla automáticamente. " OnRestoreInstanceState (el Manojo): Esto es designado cuando la actividad es Siendo reinicializado de un estado previamente salvado por el onSave El método InstanceState (). La implementación predeterminada restaura lo El estado de su interfaz del usuario. Las actividades que no corren en primer plano pueden estar bloqueadas o El proceso Linux que los aloja puede ser echado a perder en cualquier momento en orden Para dejar campo para actividades nuevas. Ésta será una ocurrencia común, Así es que es importante que su aplicación sea diseñada desde el principio Con esto en mente. En algunos casos, el método onPause () puede ser lo último El método procedió al cobro inmediato de su actividad, tan es ahí donde usted debería ahorrar cualquier datos Usted quiere mantener aproximadamente para la próxima vez. Además de manejar el ciclo biológico de su programa, el armazón del Androide Dispone que un número de bloques constructivos usted el uso a crear su Las aplicaciones. Echemleos un vistazo a esos después. 2.3 Bloques Constructivos Algunos objetos están definidos en el Android SDK que cada desarrollador necesita Para ser familiar. Los más importantes son actividades, intentos, Los servicios, y los proveedores contentos. Usted verá varios ejemplos de ellos adentro Al resto de libro, así es que me gustaría brevemente introducirlos ora. Las actividades Una actividad es una pantalla de la interfaz del usuario. Las aplicaciones pueden definir uno o Más actividades para manejar fases diferentes del programa. Como discutido ¡En la Sección 2.2, está vivo!, En página 32, cada actividad es responsable para Salvo su estado a fin de que puede ser restaurada más tarde como parte de lo El ciclo biológico aplicativo. Vea Sección 3.3, Creando la Pantalla Abridora, Adelante Página 43 para un ejemplo.

GARCIA JIM
Los intentos Un intento es un mecanismo para describir una acción específica, tan " la elección Una foto, una casa telefónica, "o" un claro la vaina aúlla puertas ". En Androide, simplemente Acerca de todo experimenta intentos, así es que a usted le sobran las oportunidades Para reemplazar o reusar componentes. Vea Sección 3.5, Implementando Uno Aproximadamente Caja, en página 54 para un ejemplo de un intento. Por ejemplo, hay un intento para "envía un correo electrónico". Si su aplicación Necesita enviar correo, usted puede conjurar ese intento. O si usted escribe uno La aplicación nueva del correo electrónico, usted puede registrar una actividad para manejar tan atento Y reemplaza el programa de correo estándar. La siguiente persona de influencia de tiempo intenta Para enviar un email, obtendrán la opción para usar su programa en lugar de Lo estándar. Los servicios Un servicio es una tarea que corre en el trasfondo sin el usuario directo La interacción, parecido a un demonio Unix. Por ejemplo, considere una música El jugador. La música puede comenzar por una actividad, pero usted la quiere para Manténgase jugando aún cuando el usuario ha seguido adelante hacia un programa diferente. Entonces, el código que hace el modo de tocar real debería estar en un servicio. Más tarde, Otra actividad puede tener fuerza obligatoria para ese servicio y la puede decir para cambiar huellas O el alto jugando. El androide viene con muchos servicios incorporados, junto con Los APIs convenientes para acceder a ellos. Contente A los Proveedores Un proveedor contento es un set de información absorto en un API aduanero para leer Y lo escribe. Ésta es la mejor forma para compartir información global entre aplicaciones. Por ejemplo, Google provee a un proveedor contento para los contactos. Toda la información allí _ le nombra, le dirige la palabra, envíe por teléfono números, y bien En adelante _ puede ser compartido por cualquier aplicación que quiere para usarlo. Vea Sección 9.5, Destinando a un ContentProvider, en página 185 para un ejemplo. 2.4 Recursos Utilizadores Un recurso es una cuerda del texto localizada, bitmap, u otro pedacito de Poco codifique información que su programa necesita. En constitución cronometre todo su Los recursos se compilan en su aplicación. Usted creará y almacenará sus recursos en el directorio de res adentro su Proyéctese. El compilador del recurso del Androide (aapt) 5 procesa recursos Según cuál subcarpeta están dentro y el formato del archivo. Para El ejemplo, PNG y bitmaps del formato JPG deberían irse en el res/drawable El directorio, y los archivos XML que describe le oculta los layouts lo deberían entrar lo El directorio del / layout de res. El compilador del recurso comprime y empaca sus recursos y luego Genera que una clase nombró R que contiene identificadores que usted suele establecer referencias para Esos recursos en su programa. Esto es un poco diferente de estándar Los recursos Java, cuáles son a los que se puso notas por cuerdas cruciales. Haciéndolo así Deja a Android hacer seguro todas sus referencias es válido y economiza No espacie por ahí no teniendo que almacenar todas esas llaves del recurso. Eclipse usos uno El método similar a almacenar y establecer referencias para los recursos en plug-ines del Eclipse. Veremos un ejemplo del código para acceder a un recurso en el Capítulo 3, Diseñando la Interfaz del Usuario, en página 41.

en página 41. " _ LA POSICIÓN DE _ MULTA DE ACCESO: Use un proveedor de la posición más preciso tan Como GPS.com/apk/res/android" package="com. Además. Los codecs de los medios de comunicación serán explorados En el Capítulo 5. para monitorear mensajes entrantes SMS Usted especificaría Esto en el archivo manifiesto: <manifest xmlns:android="http://schemas.xml. lea la ayuda en línea para lo Model. Cuando la aplicación es instalada. " ACCEDA A _ LA POSICIÓN _ GRUESA: Utilice un proveedor tosco de la posición tan La celda se encumbra o wifi. cada aplicación es asignada una identificación de usuario específica. usted puede restringir quién puede iniciar una actividad.6 de seguridad del androide 2. Además. " LEA _ LOS CONTACTOS: Lea (pero no escriba) los datos de contactos del usuario.permission. en página 70 usará una cierta cantidad de los gráficos Las clases en las bibliotecas nativas Android. Multimedia.5 Seguro y Seguro Como mencionada anterior. cada aplicación corre en su propio proceso Linux.app. " RECIBA A _ SMS: Monitoree mensajes entrantes SMS (el texto). acceda a para ciertas operaciones críticas está restringido. pero si usted quiere aprender que se repita.RECEIVE_SMS" /> </manifest> El androide aun puede restringir acceso a partes enteras del sistema. Dándole Ocupación a SQL. El principio o tiene fuerza obligatoria para un servicio. el Gerente del Paquete Uno u otro concede o no concede los permisos basados en certificados Y.android. acostumbraremos Las actividades y los métodos de ciclo biológico para definir una aplicación de muestra. . Aquí hay una cierta cantidad de lo más común Los permisos que usted necesitará: " La INTERNET: Acceda A la Internet.GARCIA JIM 2. Cualquier archivos que crea no pueden ser leídos o escritos por otras aplicaciones. " ESCRIBA _ CONTACTOS: Escriba (pero no lea) los datos de contactos del usuario. intentos emitidos por radio para un aparato receptor.myapp" > <uses-permission android:name="android. Explorando Gráficos del 2D.6 Fast-Forward >> El resto de este libro usará todos los conceptos introducidos en este capítulo. en página 171. y usted Específicamente debe pedir permiso para usarles en un archivo nombrado Androide Manifest. Por ejemplo. Esta clase de control trasciende el alcance De este libro. si es necesario.xml. Acostumbrando Las etiquetas XML en AndroidManifest.android. adelante mande a llamar 101.google. el usuario apremia. y los proveedores contentos serán Cubierto de adentro Capítulo 9. El hardware prohíbe un proceso de acceder a otro proceso La memoria. El capítulo 4. Diseñando la Interfaz del Usuario. En el Capítulo 3. o el acceso Los datos en un proveedor contento.

GARCIA JIM Parte II Los Fundamentos del Androide .

no cómo Usted quiere hacerlo. Por ejemplo.2 Diseñando por Declaración El usuario interactúa puede ser diseñado usando uno de dos métodos: Procesal Y declarativo. tenemos que sopesar los indicios contra el reto Y no la marca eso demasiado fácil. Sudoku es usualmente jugado con lápiz y periódico. Usted Puede casi enteramente permanecer en código Java. o usted puede quedarse casi enteramente . El HTML es declarativo. Iniciaremos con la interfaz del usuario. Así. usted usa HTML. usted puede cambiar lo Enlosa siempre que a usted le gusta sin tener que remover con el cepillo todo esos molestoso Los rapamientos del borrador. Con la versión del periódico. en la siguiente página) también ofrecerá uno Pocos indicios a tomar algunos del gruñido resultan de acertijo solucionando. usted aprenderá acerca de Muchos aspectos de Androide programando. Todo lo que el jugador tiene que hacer es dar abasto lo El descanso. En la versión del Androide. A las un El extremo. Un acertijo verdadero Sudoku tiene sólo una solución única. Usted puede encontrar todo el código de muestra usado en este libro en http://pragprog. cuando Usted programa una aplicación Giratoria. pero eso no sería cualquier ¿La diversión. pero las versiones informatizadas Es muy popular también. es fácil de hacer Un error pronto. crearemos un ejemplo más sustancial: Un Sudoku El juego. la Ayuda Rápida para Iniciar. en página 16. En Parte II. y cuando eso ocurre. y usted intenta rellenarlos con números tan tan cada columna. justamente podría solucionar el acertijo para usted. Cuando Usted diseña una página simple de trama. Si usted lee la versión PDF de este libro. 3. Usted tiene una cuadrícula de ochenta y una tejas (nueve a través y Nueve derriban). un lenguaje de sobreprecio Basado en XML que describe lo que usted quiere ver en la página. usted escribe código Java para crear Y manipula todos los objetos de la interfaz del usuario como JFrame y El JButton. del Androide" en pocos minutos. El com / titula / eband2. Por gradualmente añadirle las características al juego. usó el Eclipse del Androide El plug-in para atar cabos sobre un programa de "hola" simple ". no requiere cualquier código. El diseño declarativo. algunos de los números (Los givens) es ya rellenado. Cada uno rema. usted Puede dar un clic sobre el rectángulo gris pequeño antes de los listados de código de los que hacer un download Eso archiva directamente. El androide intenta montar a horcajadas la abertura entre lo procesal y declarativo Los mundos dejándole crear interfaces del usuario en ya sea el estilo. Procesal simplemente la manera en código secreto. lo haría ella? Entonces. Cuando el juego empieza. usted tiene que regresar y Borre la mayor parte de su trabajo. el Columpio es procesal.1 Introduciendo Al Sudoku Example Sudoku hace un gran programa de muestra para Androide porque el juego Sí mismo es tan simple. por otra parte. y cada uno del tres por tres cajas contiene los números 1 a través de 9 solo una vez. El androide Sudoku (vea Figura 3. 3.1.GARCIA JIM Capítulo 3 Diseñando la Interfaz del Usuario En el Capítulo 1.

usted usaría sus nombres aquí. Si usted Haga eso y corra el programa ahora. Una vez que usted escoge un nombre del paquete. usted verá una pantalla en blanco que simplemente Contiene las palabras "mundo de hola. ¿Cuál debería usar usted? Cualquier cara de la moneda es válida. claro está.1: El programa de ejemplo Sudoku para Androide Ahora veamos cómo podemos usar esta información para crear al Sudoku Abriendo pantalla. usted verá ambos las Java APIs y lo correspondiente Los atributos declarativos XML que hacen lo mismo.sudoku Create Activity: Sudoku En un programa verdadero.GARCIA JIM En los descriptores XML.3 Creando Al Opening Filtran Iniciaremos con un programa del Androide mínimo creado por el plugin Eclipse.example. con botones alquiler . pero esta vez acostumbra lo Después de los valores: Project name: Sudoku Build Target: Android 1. Me gusta mantener la ventana del emulador del Androide arriba de todo el tiempo y correr lo Programe después de cada cambio.2. Creando Su Primer Programa. La primera orden de negocio es Para cambiar eso en una pantalla abridora para que el juego. Lo El nombre del paquete es en particular importante. del Androide". adelante Página 20. Si usted busca en la documentación para cualquier Androide El componente de la interfaz del usuario. El código XML es a menudo más corto Y más fácil para entender que el código correspondiente Java. crea un proyecto de "hola" nuevo ". Figura 3. Sudoku". desde que toma sólo algunos segundos. pero el consejo de Google es acostumbrar XML declarativo lo más posible. Tal como usted hizo en la Sección 1. 3. Cada aplicación en el sistema Debe tener un nombre único del paquete. y eso es Menos probablemente para cambiar en versiones futuras.6 Application name: Sudoku Package name: org. Tiene un poco su truco a cambiarlo porque es usado en tantos lugares.

los Conceptos Cruciales.app. Cuando usted le crea al Sudoku proyecto. hojas de solicitud del Androide Es una colección suelta de actividades.xml en el directorio del / layout de res (vea Figura 3. import android.main es un identificador del recurso que Se refiere al archivo del main. continúe a uno previo. infórmese Acerca del juego. cada uno del cual define a un usuario La pantalla de la interfaz. setContentView(R.xml declara la interfaz del usuario en XML. Lo Llame a setContentView () rellena el contenido de la pantalla de la actividad con Un dispositivo de vista del Androide.2. En el código previo. el Androide analiza gramaticalmente e instantiates (Infla) el recurso definido allí y los sets eso como la vista para lo La actividad actual.java: Download Sudokuv0/src/org/example/sudoku/Sudoku. } } El androide llama el método onCreate () de su actividad a inicializarlo.Activity. */ @Override public void onCreate(Bundle savedInstanceState) { super. El plug-in escogió la ruta declarativa.onCreate(savedInstanceState). Figura 3. en qué tenemos que convertirnos hace eso? Como discutidos en el Capítulo 2. public class Sudoku extends Activity { /** Called when the activity is first created.java package org. Main. R. y continuaremos a lo largo de esos Las líneas.os. En runtime.2: Los recursos iniciales en el Sudoku se proyectan . Pero en lugar de eso. así es que eso es El archivo que necesitamos modificar.Bundle.layout. y posiblemente otro La clase o dos.main). adelante paginan 27. adelante lo Después de página).sudoku.layout. Pudimos haber usado varias líneas de código Java. import android. ¿Entonces.GARCIA JIM El principio del jugador un juego nuevo.example. el Androide El plug-in hace una actividad sola para usted en Sudoku. o salida. a definir al usuario interconectan procesalmente.

. en la codificación UTF-8. public static final int hello=0x7f040000.sudoku. pero tenga códigos de escapada para personajes ASCII Como glifos japoneses.0" codificando a "utf-8"?> Todos los archivos Android XML inician con esta línea. el editor visual del layout no es tan útil. mirará Algo así como esto: /* AUTO-GENERATED FILE. Dé doble clic sobre main.example. Si usted quita o cambia un archivo del recurso. y los otros activos que son Compilado en su paquete. Vea la documentación en línea En android. La primera línea de main. A merced de cómo tiene usted que el Eclipse estableció. --> .R para todos los recursos incorporados usted enlata use. It * should not be modified by hand.xml está como Entiende: ?¿La versión del xml "1. tiene una clase de la R.xml. public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000.android.. java En el directorio del gen para usted. El plug-in nota el cambio y suma IDs del recurso en R. Usted no necesita preocuparse por sus valores. R..xml de chasquido o La etiqueta de la fuente al fondo a ver al XML. las cuerdas. } public static final class layout { public static final int main=0x7f030000. Simplemente recuerde que son agarraderas que se refieren a los datos. Note eso casi cada programa del Androide. */ package org.1 Entonces. DO NOT MODIFY.xml adentro El eclipse para abrirlo. no lo Los objetos que contienen los datos.GARCIA JIM Es importante para reparar en que la clase de la R es manejada automáticamente por ahí lo El plug-in del Eclipse del androide. Cuando usted pone un archivo en cualquier parte del directorio de res. * * This class was automatically generated by the * aapt tool from the resource data it found. ahora sabemos que tenemos que modificar main. incluyendo la base El framework del androide mismo. UTF-8 es casi exactamente como El texto normal de ASCII. } public static final class string { public static final int app_name=0x7f040001. En versiones actuales De ADT.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-. Next we see a reference to <LinearLayout>: <LinearLayout xmlns:android="http://schemas. Esos objetos no estarán soplados hasta ellos Es necesario. usted puede Vea ya sea un editor visual del layout o un editor XML. } } Los números del hex son simplemente enteros que el gerente del recurso del Androide Suele cargar los datos verdaderos. Estudiemos en sus partes el original La definición para ver lo que tenemos que cambiar. java es guardada en sync. Justamente dice al compilador que El archivo es formato XML. tan main. Si usted sube el archivo en el editor.

Algunos parámetros son comunes para todos los layouts: Los xmlns:El androide "http://schemas. Dentro de la > etiqueta < LinearLayout usted encontrará un dispositivo de niño: <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> Esto define una etiqueta del texto simple. Esto es a menudo usado en formas. Los valores posibles son llenan _ contenido del _ padre y de la envoltura.GARCIA JIM Un layout es un envase en primer lugar o más niño objeta y un comportamiento para Sitúelos en la pantalla dentro del rectángulo del objeto del padre.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas. en la primera etiqueta XML en el archivo. El androide:_ la anchura del layout "llena _ padre".android. Usted debería definir esto Una vez. Reemplacemos eso con una cierta cantidad diferente El texto y algunos botones. " RelativeLayout: Arregla a sus niños en relación a cada otro o para El padre. La ventana).com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/main_title" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/continue_label" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/new_game_label" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/about_label" /> <Button .com/apk/res/android" Define al XML namespace para Androide. Esto Es el layout más común que usted usará. " TableLayout: Ordena en filas a sus niños y columnas. parecido a Una mesa de HTML. androide:_ la altura del layout "llena _ padre" Toma la altura y anchura entera del padre (en este caso. Esto sirve para imagen y puntos de vista tabulados Los cambiadores.android. Aquí hay una lista de los layouts más comunes provistas por Androide: " FrameLayout: Los classArranges sus niños así es que todos ellos empiecen en lo Corone izquierda de la pantalla. Aquí hay nuestro primer intento: <?xml version="1. " LinearLayout: Arregla a sus niños en una fila o columna sola.

Usted puede tener versiones diferentes de esto Y otros archivos del recurso basaron en la localidad u otros parámetros tan Como la resolución de la pantalla y la orientación.xml.xml al fondo si es necesario. usamos la sintaxis del resid de la @ cuerda para referirnos a cuerdas En el archivo res/values strings.0" encoding="utf-8"?> <resources> <string name="app_name">Sudoku</string> <string name="main_title">Android Sudoku</string> <string name="continue_label">Continue</string> <string name="new_game_label">New Game</string> <string name="about_label">About</string> <string name="exit_label">Exit</string> </resources> Figura 3. En lugar de inglés duro que codifica El texto en el archivo del layout.GARCIA JIM android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/exit_label" /> </LinearLayout> Si usted ve advertencias en el editor acerca de perder restricciones de gramática (El esquema DTD o XML). Abra ese archivo ahora.3: La primera versión de la pantalla abridora . ese interruptor para lo La etiqueta del strings. y entra en esto: <?xml version="1. simplemente los ignora.

xml: <?xml version="1. Aquí está la definición de color.com/apk/res/android" android:background="@color/background" android:layout_height="fill_parent" android:layout_width="fill_parent" android:padding="30dip" android:orientation="horizontal" > <LinearLayout android:orientation="vertical" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_gravity="center" > <TextView android:text="@string/main_title" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center" android:layout_marginBottom="25dip" android:textSize="24.xml <?xml version="1.android.GARCIA JIM Ahorre strings. Hagamos el título texto más grande y centrados.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.xml así es que el Eclipse reconstruirá el proyecto. Es legible.3. la marca los botones más pequeño.5sp" /> <Button android:id="@+id/continue_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/continue_label" /> <Button android:id="@+id/new_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/new_game_label" /> <Button android:id="@+id/about_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/about_label" /> <Button . cuál Usted debería echar res/values/colors. Cuando usted corre lo Programe ahora. Y el uso un color de fondo diferente.0" encoding="utf-8"?> <resources> <color name="background">#3500ffff</color> </resources> Y aquí está el layout nuevo: Download Sudokuv1/res/layout/main. Pero se pudo uso un poco de cambios cosméticos. usted debería ver algo así como Figura 3.

Ese es el acercamiento que tomaremos aquí . @ +id/resid.4: Abriendo la pantalla con el Layout nuevo Al resultado le son mostrados en Figura 3. excepto cómo aproximadamente ¿El modo del paisaje (la pantalla ancha)? El usuario puede cambiar modos en cualquier momento. ¿Cómo arreglamos eso? Usted podría intentar ajustar el layout a fin de que surta efecto con todas las orientaciones. enloqueciendo expulse el teclado o encendiendo el teléfono su Tome partido. Por ejemplo. ¡Uy! El botón de la Salida se rebalsa lo El fondo de la pantalla (vea Figura 3. 3. eso no es a menudo posible o guía a de aspecto extraño Las pantallas. cuál acostumbraremos posteriormente a hacer Algo ocurre cuando el usuario presiona ese botón. usted necesitará crear un layout diferente para El modo del paisaje. en página 53). Figura 3. Desafortunadamente.5. así es que usted necesita manipular eso. A esta pantalla nueva le queda bien el retrato El modo (cuando la pantalla es más alta es ancha).4 Recursos Alternos Utilizadores Como una prueba.4. Cuando eso ocurre. En lugar de referir Para un recurso Idaho definió cualquier otra parte. pruebe cambiar al emulador para ajardinar modo (Ctrl +F11 o Lo 7 o 9 teclea en el teclado pequeño). éste es cómo crea usted Un recurso nuevo Idaho para el cual los otros pueden referir.GARCIA JIM android:id="@+id/exit_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/exit_label" /> </LinearLayout> </LinearLayout> En esta versión. Por ejemplo. introducimos una sintaxis nueva. @ +id / aproximadamente El botón define el Idaho para lo Acerca de botón.

xml / terrestre en layout (la nota lo .android.GARCIA JIM Figura 3.com/apk/res/android" android:background="@color/background" android:layout_height="fill_parent" android:layout_width="fill_parent" android:padding="15dip" android:orientation="horizontal" > <LinearLayout android:orientation="vertical" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_gravity="center" android:paddingLeft="20dip" android:paddingRight="20dip" > <TextView android:text="@string/main_title" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center" android:layout_marginBottom="20dip" android:textSize="24.el sufijo terrestre) que Contiene el siguiente layout: Download Sudokuv1/res/layout-land/main.xml <?xml version="1.5: En el modo del paisaje. no podemos ver el botón de la Salida.5sp" /> <TableLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center" android:stretchColumns="*" > <TableRow> . Cree un archivo designado res / main.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.

. Aun en paisaje El modo. Cada archivo alterno del recurso Debe definir set exactamente igual de IDs. en la siguiente página). queremos Para fortalecer una ventana con alguna información acerca de Sudoku. de aporte. y más. No simplemente el layout. Ahora corra lo Programe otra vez (vea Figura 3.GARCIA JIM <Button android:id="@+id/continue_button" android:text="@string/continue_label" /> <Button android:id="@+id/new_button" android:text="@string/new_game_label" /> </TableRow> <TableRow> <Button android:id="@+id/about_button" android:text="@string/about_label" /> <Button android:id="@+id/exit_button" android:text="@string/exit_label" /> </TableRow> </TableLayout> </LinearLayout> </LinearLayout> Esto utiliza a un TableLayout para crear dos columnas de botones. todos los botones es visible.6: Utilizar un layout Específico en paisaje nos deja Ver todos los botones. Figura 3.6. queriendo decir eso ya sea ellos se tocan Eso (si tienen un toque pantalla) o ellos le navegan a eso con la D-Pad (El cojincillo direccional) o trackball y prensa la selección abotonan.5 Implementando Uno Acerca de Caja Cuando el usuario hace una selección lo Acerca de botón. pixel. Vea Al Androide La documentación de recursos para una lista actual de sufijos y la herencia Las reglas 3. Ocúltele método de tamaño. de resolución. El androide soporta sufijos para la densidad de lenguaje actual. Usted puede usar sufijos del recurso para especificar versiones alternas de cualquier recursos. de la región. Por ejemplo. usted los puede usar proveer El texto localizado forma una serie en los lenguajes diferentes.

and each of the 3x3 boxes (also called <i>blocks</i>) contains the digits 1 to 9 exactly once. Le nombraremos / layout de res About.xml: Download Sudokuv1/res/values/strings.xml: Download Sudokuv1/res/layout/about. Guste la actividad principal Sudoku. Lo Acerca de la actividad debería estar definido en About. Podemos lograr esto en diferentes formas: " Defina una Actividad nueva e iníciela.xml <?xml version="1. En caso usted se pregunte. " Use la clase AlertDialog y muéstrela.xml <string name="about_title">About Android Sudoku</string> <string name="about_text">\ Sudoku is a logic-based number placement puzzle.java. Para este ejemplo. the objective is to fill the grid so that each row. Todo lo que necesita hacer es Pase sobre la disposición de setContentView () onCreate () y de llamada: . el usuario puede presionar el botón De Atrás para Descarte la ventana. </string> Note cómo puede contener un recurso de la cuerda HTML simple formateando y Pueden extenderse a lo largo de líneas múltiples.android. each column. Starting with a partially completed 9x9 grid. y la función que.GARCIA JIM Después de enrollar a través del texto. Lo Acerca de la actividad necesitará un archivo del layout.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dip" > <TextView android:id="@+id/about_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/about_text" /> </ScrollView> Necesitamos sólo una versión de este layout porque se verá fina en ambos Los modos de retrato y del paisaje. Ahora sume cuerdas para el título de lo Acerca de ventana de diálogo y el texto eso Contiene para res/values strings. " La clase de Diálogo del Androide de subclase. definamos una actividad nueva. el carácter de la barra inversa (\ ) En cuestión de _ texto impide un espacio vacío adicional de aparecer antes La primera palabra.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.

example. } } Después necesitamos alambrar todo este hasta lo Acerca de botón en la clase Sudoku.getId()) { case R. View newButton = findViewById(R. import android. About. aboutButton.about). El código usa esto como el aparato receptor..onCreate(savedInstanceState).class). correspondemos para todos los botones.setOnClickListener(this). así es que la clase Sudoku necesita implementar La interfaz OnClickListener y define un método onClick designado Download Sudokuv1/src/org/example/sudoku/Sudoku. java cuando vea @ +id / acerca de _ botón en / main. .View. exitButton.app.id. import android. */ @Override public void onCreate(Bundle savedInstanceState) { super.xml del / layout de res.view. setContentView(R.onCreate(savedInstanceState). public class About extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super. sume código para llamar a findViewById () a mirar hacia arriba uno La vista del androide dado su recurso Idaho y setOnClickListener () para decirle a Androide Cuál desaprueba cosquilleo cuando el usuario toca o da un clic sobre la vista: Download Sudokuv1/src/org/example/sudoku/Sudoku.setOnClickListener(this).os.layout.id.View.OnClickListener.setOnClickListener(this). setContentView(R.java public class Sudoku extends Activity implements OnClickListener { // . newButton.id.main).java package org.about_button).new_button).setOnClickListener(this). import android. } Mientras estamos aquí dentro.Activity. View exitButton = findViewById(R.sudoku.about_button: Intent i = new Intent(this.layout. Comience por sumar algunas importaciones que necesitaremos para Sudoku.about sea creado por el Eclipse con enchufe adentro R.id. // Set up click listeners for all the buttons View continueButton = findViewById(R. public void onClick(View v) { switch (v.content.GARCIA JIM Download Sudokuv1/src/org/example/sudoku/About. En el método onCreate ().java import android.Bundle.Intent.java /** Called when the activity is first created.view. import android. View aboutButton = findViewById(R.java: Download Sudokuv1/src/org/example/sudoku/Sudoku.id..id. Recuerde eso A las constantes les gusta _ el botón R.exit_button).continue_button). continueButton.

.7: La vista de la montaña. Eso aspecto general Oklahoma.first.xml en lo Llegue al fondo. Para este ejemplo. y haga una selección lo Acerca de botón. justamente necesitamos la clase más reciente. primero necesitamos crear una instancia de La clase Atenta. y sume una > etiqueta nueva de < actividad después de la etiqueta de cierre de la primera parte Uno: Download Sudokuv1/AndroidManifest. interruptor Para el modo XML si es necesario seleccionando la etiqueta AndroidManifest.xml <activity android:name=".GARCIA JIM startActivity(i).xml. Si usted corre El programa y selecto lo Acerca de botón ahora.. nosotros tenemos un problema Eso está registrado con el sistema y puede ser designado de cualquier aplicación Y los intentos privados (anónimo) que son usados dentro de un soltero La aplicación.8. Hay dos clases de intentos: Los intentos públicos (denominado) Figura 3.7). corra el programa otra vez.About" android:label="@string/about_title" > </activity> Ahora si usted salva el manifiesto. en lo siguiente La página. que usted obtendrá un error (vea Figura 3. usted debería ver algo así como Figura 3. excepto no haría que sea simpático si podríamos ver la pantalla inicial ¿Atrás lo Acerca de texto? Figura 3. ¿Qué pasó? Olvidamos un paso importante: Cada actividad necesita ser declarada adentro AndroidManifest. Presione el botón De Atrás (Esc en el emulador) cuando usted termina. Para hacer eso. } } } Para iniciar una actividad en Androide. // More buttons go here (if any) . break.8: La primera versión de lo Acerca de pantalla . dar doble clic sobre el archivo para abrir eso.

About" android:label="@string/about_title" android:theme="@android:style/Theme. Corriendo el programa otra vez. Download Sudokuv1/AndroidManifest. Podríamos definir nuestro tema aduanero en res/values/styles. y cambie la definición de Lo Acerca de la actividad así es que tenga una propiedad de tema.xml <activity android:name=". sino por Este ejemplo nos aprovecharemos justamente de uno predefinido.9. Reábrase al editor AndroidManifest.xml. 4 o usted puede hacer su tema subclasificando Existiendo unos y pasando sobre la disposición de sus valores predeterminados. Muchos programas necesitan menús y opciones.6 Aplicándole Un Tema Un tema es una colección de estilos que pasan sobre la disposición de la apariencia y sienten de Androide Los dispositivos.xml.Dialog" > </activity> El @ androide: El prefijo delante del nombre de estilo quiere decir que ésta es una referencia Para un recurso definido por Androide. lo Acerca de caja ahora se parece a la Figura 3. así es que las siguientes dos secciones lo harán Muéstrele cómo definirlos. Para usarlo. no uno que se definió en su El programa.GARCIA JIM 3. El androide está empacado con varios temas que usted puede La referencia por el nombre. . Los temas estaban inspirados por Hojas de Estilo Cascading (CSS) usadas Para páginas de trama _ separan el contenido de una pantalla y su presentación O el estilo.

MenuInflater..MenuItem. Primero necesitamos definir algunas cuerdas que usaremos más tarde: Download Sudokuv1/res/values/strings.</string> <string name="settings_title">Sudoku settings</string> <string name="settings_shortcut">s</string> <string name="music_title">Music</string> <string name="music_summary">Play background music</string> <string name="hints_title">Hints</string> <string name="hints_summary">Show hints during play</string> Luego definimos el menú utilizando a XML in res/menu/menu. . import android.10: Presione el botón del Menú para abrir el menú.view. Primer. Después necesitamos modificar la clase Sudoku para subir el menú simplemente Definido.xml: Download Sudokuv1/res/menu/menu. Para hacer eso.view. necesitaremos algunas importaciones más: Download Sudokuv1/src/org/example/sudoku/Sudoku.android. allí está el menú que usted obtiene Cuando usted presiona el botón físico del Menú.xml <?xml version="1. En segundo lugar.GARCIA JIM 3. en la siguiente página. import android.7 Sumando Un Menú El androide soporta dos clases de menús.xml <string name="settings_label">Settings. Abrirán un menú como el mismo en Figura 3.10. Hagámoslos a la primera clase tan tan cuando las prensas del usuario la llave del Menú.com/apk/res/android"> <item android:id="@+id/settings" android:title="@string/settings_label" android:alphabeticShortcut="@string/settings_shortcut" /> </menu> Figura 3.view. hay un contexto El menú que aparece de pronto cuando usted presiona y sujeta su dedo en la pantalla (O la prensa y el agarre el trackball o el botón del centro de D-Pad).Menu.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.java import android..

.com/apk/res/android" > <CheckBoxPreference android:key="music" android:title="@string/music_title" android:summary="@string/music_summary" android:defaultValue="true" /> <CheckBoxPreference android:key="hints" android:title="@string/hints_title" android:summary="@string/hints_summary" android:defaultValue="true" /> </PreferenceScreen> .java @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.GARCIA JIM Luego pasamos sobre la disposición del método Sudoku.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.getItemId()) { case R.inflate(R.android.menu.onCreateOptionsMenu(menu).java @Override public boolean onCreateOptionsMenu(Menu menu) { super. 3. // More items go here (if any) . Aquí está la definición para ese método: Download Sudokuv1/src/org/example/sudoku/Sudoku. MenuInflater inflater = getMenuInflater(). return true.class)).id. onOptionsItemSelected () será Designado.settings: startActivity(new Intent(this. Usted define Las preferencias en un archivo del recurso llamaron a res/xml settings.xml: <?xml version="1. Prefs. } return false. inflater. } GetMenuInflater () devuelve una instancia de MenuInflater que solemos leer La definición del menú de XML y las vueltas eso en una vista verdadera.onCreateOptionsMenu (): Download Sudokuv1/src/org/example/sudoku/Sudoku. Cuando el usuario selecciona cualquier menú ítem. menu). return true. } Prefs es una clase que vamos a definir eso exhibe todas nuestras preferencias Y deja al usuario cambiarlos.menu..8 Trasfondos de Adición El androide provee una facilidad agradable para definir lo que todas sus preferencias de programa Es y cómo exhibirlos no usando casi código.

y hágala extender a PreferenceActivity: package org.os. public class Prefs extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super. addPreferencesFromResource(R. pero lo obtuvimos gratis.xml. Figura 3.example.Bundle. Toda la persona de mucha importancia Las tomas elevadoras colocan en la clase PreferenceActivity. } } El método addPreferencesFromResource () lee la definición de trasfondos De XML y lo infla en los puntos de vista en la actividad actual. Las llaves son cuerdas constantes que serán usadas Bajo las coberteras en base de datos de preferencias del Androide.settings).preference.onCreate(savedInstanceState).11: Es poco mirar en. Después defina la clase Prefs.PreferenceActivity. import android.sudoku. import android. .GARCIA JIM El programa Sudoku tiene dos trasfondos: Uno para la música de fondo y Uno para exhibir indicios.

xml: Download Sudokuv1/res/values/arrays. Y luego entra de nuevo y se asegura de que todos ellos estén todavía listos..9 Iniciando Un Juego New Si usted ha jugado cualquier juegos Sudoku.util.Log.DialogInterface.xml: Download Sudokuv1/res/values/strings. ítem.xml: Download Sudokuv1/AndroidManifest. . selecto los Trasfondos . Hacer una selección de una lista de cosas cuesta poco esfuerzo en Androide. El código que lee los trasfondos y hace algo con ellos será Discutido en un capítulo diferente (el Capítulo 6.11).Prefs" android:label="@string/settings_title" > </activity> Sudoku ahora reestrenado. usted sabe que algunos son fáciles y Algunos son enloquecedoramente duras.0" encoding="utf-8"?> <resources> <array name="difficulty"> <item>@string/easy_label</item> <item>@string/medium_label</item> <item>@string/hard_label</item> </array> </resources> Necesitaremos algunas importaciones más en la clase Sudoku: Download Sudokuv1/src/org/example/sudoku/Sudoku. import android.xml <activity android:name=". Pruebe cambiar los valores allí y egresando el programa. Por ahora sigamos adelante hacia el botón Nuevo de Juego. Así es que cuando el usuario selecciona Juego Nuevo. Y la vigilia con asombro como la página de trasfondos Sudoku aparece (vea Figura 3.xml <?xml version="1.GARCIA JIM No olvide registrar la actividad Prefs en AndroidManifest. 3. La primera parte Necesitaremos algunas cuerdas más en res/values strings.. import android.xml <string name="new_game_title">Difficulty</string> <string name="easy_label">Easy</string> <string name="medium_label">Medium</string> <string name="hard_label">Hard</string> Cree la lista de dificultades como un recurso de conjunto imponente en res/values/arrays. prensa la llave del Menú.java import android. adelante Página 116). nosotros Quiera fortalecer una ventana de diálogo pidiéndoles a ellos que haga una selección entre tres dificultad Los niveles.AlertDialog.content.app. Almacenando Datos Locales.

array. Figura 3.string.GARCIA JIM Sume código en la declaración del interruptor del método onClick () para manipular hacer clic El botón Nuevo de Juego: Download Sudokuv1/src/org/example/sudoku/Sudoku.Builder(this) .OnClickListener() { public void onClick(DialogInterface dialoginterface. int i) { startGame(i).d(TAG. "clicked on " + i).12: La ventana de diálogo de selección de dificultad El método openNewGameDialog () se encarga de crear la interfaz del usuario Para la lista de dificultad.setItems(R. } }) .id. Download Sudokuv1/src/org/example/sudoku/Sudoku. } .java private static final String TAG = "Sudoku" .difficulty. /** Ask the user what difficulty level they want */ private void openNewGameDialog() { new AlertDialog. // Start game here..new_game_title) . } /** Start a new game with the given difficulty level */ private void startGame(int i) { Log. new DialogInterface.show().setTitle(R.new_button: openNewGameDialog().. break.java case R.

adelante lo Después de página).GARCIA JIM El método setItems () toma dos parámetros: El recurso Idaho del artículo La lista y un oyente que será designado cuando uno de los artículos es seleccionado. Cuando usted corre el programa ahora y apresura a New Juegue. así en lugar de eso cuando usted Seleccione un nivel de dificultad. abra al público la vista LogCat seleccionando Ventana > la función > el Otro View . No puedo enfatizar bastante cómo útil el leño del Androide estará durante el desarrollo. 3.13: Depurando salida en la vista LogCat . en la página previa.v (): Verboso Los usuarios nunca verán este leño.e (): Los errores " Log.7.. No vamos realmente a iniciar el juego aún.. usted puede ver la misma salida corriendo El adb logcat command. Recuerde ese error que vimos más temprano con lo Acerca de caja (la Figura ¿3.10 Depurando con Mensajes del Leño La clase del Leño provee varios métodos estáticos para imprimir mensajes de diversos La severidad nivela para el leño de sistema del Androide: " Log. tenga que usted declaró esta actividad adentro ¿Su AndroidManifest.d () El método. pasándolos a eso una cuerda de la etiqueta y un mensaje a imprimir. Si usted no está usando Eclipse. En Eclipse. No interferirá con algunos otros monitores. justamente escribimos en letras de imprenta uno depura mensaje utilizando al Log. Figura 3.13. Usted habría visto este mensaje: " ActivityNotFoundException: Incapaz Para encontrar clase explícita de actividad ..w (): Las advertencias " Log. La vista puede ser filtrada por la severidad o por la etiqueta por usted Especificado en la llamada de método.d (): Depurando " Log.. pero como un desarrollador en quien usted lo puede mirar Unas formas de la pareja de casados.i (): La información " Log. adelante mandan a llamar 58)? Si usted había abierto al público la vista LogCat en ese momento.12.5 que recomiendo usted lo inicia esta orden en uno Ponga aparte ventana y déjela correr todo el tiempo que el emulador es Corriendo.xml "? No llega un poco más simple que eso. Android LogCat (vea Figura 3. usted llegará lo La ventana de diálogo en Figura 3.

java case R.9 Los otros lectores y yo estaremos encantados de echarle una mano. break. lo centenares de manda a llamar de referencia El empuje en línea material en más profundidad en todas las clases y los métodos usados Here. En el Capítulo 4. El androide es un sistema complicado. Fast-Forward >>¡Uf. Esto cierra Derribe la actividad y control de regresos para la siguiente actividad en el Androide La pila aplicativa (usualmente la pantalla de la página principal del sitio Web). 3.7 Another gran fuente para los consejos y los trucos son Planet Android. en la siguiente página.12 Egresando el Juego Este juego realmente no necesita un botón de la Salida. el soltero el paso.8 Y Por supuesto. Explorando Gráficos del 2D. pero usted no tiene que saber todo eso para Comience.id.xml < el androide aplicativo:El icono / "el icono @ dibujable" El androide:La etiqueta _ "el nombre de la @ cuerda /aplicación" El androide:Debuggable "verdadero" Luego. permita Su proyecto para depurar por sumar al androide:Debuggable "verdadero" La opción en su archivo AndroidManifest. llamamos el método de final (). Cuando el botón de la Salida es seleccionado. Usted sumó controles Como botones y campos del texto. Instruido cómo usar archivos del layout para organizar su usuario interconectan y cómo Para destinar a recursos del Androide para texto. acostumbraremos Gráfico API del androide para dibujar las tejas para el juego Sudoku.xml:6 Haga Un Download De Sudokuv1/AndroidManifest.11 Depurando con el Debugger Además de mensajes del leño. y la vista el estado de su programa. Añádale esto a la declaración del interruptor en el método onClick (): Download Sudokuv1/src/org/example/sudoku/Sudoku. porque el usuario pueda simplemente Presione la llave De Atrás o la llave de la página principal del sitio Web para hacer algo si no.exit_button: finish(). el chasquido simplemente correcto el proyecto. le aplicaron temas para cambiar el programa La apariencia. y más. eso fue bastante para cubrir en un capítulo! A partir de rayón. Cuando usted necesita socorro. usted . usted puede usar el debugger Eclipse para colocar Los puntos de ruptura. si usted se pega usted siempre puede caer de visita por el foro de debate Para este book. Pero quise Para agregar uno para mostrarle cómo terminar una actividad. y Debug selecto Como > Androide La aplicación. y aun los menús añadidos y las preferencias por añadidura. colores. Primero.GARCIA JIM 3.

El valor más alto. Capítulo 10. verdee. pero el alfa no lo podría ser. 255). o 8 pedacitos.0" encoding="utf-8"?> <resources> <color name="mycolor">#7fff00ff</color> </resources> . 4. Usted realmente comienza a agarrar la onda de esta cosa Android. hemos cubierto la filosofía y conceptos básicos de Androide y Cómo crear una interfaz de usuario simple con algunos botones y un diálogo Boxee. 0.BLUE. 0. El alfa es una medida de diapositiva. 3D Los gráficos en OpenGL.graphics. y azule es obvio. Realmente. Comunista. comunista. uno para cada quien para alfa. Para La eficiencia. usted puede acostumbrar Uno de los métodos estáticos de la fábrica como lo siguiente: // Translucent purple color = Color. 255. Comunista. Realmente no tiene importancia lo que los valores Para RGB es. verdee. Cada componente puede tener 256 posibles Los valores. si Uno son 0.. guste esto: int color = Color. y azule (ARGB). El color Los colores del androide son representados con cuatro números. la diversión! Los buenos gráficos le pueden añadir un poquito de diversión y excitación a cualquier aplicación. los usos de código del Androide un entero en lugar de una instancia de lo Distorsione clase. usted estará levantado y dibujando inmediatamente. o Los colores semitransparentes. Para crear un color. verdee. // solid blue O si usted sabe el alfa. usted está usualmente mejor definiendo todos sus colores adentro Un archivo del recurso XML.1 tridimensional En este capítulo. Sino ¿Algo falta . El valor mínimo. cubriremos gráficos del 2D y le aplicaremos ese conocimiento Para implementar la parte de juego de nuestro ejemplo Sudoku. Esto le deja cambiarlos con holgura en un lugar Más tarde: <?xml version="1. así es que un color están típicamente apiñados en un entero de 32 pedacitos. indican el color Es completamente opaco. Si es posible. indican lo El color es completamente transparente. Los valores se destinó para en la mitad translúcido. 255. adelante mandan a llamar 191 cubrirán gráficos del 3D acostumbrando lo La biblioteca OpenGL ES. qué es eso? ¡No me digas.1 Aprendiendo los Fundamentos El androide le provee a un nativo cabal biblioteca de gráficos de dos dimensiones En su paquete de android. pone dos de ellos allí: Uno Para gráficos de dos dimensiones y uno para graphics. Con una comprensión básica de clases Como Color y Lona.argb(127.GARCIA JIM Capítulo 4 Explorando Gráficos del 2D Hasta ahora. Le dejan ver algunos de cuál es El objeto trazándose en primer plano. sin embargo. usted puede usar una de las constantes estáticas en el Color Clase. y azule números.. El androide se pone una de las bibliotecas de gráficos más energéticas disponibles uno El dispositivo móvil en sus puntas del dedo.

GARCIA JIM Usted puede establecer referencias para colores por el nombre en otros archivos XML. Usted obtiene una oportunidad para acercarse Esa lona pasando sobre la disposición del método View. Por ejemplo: cPaint.setColor(Color.mycolor). En Androide. PAINT Una de clases más importantes de la biblioteca nativa Android de gráficos es the Paint class. lo cual se desempeña como maestro de ceremonias uno La vista. los círculos. o usted los puede usar en código Java como esto: color = getResources(). Mantiene el estilo. usted quiere dibujarla En un color entero. y las formas geométricas. del texto. Los métodos en la clase de Lona le dejan dibujar líneas.getColor(R.LTGRAY). El único parámetro Para onDraw () está una lona en la cual usted puede dibujar. Esto destina el valor predefinido de color para gris ligero. como lo hicimos en el Capítulo 3. guste las diapositivas en blanco para uno El proyector aéreo.setColor (). lo cual contiene una vista llamada GraphicsView: public class Graphics extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super. Canvas La clase de Lona representa una superficie en la cual usted dibuja. u otros gráficos arbitrarios en la superficie.color. color. Aquí hay una actividad de ejemplo designada Graphics. que a su vez patrocine una Lona. y otra información necesitado Para dibujar cualquier gráficos incluyendo a bitmaps. Normalmente cuando usted pinta algo en la pantalla.onCreate(savedInstanceState). Inicialmente las lonas Póngase en marcha falto de cualquier contenido. Los rectángulos. El método getResources () devuelve la clase ResourceManager para lo La actividad actual. setContentView(new GraphicsView(this)). y los precios de venta getColor () el gerente para buscar un color Dado un recurso Idaho. la pantalla de despliegue está ocupada por una Actividad.onDraw (). } static public class GraphicsView extends View { public GraphicsView(Context context) { super(context). } @Override protected void onDraw(Canvas canvas) { // Drawing commands go here } } . Usted coloca ese color con el método Paint.

usémoslo dibujar el círculo Esboce y algún texto alrededor del interior: private static final String QUOTE = "Now is the time for all " + "good men to come to the aid of their country. circle. Desde que el círculo fue aspirado lo La dirección que gira en sentido del reloj (Direction. 20. el Androide provee un número de PathEffect Las clases que le dejan hacer cosas algo semejante como le aplica una permutación aleatoria para uno El PATH." . canvas. tPaint). Usted puede ver el resultado en Figura 4. 0. la causa toda la línea se segmenta a lo largo de un PATH a ser alisada con Las curvas o quebradas levantadas en segmentos.1. 100. el texto se traza también de ese modo. Si usted quiere traer realmente selecto. Path The Path class tiene aplicación un set de órdenes que extraen vector como líneas.CW). Figura 4. y crean otros efectos.CW). 150. Usted puede combinar drawables . Los rectángulos. Direction. con un radio de 100 Los pixeles.1: Dibujando texto alrededor de un círculo Esto define un círculo en x de la posición = 150.addCircle(150. canvas. y = 150. Aquí hay un ejemplo que define un camino circular: circle = new Path(). cPaint). Drawable En Androide.drawPath(circle.GARCIA JIM Vamos a meter algunos comandos del dibujo en el método onDraw () En la siguiente sección. Ahora que hemos definido el PATH. y las curvas. circle.drawTextOnPath(QUOTE. una clase Drawable sirve para un elemento visual como un bitmap o El color entero que está dirigido al despliegue sólo.

drawable. o usted les puede usar en dispositivos de la interfaz de usuario (para El ejemplo. como el trasfondo para un botón o la vista). " States: Un envase que muestra uno de sus drawables de niño basó adelante Su estado (una máscara mordida). Un uso podría ser un cuadro zumbable El espectador. " Scale:: Un envase para un niño dibujable que modifica su tamaño Basado en el nivel actual.android.background).2: Usando un trasfondo de la gradiente definido en XML . nosotros o podríamos referirnos a eso en XML con el androide:El trasfondo El atributo o la llamada el método Canvas. adelante lo en la otra página. Se destinó para esto uno La batería o el calibre de intensidad de señal.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.GARCIA JIM Con otros gráficos. Aquí hay un ejemplo común Donde uno dibujable está definido para ser una gradiente de un color para Otro (en este caso. basado en el Camino.2. Esto es algo uno SVG del hombre pobre. " Shape Órdenes que extraen vector. Esto le da a nuestro ejemplo GraphicsView un trasfondo agradable de la gradiente. como Mostrado de adentro Figura 4. " Levels:: Un envase que muestra sólo uno de sus drawables de niño Basado en su nivel (un rango de enteros). Se destinó para esto El trasfondo de una vista: <?xml version="1. " NinePatch: Una imagen estirable PNG. el blanco al gris).com/apk/res/android"> <gradient android:startColor="#FFFFFF" android:endColor="#808080" android:angle="270" /> </shape> Para usarlo. Drawables está casi siempre definido en XML. tan nombrada porque originalmente Dividió la imagen en nueve secciones. Drawables puede tomar una colección variada de formas: " Bitmap: Un PNG o imagen de Grupo Unido de Expertos en Fotografía. El ángulo especifica la dirección de La gradiente (manera de 270 grados llega al final para llegar al fondo). Un uso es establecer selección diversas y enfocar Los estados para botones. Figura 4.setBackgroundResource en la vista El método onCreate () como esto: setBackgroundResource(R. Se destinó para estos lo El trasfondo de botones capaz de ajustares los tamaños del bitmap. " Layers: Un envase para drawables de niño que dibujan en parte superior de cada uno Otro en una cierta z-order.

d(TAG. el juego Sudoku tuvo una pantalla de la abertura.Gravity. Cuando nosotros La izquierda que eso al final del Capítulo 3. Las llaves son cuerdas. Aquí está la definición nueva: Download Sudokuv2/src/org/example/sudoku/Sudoku.app.Dialog. Pero faltaba Una parte muy importante: ¡El juego! Usaremos los gráficos natales del 2D La biblioteca para implementar eso en parte.putExtra(Game. public static final String KEY_DIFFICULTY = "org. el Manojo. el índice del nombre de dificultad seleccionado de la lista.java package org.difficulty" . intent. Iniciando el Juego Primero necesitamos rellenar el código que echa a andar el juego.this. public static final int DIFFICULTY_HARD = 2.view. import android. .java /** Start a new game with the given difficulty level */ private void startGame(int i) { Log.util. "clicked on " + i).class).KEY_DIFFICULTY. i). Game. public static final int DIFFICULTY_MEDIUM = 1. import android. o una subclase de Serializable o Empaquetable. El Extraárea de datos es un mapa de llave /valor hace pareja eso será pasado de mano a mano Para el intento.example. y una forma para iniciar un juego nuevo. private int puzzle[] = new int[9 * 9]. Definiendo la Clase de Juego Aquí está el contorno de la actividad de Juego: Download Sudokuv2/src/org/example/sudoku/Game. import android.GARCIA JIM 4. forme en orden de hombres primitivos. Intent intent = new Intent(Sudoku. startGame () toma Un parámetro. y los valores pueden ser más primitivos Mecanografíe. } El juego en parte de Sudoku será otra actividad el Juego designado. private PuzzleView puzzleView.sudoku.app. entonces nosotros Cree un intento nuevo para empezarlo.os. Uno Acerca del diálogo boxea. public class Game extends Activity { private static final String TAG = "Sudoku" . import android.Bundle. import android.Activity. import android. public static final int DIFFICULTY_EASY = 0.Toast.Log.example. startActivity(intent). y luego llamamos al startActivity () El método para emprender la actividad nueva.2 Adición Graphics para Sudoku Es hora de aplicarle lo que hemos aprendido a nuestro ejemplo Sudoku. Metemos el número de dificultad uno El extraárea de datos previsto en el intento.sudoku.widget.

graphics.Context. Luego crea una instancia del PuzzleView La clase. "onCreate" ). puzzleView = new PuzzleView(this). int diff = getIntent().Canvas.Paint.requestFocus(). en página 90.graphics. import android.xml: Download Sudokuv2/res/values/strings. esta vez nos dejó hacerlo enteramente en Java.xml <string name="game_title">Game</string> <string name="no_moves_label">No moves</string> <string name="keypad_title">Keypad</string> Definiendo A los PuzzleView Class Después necesitamos definir la clase PuzzleView. El método calculateUsedTiles ().graphics.GARCIA JIM @Override protected void onCreate(Bundle savedInstanceState) { super.xml: Download Sudokuv2/AndroidManifest. colocando al PuzzleView como el contenido nuevo de la vista.getIntExtra(KEY_DIFFICULTY. Desde esto Es una vista con creces hecha a la medida. usa las reglas de Sudoku para resolver fuera. Aquí está el contorno: Download Sudokuv2/src/org/example/sudoku/PuzzleView. DIFFICULTY_EASY). Lo El descanso de la Historia. import android.onCreate(savedInstanceState).graphics. puzzleView.. puzzle = getPuzzle(diff). así es que necesitamos registrarla en AndroidManifest. En lugar de utilizar a un XML El layout.graphics.view. cuáles números no es válida para lo La teja porque aparezcan a otro sitio en la dirección horizontal o vertical O en el tres por tres subcuadriculado. fue más fácil de hacer esto en código que en XML.sudoku. cuál está definido en la Sección 4. import android. .Paint.4. calculateUsedTiles().KeyEvent.Game" android:label="@string/game_title" /> We also need to add a few more string resources to res/values/strings.example. import android. para Cada teja en el nueve por nueve la cuadrícula. import android.java package org.xml <activity android:name=". } // . Ésta es una actividad.Paint. import android.FontMetrics.content.Rect. import android.util.d(TAG. Log. } El método onCreate () va a traer el número de dificultad del intento Y selecciona un acertijo para jugar. setContentView(puzzleView). import android.Log.Style..

MotionEvent. int y. (int) (x * width + width).view.AnimationUtils. } . getRect(selX. selY. int h. Rect rect) { rect. Dentro de PuzzleView. "onSizeChanged: width " + width + ". int oldw.animation. } // . Log.d(TAG. height " + height). @Override protected void onSizeChanged(int w. selRect). Esto es dado el nombre por la vista es El creado y el Androide saben qué tan grande todo es. // width of one tile private float height. this.. public PuzzleView(Context context) { super(context).GARCIA JIM import android.view. import android. (int) (y * height). // X index of selection private int selY.set((int) (x * width).View. oldh). public class PuzzleView extends View { private static final String TAG = "Sudoku" . Download Sudokuv2/src/org/example/sudoku/PuzzleView. super.onSizeChanged(w. oldw.game = (Game) context. private final Game game. } private void getRect(int x. (int) (y * height + height)). int oldh) { width = w / 9f. necesitamos Implemente el método onSizeChanged (). // height of one tile private int selX. setFocusable(true).view. height = h / 9f. h. } En el constructor mantenemos una referencia para la clase de Juego y nos sedimentamos lo La opción para permitir aporte del usuario en la vista. setFocusableInTouchMode(true). import android. // Y index of selection private final Rect selRect = new Rect()..java private float width.

// Draw the selection..setColor(getResources(). En realidad. usted puede dibujar Sólo una porción pequeña de la vista tan definido por el clip de la lona El rectángulo.getColor( R. En este punto hemos creado una vista para el acertijo. background). // Draw the numbers. onDraw () pretende que usted es Recreando la pantalla entera de la nada. Para simplificar cosas.drawRect(0..puzzle_background)).GARCIA JIM Utilizamos a onSizeChanged () para calcular el tamaño de cada teja en la pantalla (1/9th de la anchura total de vista y la altura)...java @Override protected void onDraw(Canvas canvas) { // Draw the background. getHeight().xml: Download Sudokuv2/res/values/colors. canvas. // Draw the hints. Noto ésta es una coma flotante El número.. background.xml <color name="puzzle_background">#ffe6f0ff</color> <color name="puzzle_hilite">#ffffffff</color> <color name="puzzle_light">#64c6d4ef</color> <color name="puzzle_dark">#6456648f</color> <color name="puzzle_foreground">#ff000000</color> <color name="puzzle_hint_0">#64ff0000</color> <color name="puzzle_hint_1">#6400ff80</color> <color name="puzzle_hint_2">#2000ff80</color> <color name="puzzle_selected">#64ff8000</color> Aquí está el contorno básico para onDraw (): Download Sudokuv2/src/org/example/sudoku/PuzzleView. y sabemos cómo grande Es. 0. el selRect está un rectángulo al que usaremos posteriormente a seguirle la pista lo El cursor de selección. tan es posible que pudiésemos sacar en limpio un número fraccionado De pixeles. getWidth(). Comience por definir algunos colores nuevos con los que jugar en res values/colors.color.. El siguiente paso es dibujar las líneas cuadriculadas que ponen aparte las tejas adelante El pizarrón Drawing the Board El androide llama el método onDraw de una vista () cada tiempo cualquier parte de la vista Necesita ponérsele al corriente.. // Draw the board... } . El androide se encarga de hacer el esquileo para usted. Paint background = new Paint()..

canvas.getColor(R.color. light). canvas..drawLine(0.. } .drawLine(0. 0. canvas. hilite).GARCIA JIM El primer parámetro es la Lona en la cual para dibujar. i * height.color. // Draw the minor grid lines for (int i = 0. 0. 0. Paint hilite = new Paint().drawLine(i * width. i * width. i * width + 1. i < 9. getWidth(). i++) { if (i % 3 != 0) continue. hilite).setColor(getResources().drawLine(i * width + 1. Ahora sumemos el código para dibujar las líneas cuadriculadas para el BOARD: Download Sudokuv2/src/org/example/sudoku/PuzzleView. light. i * height.drawLine(0. i * height. somos Simplemente dibujando un trasfondo para el acertijo usando el _ trasfondo de acertijo El color.setColor(getResources(). // Define colors for the grid lines Paint dark = new Paint(). i++) { canvas.java // Draw the board. getHeight(). canvas. i * height + 1. i * height + 1.setColor(getResources(). getHeight(). dark.puzzle_dark)). getWidth().puzzle_light)).drawLine(0. Paint light = new Paint(). dark). i * width + 1. i * height + 1. 0.drawLine(i * width. light). getHeight(). i * width.puzzle_hilite)). hilite). getHeight(). getWidth(). canvas. En este código. i < 9. i * height + 1. hilite). canvas. i * height. getWidth().drawLine(i * width + 1. canvas. dark).color. } // Draw the major grid lines for (int i = 0.getColor(R.getColor(R. hilite.

// Draw the number in the center of the tile FontMetrics fm = foreground.setColor(getResources().FILL). Dibujando los Números El siguiente código dibuja los números de acertijo encima de las tejas.setStyle(Style. foreground. Usted puede ver lo que como éste se verá en Figura 4.3: Dibujando las líneas cuadriculadas con tres colores para crear un efecto foreground.color. Figura 4.Align. en lo siguiente La página. desde líneas dibujadas más tarde se trazará sobre la parte superior de más temprano Las líneas.puzzle_foreground)).setTextSize(height * 0.setTextAlign(Paint. Después.75f)..java // Draw the numbers.3..CENTER).setTextScaleX(width / height). foreground. Download Sudokuv2/src/org/example/sudoku/PuzzleView. necesitamos que algunos números entren en esas líneas. // Define color and style for numbers Paint foreground = new Paint(Paint.getColor( R.ANTI_ALIAS_FLAG). . La orden en la cual las líneas se trazan es Importante.getFontMetrics(). foreground. un color moreno entre el tres por tres bloques.GARCIA JIM El código destina tres colores diferentes para las líneas cuadriculadas: Un color ligero Entre cada teja. Lo La parte tramposa aquí situa cada número y dimensionado así es que va En el centro exacto de su teja. foreground. y Un color de punto de interés a cargo del borde de cada teja para hacerles a ellos verse Como tengan un poco de profundidad.

4. i < 9. y establece la proporción dimensional para equivaler al aspecto de la teja La proporción. La dirección de la x es fácil _ simplemente divide la anchura de la teja A las 2. Usted puede ver Los resultados en Figura 4.(fm.ascent + fm. . Para hacer cálculos lo El tamaño de los números. No podemos usar tamaños de pixel absoluto o del punto porque queremos lo Programe trabajar en cualquier resolución. j < 9.drawText(this. tenemos que ajustar la posición de puesta en marcha Hacia abajo un a fin de que el punto medio de la teja será el punto medio Del número en lugar de su línea de fondo.descent) / 2. foreground).getTileString(i. Sino por la dirección de la y. Eso se encarga de exhibir los números de puesta en marcha del acertijo (los givens). Usamos la biblioteca de gráficos La clase FontMetrics a decir cuánto espacio vertical la carta tomará adentro El total. le centramos en ambos la x Y las dimensiones y. establecemos la altura del carácter de imprenta para tres cuartos la altura De la teja. El Resto de () La historia. Para determinar la posición de cada número. y luego dividimos eso por la mitad para obtener el ajuste. j). j * height + y. // Centering in Y: measure ascent/descent first float y = height / 2 .GARCIA JIM // Centering in X: use alignment (and X at midpoint) float x = width / 2. for (int i = 0.4: Centrando los números dentro de las tejas Llamamos el método getTileString (definidos en la Sección 4. i * width + x. El siguiente paso es dejar al jugador entrar a sus suposiciones para todo el Los espacios en blanco.game.4. } } Figura 4. i++) { for (int j = 0. en página 90) para averiguar qué números al despliegue. j++) { canvas.

por consiguiente. . Log. selY . canvas.puzzle_selected)). case KeyEvent.. Un buen programa del Androide. break.. oye. La teja seleccionada es lo único que hará Sea modificado cuando el jugador entra en un número.drawRect(selRect.GARCIA JIM 4. necesita estar listo a soportar cualquier cosa El hardware de aporte está disponible.KEYCODE_DPAD_UP: select(selX.KEYCODE_DPAD_DOWN: select(selX.getColor( R. KeyEvent event) { Log. selected).3 Manejando Aporte Una diferencia en Androide programando _ a distinción de. una bola rastreadora. "onKeyDown: keycode=" + keyCode + ". "selRect=" + selRect). selY + 1). Podrían tener un teclado.d(TAG.java @Override public boolean onKeyDown(int keyCode. así como necesita estar listo a soportar Cualquier resolución de la pantalla. Este código dibujará lo La selección en onDraw (): Download Sudokuv2/src/org/example/sudoku/PuzzleView.setColor(getResources(). switch (keyCode) { case KeyEvent.1). uno D-pad. Paint selected = new Paint(). event=" + event).d(TAG. selected. Después proveemos una forma para conmover la selección pasando sobre la disposición del onKey Abajo de () el método: Download Sudokuv2/src/org/example/sudoku/PuzzleView.color.java // Draw the selection. Definiendo y Actualizar la Selección Primero vamos a implementar un cursor pequeño que muestra al jugador Cuál teja está actualmente seleccionada. break. Usamos el rectángulo de selección calculado más temprano en onSizeChanged () para Dibuje un color mezclado en alfa encima de la teja seleccionada. o alguna combinación de estos. iPhone La programación _ es que los teléfonos Android vienen en muchas formas y tamaños Y tiene una colección variada de métodos de aporte. una pantalla táctil.

min(Math. event).java private void select(int x. selY. getRect(selX.GARCIA JIM Figura 4. 0). } . calculamos la y y x nueva coordinadas La selección y luego vuelva a usar a getRect () a calcular la selección nueva El rectángulo. o correcto. invalidate(selRect).min(Math.1.KEYCODE_DPAD_RIGHT: select(selX + 1. 8). selX = Math. selY). } return true. } Si el usuario tiene un cojincillo direccional (D-Pad) y ellos presionan lo levantado.KEYCODE_DPAD_LEFT: select(selX . default: return super. selY = Math. case KeyEvent. podemos salir Eso fuera para este ejemplo. nosotros la llamada selecta () para mover el cursor de selección en eso La dirección. 0). break. voluntad del Androide Tradúzcalos a Eventos de D-Pad automáticamente.onKeyDown(keyCode.max(y. Download Sudokuv2/src/org/example/sudoku/PuzzleView. selY). int y) { invalidate(selRect).max(x. Por consiguiente. ¿Cómo acerca de una bola rastreadora? Podríamos pasar sobre la disposición del método onTrackballEvent () Pero resulta que si usted no maneja Eventos de la bola rastreadora.5: Dibujando y conmoviendo la selección case KeyEvent. selRect). break. Dentro del método de primera calidad (). 8). abajo de El botón izquierdo.

Ahora proveamos una forma que el jugador debe entrar en un número nuevo en lo La teja seleccionada.java @Override public boolean onTouchEvent(MotionEvent event) { if (event.KEYCODE_5: setSelectedTile(5).showKeypadOrError(selX. case KeyEvent. break. justamente le añadimos algunos casos más al onKey Abajo de (0 o la manera del espacio se borran () el método para los números 0 a través de 9 El número).d(TAG. selY). case KeyEvent. Lo Los rectángulos sucios se convierten en la región del clip. usted acostumbra lo invalida () método para marcar Los rectángulos tan sucio.KEYCODE_3: setSelectedTile(3). Éste es un punto importante: Nunca llame cualquier dibujo en el que las funciones deducen excepción El método onDraw (). cuál estará definido más tarde: Download Sudokuv2/src/org/example/sudoku/PuzzleView. case KeyEvent.KEYCODE_2: setSelectedTile(2).KEYCODE_SPACE: setSelectedTile(0). case KeyEvent. (int) (event.ACTION_DOWN) return super. pasamos sobre la disposición del método onTouchEvent () y mostramos lo mismo El teclado pequeño.KEYCODE_1: setSelectedTile(1).GARCIA JIM Me fijo las llamadas de dos a invalidar ().onTouchEvent(event). En la página precedente) las necesidades a ser vueltas a dibujar. El segundo invalida () llamada Dice que el área nuevo (en la derecha de la figura) de selección necesita ser Vuelto a dibujar también. selY). case KeyEvent. case KeyEvent.java case KeyEvent. break. Para el toque. revisamos en busca de la Interlineación o botón central de D-Pad En onKeyDown () y hágale fortalecer un teclado pequeño que deja al usuario hacer una selección Cuál numera para colocar. break. case KeyEvent. case KeyEvent.5. El gerente de la ventana combinará todos los rectángulos sucios En algún punto en el futuro y la llamada onDraw otra vez para usted ().KEYCODE_4: setSelectedTile(4). "onTouchEvent: x " + selX + ". Realmente no dibujamos nada aquí. break. y " + selY). case KeyEvent. select((int) (event. Entrando en Números Para manejar aporte del teclado.getY() / height)).showKeypadOrError(selX. return true.KEYCODE_7: setSelectedTile(7). En lugar de eso. case KeyEvent. break. Download Sudokuv2/src/org/example/sudoku/PuzzleView. Log.getX() / width). así es que la pantalla actualiza es optimizado Para sólo esas áreas que cambian.KEYCODE_8: setSelectedTile(8).KEYCODE_9: setSelectedTile(9). break. game.KEYCODE_ENTER: case KeyEvent.KEYCODE_DPAD_CENTER: game. } .KEYCODE_6: setSelectedTile(6). break. El primero le dice a Android que lo El área al amparo del rectángulo viejo de selección (en izquierda de Figura 4. break. break.KEYCODE_0: case KeyEvent. Para soportar la D-Pad. break. break.getAction() != MotionEvent.

4. j.getUsedTiles(i. Sumando Indicios Cómo la lata que ayudamos el jugador a expulsar un poco fuera solucionando el acertijo entero ¿Para ellos? Cómo acerca de si dibujamos el trasfondo de cada teja diferentemente A merced de cuántas maniobras posibles tiene.puzzle_hint_2). todas las carreteras llevarán de regreso a una llamada para setSelectedTile () para el cambio El número en una teja: Download Sudokuv2/src/org/example/sudoku/PuzzleView. canvas. tile)) { invalidate().getColor(R. es menester porque cualquier números nuevos sumados o removieron fuerza Cambie los indicios que estamos a punto de implementar en la siguiente sección.d(TAG. j). getResources(). hint). j++) { int movesleft = 9 . for (int i = 0. en página 90.// may change hints } else { // Number is not valid for this tile Log. hint.puzzle_hint_1). if (movesleft < c.getColor(R. i++) { for (int j = 0. Añádale esto a onDraw () Antes de provocar la selección: Download Sudokuv2/src/org/example/sudoku/PuzzleView. Eso marca el todo ¡Filtre tan sucio.java public void setSelectedTile(int tile) { if (game. } } } .GARCIA JIM Finalmente. en esto El caso.game. getResources()..color.setColor(c[movesleft]).color. lo cual viola mi consejo más temprano! Sin embargo. // Pick a hint color based on #moves left Paint hint = new Paint(). r).length.setTileIfValid(selX. }.drawRect(r. selY. } } Los métodos showKeypadOrError () y setTileIfValid () estarán definidos adentro Sección 4.. Rect r = new Rect().color. Note la llamada para invalidar () sin parámetros. j < 9. i < 9. El Resto de Historia. int c[] = { getResources().java // Draw the hints.puzzle_hint_0).length) { getRect(i.getColor(R. "setSelectedTile: invalid: " + tile).

Si allí Son maniobras de cero. tan uno ¿Numere eso ya aparece en el tres por tres bloque? Simplemente por diversión. Hagamos la pantalla contonearnos de acá para allá cuando hacen eso. Primero nosotros Añádale una llamada al caso inválido de número en setSelectedTile ().d(TAG.shake)). un.android.000 milisegundos (1 segundo) por ahí 10 pixeles de un lado para otro.com/apk/res/android" android:fromXDelta="0" android:toXDelta="10" android:duration="1000" android:interpolator="@anim/cycle_7" /> .xml <?xml version="1.java // Number is not valid for this tile Log. en la siguiente página. La lata que usted divisa ¿El error (s) hecho por el jugador?2 Sacudiendo Con Fuerza Cosas Qué ocurre si el usuario intenta entrar en un número obviamente inválido. Download Sudokuv2/src/org/example/sudoku/PuzzleView. Download Sudokuv2/res/anim/shake. "setSelectedTile: invalid: " + tile).anim. R.anim.6: Las Tiles son resaltado basado de adelante cuántas los valores posibles La teja puede tener.loadAnimation(game. y dos maniobras posibles. definido en res anim/ Shake.xml.shake. startAnimation(AnimationUtils. El resultado se parecerá a la Figura 4.6.GARCIA JIM Destinamos a tres estados para el cero. eso quiere decir que el jugador ha hecho algo incorrectamente y Necesita volver hacia atrás. eso sacude la pantalla para 1. Esto carga y corre un recurso designado R.0" encoding="utf-8"?> <translate xmlns:android="http://schemas. Figura 4.

xml del / layout de res: Download Sudokuv2/res/layout/keypad. comenzando con el Teclado Pequeño La clase. Exhibe Una cuadrícula de los números 1 a través de 9 en una actividad encima de los que aparece El acertijo.com/apk/res/android" android:cycles="7" /> Esto particular causará que la animación ser repetido siete veces.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android. Download Sudokuv2/res/anim/cycle_7. Estas pedazos son necesarias que el programa compile y Opere pero no tenga nada que ver con gráficos. Siéntase en libertad para saltarse delante para Sección 4.5. en página 99 si Ud.GARCIA JIM El número de por para correr la animación y la velocidad y la aceleración De la animación es controlado por un interpolador de animación Definido en XML.android.xml <?xml version="1.4 El Resto de Historia Ahora regresemos y la corbata arriba de algunos cabos sueltos. Haciendo Más Mejoras. Creando el Teclado Pequeño El teclado pequeño es conveniente para teléfonos que no tienen teclados.com/apk/res/android" android:id="@+id/keypad" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:stretchColumns="*" > <TableRow> <Button android:id="@+id/keypad_1" android:text="1" > </Button> <Button android:id="@+id/keypad_2" android:text="2" > </Button> <Button android:id="@+id/keypad_3" android:text="3" > </Button> </TableRow> <TableRow> <Button android:id="@+id/keypad_4" android:text="4" > .xml <?xml version="1. El propósito entero de la ventana de diálogo del teclado pequeño es regresar uno El número seleccionado por el jugador. quiere.0" encoding="utf-8"?> <cycleInterpolator xmlns:android="http://schemas. 4. Aquí está el layout de la interfaz de usuario de / keypad.

puzzleView = puzzleView. private View keypad.onCreate(savedInstanceState). private final int useds[]. } @Override protected void onCreate(Bundle savedInstanceState) { super.keypad). import android.os.Bundle. this.example.layout. import android.useds = useds.Context.view. import android. private final PuzzleView puzzleView.string.app. . public class Keypad extends Dialog { protected static final String TAG = "Sudoku" . import android. setContentView(R.view.Dialog.View.GARCIA JIM </Button> <Button android:id="@+id/keypad_5" android:text="5" > </Button> <Button android:id="@+id/keypad_6" android:text="6" > </Button> </TableRow> <TableRow> <Button android:id="@+id/keypad_7" android:text="7" > </Button> <Button android:id="@+id/keypad_8" android:text="8" > </Button> <Button android:id="@+id/keypad_9" android:text="9" > </Button> </TableRow> </TableLayout> Después definamos la clase del Teclado Pequeño.content. setTitle(R. this. import android. private final View keys[] = new View[9]. findViews(). PuzzleView puzzleView) { super(context). public Keypad(Context context.sudoku.KeyEvent. Aquí está el contorno: Download Sudokuv2/src/org/example/sudoku/Keypad.keypad_title). int useds[].java package org.

} setListeners(). i < keys. OnClickListener(){ public void onClick(View v) { returnResult(0).keypad_7). keys[0] = findViewById(R. keys[5] = findViewById(R. keys[4] = findViewById(R. } Los lazos setListeners () a través de todas las llaves del teclado pequeño y los sets un oyente para Cada uno. keys[3] = findViewById(R. keys[2] = findViewById(R.setOnClickListener(new View.INVISIBLE).keypad_9).id.setVisibility(View.keypad_2). También coloca a un oyente para la ventana principal del teclado pequeño: Download Sudokuv2/src/org/example/sudoku/Keypad. keypad.id.GARCIA JIM for (int element : useds) { if (element != 0) keys[element .id.1].id.keypad_5). } // . keys[i]. en lo siguiente La página).keypad_4). keys[8] = findViewById(R.id.. keys[6] = findViewById(R.id. keys[1] = findViewById(R.OnClickListener(){ public void onClick(View v) { returnResult(t). } Figura 4.7.setOnClickListener(new View.id.7: Los valores inválidos están escondidos en la vista del teclado pequeño.id. luego hace el número invisible adentro La cuadrícula así es que el jugador no lo pueda seleccionar (vea Figura 4. keys[7] = findViewById(R.keypad_8).java private void setListeners() { for (int i = 0. El método findViews () va a traer y ahorra las vistas para todo el El teclado pequeño teclea y la ventana principal del teclado pequeño: Download Sudokuv2/src/org/example/sudoku/Keypad. }}).id.. } Si un número particular no es válido (por ejemplo. el mismo número Ya aparece en esa fila). }}). } . i++) { final int t = i + 1.keypad_6).length.keypad_3).id.java private void findViews() { keypad = findViewById(R.keypad_1).keypad).

break. break.java @Override public boolean onKeyDown(int keyCode. luego returnResult () es designado Con un cero. case KeyEvent. break. } . break. break. case KeyEvent. El método isValid () hace una consulta para ver si el número dado es válido para La posición actual: Download Sudokuv2/src/org/example/sudoku/Keypad. KeyEvent event) { int tile = 0.onKeyDown(keyCode.KEYCODE_6: tile = 6.KEYCODE_0: case KeyEvent. break. case KeyEvent. case KeyEvent.GARCIA JIM Cuando el jugador selecciona uno de los botones en el teclado pequeño.KEYCODE_8: tile = 8.KEYCODE_4: tile = 4. Si el jugador Selecciona un lugar que no tiene un botón. case KeyEvent. } return true. break.KEYCODE_3: tile = 3. De otra manera. llama por teléfono El método returnResult () con el número para ese botón.KEYCODE_1: tile = 1. case KeyEvent. } if (isValid(tile)) { returnResult(tile). } return true. break.java private boolean isValid(int tile) { for (int t : useds) { if (tile == t) return false. default: return super. switch (keyCode) { case KeyEvent. case KeyEvent. event). indicando la teja debería ser borrado.KEYCODE_9: tile = 9. case KeyEvent.KEYCODE_5: tile = 5. OnKeyDown () es designado cuando el jugador usa el teclado para entrar uno El número: Download Sudokuv2/src/org/example/sudoku/Keypad. break. } Si el número vale para la teja actual. el teclazo está ignorado.KEYCODE_2: tile = 2. break.KEYCODE_SPACE: tile = 0. case KeyEvent.KEYCODE_7: tile = 7. luego llama a returnResult ().

en particular con determinar cuáles es y no es maniobras válidas De acuerdo con las reglas. "showKeypad: used=" + toPuzzleString(tiles)).java /** Return the chosen tile to the caller */ private void returnResult(int tile) { puzzleView. int y) { int tiles[] = getUsedTiles(x. Toast. puzzleView).setSelectedTile(tile). llamémoslo en la clase de Juego y recuperemos El resultado: Download Sudokuv2/src/org/example/sudoku/Game. y).show(). cambia la teja Sólo si el valor previsto es válido. 0. 0). El método returnResult () se siente llamado a devolver el número seleccionado para lo Llamando actividad Download Sudokuv2/src/org/example/sudoku/Keypad. if (tiles.java /** Change the tile only if it's a valid move */ protected boolean setTileIfValid(int x. } else { Log. Dadas una x y y sitúan y el valor nuevo de una teja.CENTER.string. y). Download Sudokuv2/src/org/example/sudoku/Game.length == 9) { Toast toast = Toast. int value) { int tiles[] = getUsedTiles(x. } Llamamos el método PuzzleView. R. int y. v.no_moves_label.java se preocupa por la lógica de lo El juego. toast. } } Para decidir cuáles números son posibles.java /** Open the keypad if there are any valid moves */ protected void showKeypadOrError(int x. Implementando la Lógica de Juego El resto de código en Game. El método setTileIfValid () es una parte crucial de eso.setSelectedTile () a cambiar la corriente del acertijo La teja.setGravity(Gravity. columna. Lo descarta llamada termina la ventana de diálogo del Teclado Pequeño.makeText(this. toast. tiles. Ahora que tenemos la actividad.LENGTH_SHORT). pasamos el Teclado Pequeño una cuerda adentro El Extraárea de datos conteniendo todos los números que ya han sido Usado. dismiss(). Dialog v = new Keypad(this. o bloque.d(TAG. luego no es válido porque lo mismo El número está ya usado en la fila actual.GARCIA JIM Si aparece en el conjunto imponente usado. if (value != 0) { for (int tile : tiles) { .show().

/** Return cached used tiles visible from the given coords */ protected int[] getUsedTiles(int x. calculateUsedTiles().java Line 1 /** . y < 9. y) en cada posición En el nueve por nueve cuadriculado: Download Sudokuv2/src/org/example/sudoku/Game.if (i == y) . así es que escondemos en reserva El conjunto imponente y lo calcula de nuevo sólo cuando necesario llamando por teléfono haga cálculos UsedTiles (): Download Sudokuv2/src/org/example/sudoku/Game.GARCIA JIM if (tile == value) return false. x < 9. Para Cada posición. } Para detectar maniobras válidas. } } setTile(x. y++) { used[x][y] = calculateUsedTiles(x. y). value). creamos un conjunto imponente para cada teja en la cuadrícula.int . x++) { for (int y = 0.d(TAG. mantiene una lista de lleno en tejas que son actualmente visibles De esa posición. int y) { c[] = new int[9]. Si un número aparece en la lista. i++) { 5 for . El método getUsedTiles () recupera esa lista para Una posición dada de la tiles Download Sudokuv2/src/org/example/sudoku/Game. horizontal (int i = 0. y.private . i < 9. luego no será Válido para la teja actual.java /** Compute the two dimensional array of used tiles */ private void calculateUsedTiles() { for (int x = 0. } } } CalculateUsedTiles () simplemente llamada calculateUsedTiles (la x. "used[" + x + "][" + y + "] = " // + toPuzzleString(used[x][y])). }: El conjunto imponente de tejas usadas está algo caro para computar.// Compute the used tiles visible from this position */ int[] calculateUsedTiles(int x. int y) { return used[x][y]. return true.java /** Cache of used tiles */ private final int used[][][] = new int[9][9][]. // Log.

i++) { . y si una teja son ocupadas. (int t : c) { (t != 0) . hacemos lo propio para todas las tejas en la misma vertical La columna.for 35 if .1] = t.int .if t = getTile(i.c[t 30 } -} .continue.int .GARCIA JIM . .// compress nused = 0. y). -} .int .// vertical (int i = 0.c1[nused++] -} . (int i = startx. .if t = getTile(i.int c1[] = new int[nused].continue.1] = t. comprobamos todas las tejas adelante La misma fila horizontal como la teja actual. iniciando en línea 33. .nused++. 10 c[t -} . = 0. Comenzamos con un montón de nueve ceros. j < starty + 3. nosotros Rellene su número en el conjunto imponente: En línea 13. . j++) { (i == x && j == y) . i). y en línea 21. i++) { (int j = starty. es condensar los ceros fuera de lo . . starty = (y / 3) * 3.int . . i < 9. El último paso. i < startx + 3.nused 40 for . (t != 0) . correspondemos para tejas en el tres a las tres Bloquéese.for 25 if same cell block startx = (x / 3) * 3. .if (int t : c) { (t != 0) = t.for . En línea 5.int .c[t -} 20 // .int .if t = getTile(x. (t != 0) .if (i == x) 15 continue. j).1] = t.return 45 } c1.for . (t != 0) .

java /** Convert an array into a puzzle string */ static private String toPuzzleString(int[] puz) { . Hacemos así de así que array. // TODO: Continue last game switch (diff) { case DIFFICULTY_HARD: puz = hardPuzzle. case DIFFICULTY_MEDIUM: puz = mediumPuzzle.length puede ser usado para Rápidamente diga todo cuántas tejas usadas son visibles de la posición actual. private final String mediumPuzzle = "650000070000506000014000005" + "007009000002314700000700800" + "500000630000201000030000097" . medianos de dificultad. case DIFFICULTY_EASY: default: puz = easyPuzzle. private final String hardPuzzle = "009000000080605020501078000" + "000000700706040102004000000" + "000720903090301080000000600" . Download Sudokuv2/src/org/example/sudoku/Game. break.java /** Given a difficulty level. mediumPuzzle. Download Sudokuv2/src/org/example/sudoku/Game. GetPuzzle () simplemente toma un nivel de dificultad y devuelve un acertijo: Download Sudokuv2/src/org/example/sudoku/Game. come up with a new puzzle */ private int[] getPuzzle(int diff) { String puz. Misceláneo Aquí hay algunas otras funciones de utilidad y otras variables tan redondas fuera de lo La implementación. } Más tarde cambiaremos a getPuzzle () para implementar uno continúa función.GARCIA JIM El conjunto imponente antes de nosotros el regreso eso. ToPuzzleString () convierte un acertijo de un montón de enteros a una cuerda. } return fromPuzzleString(puz).java private final String easyPuzzle = "360000000004230800000004200" + "070460003820000014500013020" + "001900000007048300000000045" . y hardPuzzle son nuestro hardcoded Sudoku se intriga para niveles fáciles. break. y duros. easyPuzzle. break. FromPuzzleString () hace lo contrario.

hay Alójese para la mejora. Devolverá ya sea una cuerda Con el valor de la teja o una cadena vacía si la teja estuviera en blanco. else return String. .length. Download Sudokuv2/src/org/example/sudoku/Game. } El método getTile () toma posiciones de la x y y y devuelve el número Actualmente ocupando esa teja. } Una vez todas estas pedazos están en el lugar. i++) { puz[i] = string. for (int i = 0.toString().length()]. Al igual que con cualquier código. for (int element : puz) { buf. usted debería tener a un Sudoku tocable El juego. Haga la prueba que para asegurarse surte efecto. int y) { return puzzle[y * 9 + x].append(element). sin embargo. int y) { int v = getTile(x. int y.GARCIA JIM StringBuilder buf = new StringBuilder(). } /** Convert a puzzle string into an array */ static protected int[] fromPuzzleString(String string) { int[] puz = new int[string.valueOf(v). } return buf. int value) { puzzle[y * 9 + x] = value. y). Download Sudokuv2/src/org/example/sudoku/Game.java /** Return a string for the tile at the given coordinates */ protected String getTileString(int x. } return puz. eso quiere decir que la teja está en blanco. Si es cero. } GetTileString () es usado al exhibir una teja.charAt(i) . i < puz.'0' .java /** Return the tile at the given coordinates */ private int getTile(int x. if (v == 0) return "" . } /** Change the tile at the given coordinates */ private void setTile(int x.

el método onDraw () es un mismo performancecritical El pedazo de código. Allí usted encontrará información en relación a la forma de usar gráficos 3D del Androide La biblioteca. en página 191. En particular. programas más complicados probablemente necesitará ser más Cuidadosamente escrito para apretar la última gota de función fuera Del dispositivo. Si usted Quiera hacer un producto de primera clase. realzaremos el programa Con una música pequeña de estado de ánimo. Aquí hay algunas ideas para apresurar la marcha de este método: " Si es posible. como la anchura regresó por ahí GetWidth (). Multimedia. vaya de seguro a aprovecharse de los tooltips. De otra manera.graphics3 entra mucho Más detalle si usted lo necesitara. y justamente use instancias existentes En onDraw (). veremos cómo recordar el estado de acertijo y finalmente Implemente ese botón Continue. Lo La documentación en línea para el paquete del android. usted Podrían sumar algunos fuegos artificiales cuando el jugador soluciona el acertijo o marca lo Las tejas dan vueltas como Vanna White. 3D Graphics en OpenGL. así es que es mejor hacer lo menos posible allí. La biblioteca natal del 2D es muy grande. justamente rascamos la superficie de los gráficos de Androide Las capacidades. " Cree sus objetos Paint arriba de parte delantera. usted puede querer mirar Delante un Capítulo mordido y leído 10. Almacenando Datos Locales. le aliento a pensar cómo Usted podría hacer el juego Sudoku gráficamente más rico. . 4. que se basa en el estándar OpenGL ES.6 de Avances Rápidos En este capítulo.5 Haciendo Más Mejoras Aunque el código presentado en este capítulo funciona aceptablemente para Un juego Sudoku. recupere el valor al principio del método y Luego acceda a eso de su copia local. autoterminación. adentro El constructor de la vista). Y Javadoc proveyó por el plug-in del Eclipse del Androide. " Las cosas Prefetch como las constantes de color a otro sitio (por ejemplo. Un trasfondo en movimiento atrás El acertijo podría ser interesante. " Pues los valores acostumbraron las veces múltiples.GARCIA JIM 4. para usted es realmente Escribir sus programas. y en el Capítulo 6. En página 116. En el Capítulo 5. Como un más ejercicio para el lector. Si su programa necesita gráficos más adelantados. los toques como éste pueden sumar espíritu vigoroso para Uno de otra manera oferta común. Deje su imaginación salirse de control. evite hacer cualquier dotaciones del objeto en el método OnDraw (). recurra a El siguiente capítulo para una introducción para el mundo maravilloso de Androide El audio y el video. Por ejemplo. en la siguiente página.

usted puede acostumbrar audio para respaldarlo eso y reforzarlo. El populacho se sale de control como el Estado hunde un tres puntero con Un segundo quedando.1 Jugando con Audio Fue una noche oscura y tempestuosa.1 Music. pero si Usted lo hace correctamente.. ... Las pistas audias permean el ambiente y establecen el tiempo para nuestras emociones. Este capítulo le mostrará cómo añadirle multimedios a su Android La aplicación. Simplemente Como usted use gráficos en el despliegue para transportar alguna información para lo El usuario. y Partieron.2 Nos Dejó probarlo con un ejemplo simple Eso juega sonidos cuando usted pulsa una tecla en el teclado o D-Pad. Piense acerca de sonido tan otra forma de meterse en la cabeza de su usuario. usted al menos puede poner sonrisas en sus caras...media package. los efectos de sonido... y el video Pueden hacer sus programas más immersive y cautivador que texto y Los gráficos a solas. El androide soporta salida del sonido y de música a través del MediaPlayer La clase en el android. Usted no puede tener a sus usuarios haciendo cabriolas en los pasillos. 5.GARCIA JIM Capítulo 5 Multimedia Recuerdo esos anuncios de la televisión Apple con las personas de la silueta bailando ¿Salvajemente para la pulsación de sus iPods? Esa es el tipo de excitación Usted quiere sus productos para generate... Allí se vuelve el disparo que empieza.

Comenzaremos por crear un "hola.6 Application name: Audio Package name: org. Abotone. usar lo siguiente Los parámetros en el diálogo Nuevo de Proyecto del Androide boxean: Project name: Audio Build Target: Android 1. File seleccionado > Salvo Tan . Para este ejemplo.1: guardando efectos de sonido en un formato comprimido que Android puede La obra teatral. del menú. y seleccionado un Androide del formato puede reconocer (vea Figura 5. creé mi propio Con el programa de la Grabadora de Sonidos de Ventanas (el Principio > Programa > Accesorios > la Grabadora de Sonidos de entretenimiento en Ventana XP) y uno barato El casco auricular.1). dio un clic sobre el Vuelto .... registré a cada uno Suene.audio Create Activity: Audio Después necesitaremos que algunos sonidos jueguen. Androide" proyecto. Después de entender bien los niveles cuerdos. .example..GARCIA JIM Figura 5. Usted puede encontrar todos los archivos en buen estado y código de la fuente para estos ejemplos adelante El sitio Web del libro.

. Copie los archivos en buen estado en los res rawdirectory de su proyecto. el proyecto Debería parecerse a la Figura 5. en página 37. simplemente copiándose uno El archivo en el directorio de res causa el Eclipse del Androide con enchufe para definir Un símbolo Java para usted en la clase de la R. Como usted Recuerde de Sección 2.2: Copie archivos audios en los res directorio / directorio de su proyecto. Ahora es hora de complementar la actividad Audia. Usando Recursos. Cuando usted termina. Primero declaramos a un MediaPlayer nuevo La instancia para cada sonido e inicializa las instancias en el onCreate ( ) El método.4.GARCIA JIM Figura 5.2.

OGG Los archivos parecen surtir efecto mejor pues los clips pequeños les gustan los efectos de sonido de juego.down). down.MediaPlayer. muchos de su Los usuarios van a enchufar audífonos (guste a un iPod). R. Sin embargo. hay soporte en el emulador.main).1kHz 16 bit stereo. } } . 22kHz.Bundle.onCreate(savedInstanceState).s). import android.raw.create(this.create(this.raw. R.raw.audio. setContentView(R. right. down = MediaPlayer. R. d = MediaPlayer. Recuerde eso Aunque el teléfono puede tener a un orador diminuto.layout.create(this. O 44. f = MediaPlayer.raw.raw. Desde que los archivos WAV a ese paso son enormes. R.java package org.os.create(this. left. De Android El formato audio natal parece ser estéreo de 16 pedacitos 44. R. import android. d. import android. Download Audio/src/org/example/audio/Audio.up). R. el Androide Soportes los siguientes tipos del archivo (esto está sujeto a cambiar con Las liberaciones nuevas): " WAV (la modulación por impulsos codificados no condensada) " AAC (el formato del iPod de la Manzana. a = MediaPlayer.Activity.enter).media.view.raw. private MediaPlayer a. WAV.create(this.f).1kHz probando tasas con la mejor intención resulta.raw. @Override public void onCreate(Bundle savedInstanceState) { super. usted justamente debería atascarse Para OGG o archivos MP3 (monopara voz o estéreo para la música).example.raw. Y hay soporte en los dispositivos reales.d). y formatos MP3 Marche bien en el emulador. enter = MediaPlayer. s = MediaPlayer.left).right). // Native rate is 44. hay soporte en periódico. R. sin protección) " MP3 (MPEG-3) " WMA (los medios de comunicación de Ventanas audios) " AMR (el codificador-decodificador de Discurso) " OGG (Ogg Vorbis) " MIDI (los Instrumentos) En realidad.create(this. f.create(this. import android. y así esos son los únicos Que puedo recomendar para el desarrollo aplicativo. s.a).KeyEvent. así Usted quiere su audio para ser calidad alta.raw. public class Audio extends Activity { private MediaPlayer up. R. he encontrado eso sólo el OGG. En periódico. Uso 11kHz. right = MediaPlayer. left = MediaPlayer.create(this.create(this.1kHz.app. but // to save space we just use MPEG-3 22kHz mono up = MediaPlayer.GARCIA JIM ¿Qué Formatos Audios Hace el Soporte del Androide? Pues bien. Manténgase lejos de tasas inusuales como 8kHz porque el remuestreo El artifactsmake ese sonido de tasas terrible. enter. R.

le recomiendo vara con el método probado y verdadero de Haciendo caer en una trampa a sus jugadores con anticipación y jugándolos cuando necesitado. 35 } .KEYCODE_DPAD_UP: .break.KEYCODE_DPAD_LEFT: . 30 case KeyEvent.mp = d. Otro método que usted puede estar tentado de probar es crear a un MediaPlayer nuevo Cada vez que usted quiere hacer sonido.mp.java Line 1 @Override .case KeyEvent. . 20 break.case KeyEvent. Sin embargo. .KEYCODE_F: .onKeyDown ().mp = a. Adentro Mi experimentación que tiene una tendencia a chocar después de jugar simplemente algunos sonidos. esto no trabaja En la práctica.case KeyEvent.mp = down.default: . .GARCIA JIM Hay otras formas para hacer esto. . .break. Download Audio/src/org/example/audio/Audio.onKeyDown(keyCode. Ahora que tenemos nuestros sonidos cargados y todo listo. . .return super.mp = up. desacelera el programa abajo de uno pequeño.break. .return . . .case KeyEvent.mp = left.public boolean onKeyDown(int keyCode.case KeyEvent. usted podría declarar uno MediaPlayer y mantenimiento reusándolos.case KeyEvent. .KEYCODE_S: 25 mp = s.mp = f.KEYCODE_DPAD_CENTER: . event).KEYCODE_DPAD_RIGHT: 15 mp = right. Por consiguiente.break. KeyEvent event) { . Hacemos eso por ahí Pasando sobre la disposición del método Activity. . Esto impediría sonidos de traslapar. 10 break. . .mp.switch (keyCode) { 5 case KeyEvent.break.mp = enter. que puede o no puede ser el efecto que usted quiere.case KeyEvent.case KeyEvent. .break.start(). . .KEYCODE_DPAD_DOWN: .MediaPlayer mp.break.KEYCODE_A: .seekTo(0).KEYCODE_ENTER: . justamente necesitamos Para interceptar las prensas cruciales y jugar los sonidos correctos. Peor. En primer lugar. Por ejemplo. . Sin embargo.KEYCODE_D: .

6 Application name: Video Package name: org.5.263 es el formato de vídeo recomendable Porque cada plataforma del hardware lo soporta y eso es relativamente Eficiente para codificar y descifrar.263 (3GP) " H.GARCIA JIM La primera parte del método selecciona un Transmisor de Medios basado en el cual la llave Usted presionó. Para demostrar eso. MediaPlayer del androide que la clase trabaja con video en la misma forma que hace Francamente audio. llamamos el método seekTo al que darle cuerda () El sonido y el método de principio () para comenzar a jugarlos. Si usted No oiga nada. Es también compatible Otros dispositivos como el iPhone. 5. jugaremos una película usando sólo una línea de código. pero no le establezca así es que muja que usted sacrifica calidad.video Create Activity: Video . Usted puede usar el principio () y puede detenerse () Los métodos para controlar sonido pregrabado.2 Jugando Video El video es más que simplemente un montón de cuadros mostrado justo después Otro. usted debería oír un sonido. compruebe su control del volumen (no se ría). La única diferencia es que usted necesita crear una Superficie para El jugador a soler provocar las imágenes. No voy a mostrarle otro ejemplo MediaPlayer. H. Use la resolución mínima y la tasa en bits para la que usted usa Ahorre espacio. quiere. Si Ud. sin embargo. y el sonido tiene que estar estrechamente sincronizado Con las imágenes.264 (AVC) A partir de Androide 1. Entonces en línea 36. usted puede utilizar a setOnCompletionListener () para estar notificado Cuando el clip está acabado. o mire en Los mensajes de corrección de errores en el LogCat View. El método de principio () Es asincrónico. ¿Qué Clase de Video Puede Observar Usted en Androide? Aquí hay cuál es oficialmente soportado: " MP4 (el punto bajo MPEG-4 mordió tasa) " H. La tecla ENTER o la D-Pad central teclea). Usted puede usar un programa como QuickTime Profesional para convertir video de un formato a otro. Si usted corre el programa ahora y luego presiona una de las llaves (por ejemplo. porque Hay una forma más simple para incrustar videos en su aplicación: Lo La clase VideoView.3 Para nuestro siguiente truco.example. así es que regresa inmediatamente a pesar de cuánto tiempo lo Sondee hormas. cree un proyecto del Androide nuevo llamado El video usando estos parámetros: Project name: Video Build Target: Android 1. Es cuerdo igualmente.

Bundle.example.main). pero yo encuentra la línea de comando Para costar menos esfuerzo pues a cosas simples le gusta esto.onCreate(savedInstanceState).widget.app. Ahora usted necesita tele-enviar algo para jugar.java.3gp en el paquete de descarga para este libro.3gp" ).start().3gp 1649 KB/s (369870 bytes in 0.VideoView. video. // Fill view from resource setContentView(R. Sólo surtirá efecto en el emulador porque ese directorio está protegido adelante Los dispositivos verdaderos. y comienza a jugarlo. Usted también puede tele-enviar y puede hacer un download de archivos en proceso de desaparición con el Archivo La vista del explorador en la perspectiva del Androide. Reparo en que Android no parece importarle qué extensión usted da lo El archivo.219s) Usted puede encontrar samplevideo.video). import android.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas. VideoView video = (VideoView) findViewById(R.Activity. import android.xml) para esto: Download Videov1/res/layout/main. Para hacer eso.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <VideoView android:id="@+id/video" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center" /> </FrameLayout> Abra a Video. correr lo siguiente La orden: C:\> adb push c:\code\samplevideo.GARCIA JIM Cambie el layout (/ el layout res / main.os. o Usted puede crear uno suyo. y cambie el método onCreate () como sigue: Download Videov1/src/org/example/video/Video.android. public class Video extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super. } } El método setVideoPath () abre el archivo.3gp /data/samplevideo.id.xml <?xml version="1. import android. // Load and start the movie video. lo dimensiona a su envase mientras Conservando la proporción dimensional.java package org.video.setVideoPath("/data/samplevideo.layout. El directorio usado aquí (/ los datos) es justo Para los propósitos ilustrativos y realmente no debería servir para archivos de los medios de comunicación. .

0" > <application android:icon="@drawable/icon" android:label="@string/app_name" > <activity android:name=". Hay una cosa más: Nos gustaría que el video asuma el control de la pantalla entera Incluyendo la barra de títulos y la barra de estado.category.NoTitleBar.action.example.Fullscreen" > <intent-filter> <action android:name="android.GARCIA JIM Figura 5.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.intent.android.Video" android:label="@string/app_name" android:theme="@android:style/Theme. Hacer eso.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4" /> </manifest> .intent. todo lo que usted necesita hacer es Especifique el tema correcto en AndroidManifest.MAIN" /> <category android:name="android.3: Incrustar un video es fácil con VideoView.video" android:versionCode="1" android:versionName="1.xml: Download Videov1/AndroidManifest.com/apk/res/android" package="org.

Está parejo Una forma útil para probar su ciclo biológico aplicativo y statesaving/ ¡Restaurando código (vea Sección 2.2. ¡Voila! La bondad de vídeo instantánea.3. es Viva!.main).java @Override protected void onResume() { super. llamará a onConfigurationChanged (la Configuración) y Asumo que usted sabe lo que usted está desempeñándose. La forma más complicada es utilizar al androide:Los configChanges La propiedad en AndroidManifest. y otro jugará durante lo real El juego.GARCIA JIM ¿Por qué Eso Vuelve a Arrancar el Video Cuándo Rotate el Despliegue? El androide supone en rebeldía que su programa no sabe nada Acerca de rotaciones de la pantalla. 5. R. En lugar de eso. usted utiliza a getLastNonConfigurationInstance () en lo La instancia nueva de su actividad para recobrar esa información. justamente necesitamos pasar sobre la disposición de estos dos Los métodos en la clase Sudoku: Download Sudokuv3/src/org/example/sudoku/Sudoku. En página 32). Por ejemplo. Usted Puede conservar cualquier cosa. Una vez tan se hace. La forma más simple es implementar a onRetainNonConfigurationInstance ( ) En su actividad para guardar un poco de datos que serán conservados A través de las llamadas para onDestroy () y onCreate (). Music. El androide desbarata y recrea su actividad de la nada.onPause(). Pruebe girar La exhibición a verificarle trabaja en ambos retrato y los modos del paisaje. vamos a tomar lo que hemos aprendido y sumamos trasfondo La música para el juego Sudoku que hemos estado construyendo. Sin embargo.xml para dar a saber a Android que Los cambios que usted puede manejar. que quiere decir que el video es Iniciado otra vez (como este ejemplo está actualmente escrito). } @Override protected void onPause() { super. Adquirir recurso posible cambia. Ahora demleos brillo a la prueba Sudoku con un poco de música de estado de ánimo. aun referencias para su intento actual y Correr ensarta. luego el Androide no destruirá y Recree su actividad cuando el usuario lanza el teclado. Eso Quiero decir que onCreate () volvió a llamar. Éste demostrará no sólo cómo jugar música pero también algunos Las consideraciones de ciclos biológicos importantes. Este comportamiento estará bien para 90 por ciento de todas las aplicaciones. Una voluntad de canción Juegue durante la pantalla abridora. si usted lo colocara para | la orientación del keyboardHidden.onResume().3 Adición Sounds para Sudoku En este pasaje. Tan la mayoría de desarrolladores no tendrán que preocuparse por eso. cuándo usted corre el programa. usted debería ver y Oiga el clip de la película (vea Figura 5. Cuando usted Regrese.raw. Music. } . Para añadirle la música a la pantalla principal.stop(this). en la página precedente). hay un par de formas para ser más listos y optimizar La transición.play(this.

mp3). un Servicio es una forma para iniciar un proceso de fondo Eso puede correr aun después de que su actividad actual se termina. Music. Básicamente. ¿No deberíamos destinar un Servicio del Trasfondo para Música? No hemos dicho mucho acerca de la clase de Servicio del Androide. sí. un Servicio sería apropiado. El androide Las pausas la actividad actual antes de reanudar a una nuevo.play(this. el onResume () El método es designado cuando la actividad está lista a comenzar a interactuar con lo El usuario. Así es que usted no necesita usar la clase de Servicio. Si usted le escribe a un jugador de música multiusa y quiere lo La música a continuar mientras usted lee el correo o hacer una lectura ligera lo La Web. La clase de Música estará definida en poco tiempo.stop () en onPause ().2.start () Llame por teléfono allí.onPause().GARCIA JIM ¡Si usted recuerda de Sección 2. Sin embargo. El método onPause () es el sujetalibros arreglado en pares para onResume (). La pieza final del acertijo musical es la clase de Música. así es que ponemos a un Music. Cuando usted inicia un juego nuevo. R.java @Override protected void onResume() { super. está vivo!. así es que llamamos a Music. lo cual se ingeniará La clase MediaPlayer solió jugar la música actual: .main se refiere a los res / el main. } @Override protected void onPause() { super. onPause () también será designado cuando lo El usuario presiona la Parte Trasera o la llave de la página principal del sitio Web. Los servicios Es parecido a. Ahora hagamos algo semejante para la música en la actividad de Juego: Download Sudokuv3/src/org/example/sudoku/Game. En la mayoría de los casos.raw.mp3 / crudo. Usted puede encontrar estos archivos en buen estado En el proyecto Sudokuv3 de las pruebas bajables desde disco en el libro El sitio Web.raw. usted quiere que la música fenezca cuando su programa llega al final.onResume(). Éste es un buen lugar para poner en marcha la música.game (res / toscos Game. En página 32. Music.stop(this). los demonios Linux. usted se fijará Que le pongamos notas a un recurso en buen estado diferente. luego. pero no completamente así como. así en Sudoku. R. la actividad Sudoku será hecha una pausa. } Si usted se asemeja esto para lo que hizo para la clase Sudoku. R. pero usted Lo pude haber visto usado en algunos ejemplos que juegan música en lo La Web. y luego La actividad de Juego comenzará. Éstas son todas las posiciones sociales donde queremos Nuestra música del título a detener.raw.game).

example. -} -} 25 } La primera parte de método de obra teatral () llama el método de alto () a detener no importa qué música Actualmente juega.stop () Aunque parezca mentira.private static MediaPlayer mp = null./** Stop old song and start new one */ 10 public static void play(Context context.mp = MediaPlayer.import android.stop(context)./** Stop the music */ . El método de alto () que empieza en línea 18 es simple. Enfatice prueba ella que en todos los aspectos usted puede imaginar. Justamente le digo Debería recordar eso).public class Music { . como cambiar de decisión para Las actividades diferentes. .java Line 1 package org.import android. Desde que esos son recursos natales.content. iniciando el programa cuando está ya Lanzándose contra puntos diferentes. alternando el despliegue. pasándole por alto un contexto y un recurso Idaho. 15 } .start(). El método de principio () se origina De regreso inmediatamente.media.release(). pero sus usuarios se valorizarán El esfuerzo. Después.if (mp != null) { 20 mp. El método de liberación () libera sistema Los recursos se asociaron con el jugador. Después de que tenemos a un jugador. El método MediaPlayer. . Después de una defensiva pequeña Inspeccione para asegurarse nosotros en realidad tiene un MediaPlayer con el que trabajar. .create(context.MediaPlayer. luego establecemos una opción para hacer ella repita lo La música en un lazo y luego inícielo a jugar.create ().setLooping(true). crea una instancia nueva MediaPlayer acostumbrando MediaPlayer.Context.mp = null. Saliendo Fuera de la liberación () está una buena manera para hacer fracasar su programa inesperadamente (No que esto alguna vez ha ocurrido para mí.public static void stop(Context context) { . por supuesto. .stop(). y así sucesivamente. .sudoku. resource).mp. La vida correcta La gerencia ciclista es un dolor algunas veces.mp.mp.GARCIA JIM Download Sudokuv3/src/org/example/sudoku/Music. . presionando el botón De Atrás y el botón de la página principal del sitio Web de Los puntos diferentes en el juego. Ahora viene el modo de tocar divertido de intento de la parte Sudoku con estos cambios adentro El lugar. . . los altos la música. Llamamos su alto () y sus métodos de liberación (). int resource) { . No podemos esperar hasta que la colección normal de basura Java los rescate. . 5 .

Porque Prefs extiende a PreferenceActivity. en la siguiente página. Cualquier cosa que sea. Se inician. Si usted no necesita hacer eso. corren. ya sea es un tamaño simple del carácter de imprenta sedimentándose. y archivos de memoria del destello. Sumando un Menú.4 en línea En el Capítulo 6. en página 60. y si eso Será compartido con otros programas. usted aprenderá acerca de Algunos programas simples del Androide de formas pueden almacenar datos entre invocaciones. o el plan de la comida de la semana entrante.1 Adición Options para Sudoku En la Sección 3. utilizamos al onCreateOptionsMenu ( ) El método para sumar un menú conteniendo un artículo para el Sudoku principal La pantalla. los valores Pues los trasfondos se guardan en el área de preferencias del programa. Capítulo 6 Almacenando Datos Locales Hasta ahora.7. la mayoría de programas verdaderos Necesito estado persistente. uno bochornoso La foto de su última fiesta de la oficina. instancia Indican manojos. el código inicia la actividad Prefs. lo cual deja el cambio del usuario lo Las opciones para el juego. Poniendo lenguaje normalizado de consulta a Trabaje.GARCIA JIM 5. Sin embargo. Ahora vamos al implemento Ellos. y se van. ahondaremos en técnicas más adelantadas acostumbrando El motor de la base de datos del SQLite incorporado.. 6. su duración de una vida. No discutimos registrar porque la mayoría de programas legan No la necesidad para hacer eso.. luego a usted puede pasársele delante para Chapter 7. luego mire hacia arriba La clase MediaRecorder en el documentation. No dejando huella que estaban alguna vez allí. Almacenando Datos Locales. Su aplicación puede almacenar datos usando varias técnicas diferentes dependiendo En el tamaño de los datos. En el Capítulo 9. Cuando el usuario presiona el Menú llave y selecciona los Trasfondos . pero si usted acierta a ser la excepción. El Mundo Conectado. el Androide le deja permanentemente almacenarlo en su móvil El dispositivo para uso más adelante y lo protege de acceso accidental o malicioso Por otros programas. adelante mandan a llamar 126 y se enteran de red El acceso. En este capítulo. en página 171. . su estructura.4 de Avances Rápidos En este capítulo. Ítem. echaremos un vistazo en Tres métodos simples para conservar datos locales: La API de preferencias. encubrimos jugar clips audios y de vídeo acostumbrando lo El androide SDK. pero originalmente No hicimos nada con ellos. nos hemos concentrado en escribir aplicaciones que no necesitan para Conserve datos de aproximadamente cuándo egresan.

GARCIA JIM
Primero modifiquemos la clase Prefs para sumar un par de métodos de la persona emprendedora que Recupere los valores corrientes de nuestras dos opciones. Aquí está la definición nueva: Download Sudokuv4/src/org/example/sudoku/Prefs.java package org.example.sudoku; import android.content.Context; import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; public class Prefs extends PreferenceActivity { // Option names and default values private static final String OPT_MUSIC = "music" ; private static final boolean OPT_MUSIC_DEF = true; private static final String OPT_HINTS = "hints" ; private static final boolean OPT_HINTS_DEF = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); } /** Get the current value of the music option */ public static boolean getMusic(Context context) { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(OPT_MUSIC, OPT_MUSIC_DEF); } /** Get the current value of the hints option */ public static boolean getHints(Context context) { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(OPT_HINTS, OPT_HINTS_DEF); } } Sea precavido que las llaves de opción (la música y los indicios) corresponden a las llaves usadas En res xml settings.xml. Music.play () tiene que ser modificado para revisar en busca de la preferencia de música: Download Sudokuv4/src/org/example/sudoku/Music.java /** Stop old song and start new one */ public static void play(Context context, int resource) { stop(context); // Start music only if not disabled in preferences if (Prefs.getMusic(context)) { mp = MediaPlayer.create(context, resource); mp.setLooping(true); mp.start(); } }

GARCIA JIM
Y PuzzleView.onDraw () también necesita ser modificado para revisar en busca de los indicios La preferencia: Download Sudokuv4/src/org/example/sudoku/PuzzleView.java if (Prefs.getHints(getContext())) { // Draw the hints... } Si los regresos getHints () verdaderos, dibujamos los rayos del cabello para los indicios, como se muestra En Figura 4.6, en página 89. De otra manera, justamente nos saltamos eso en parte. Después le mostraré cómo usar la API de preferencias para almacenar otro de cosas Que simplemente opciones. 6.2 Continuando Un Juego Old En siempre que el jugador puede decidir dejar de jugar a nuestro Sudoku juego Y el empuje hace alguna otra cosa. Tal vez su jefe entró, o llegaron uno La llamada telefónica o una notificación de una cita importante. Cualquier cosa lo La razón, nosotros el faltante para dejar al jugador regresar más tarde y continuar Donde dejaron de. Primero necesitamos ahorrar al estado actual del acertijo a alguna parte. Lo La API de preferencias puede servir más que simplemente opciones; Puede almacenar Cualquier pedacitos autónomos pequeños de información que van con su programa. En este caso, el estado del acertijo puede salvarse como una cuerda de eightyone Los personajes, uno para cada teja. En la clase de Juego, comenzaremos por definir un par de constantes un para La llave de datos de acertijo y uno para una bandera decir a nosotros que continuemos lo previo El juego en vez del principio uno nuevo. Download Sudokuv4/src/org/example/sudoku/Game.java private static final String PREF_PUZZLE = "puzzle" ; protected static final int DIFFICULTY_CONTINUE = -1; Después necesitamos salvar el acertijo actual cada vez que la pieza de caza es hecho una pausa. ¡Vea Sección 2.2, es Viva!, En página 32 para una descripción de onPause () y Los otros métodos de ciclos biológicos. Download Sudokuv4/src/org/example/sudoku/Game.java @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause" ); Music.stop(this); // Save the current puzzle getPreferences(MODE_PRIVATE).edit().putString(PREF_PUZZLE, toPuzzleString(puzzle)).commit(); }

GARCIA JIM
¿Ahora el acertijo es salvado, sino cómo leemos los datos salvados? Recuerde Que cuando el juego comienza, el método getPuzzle () es designado, y lo La dificultad el nivel está aprobada adentro. Acostumbraremos eso pues permanente igualmente. difficulty level is passed in. We¶ll use that for continuing as well. Download Sudokuv4/src/org/example/sudoku/Game.java /** Given a difficulty level, come up with a new puzzle */ private int[] getPuzzle(int diff) { String puz; switch (diff) { case DIFFICULTY_CONTINUE: puz = getPreferences(MODE_PRIVATE).getString(PREF_PUZZLE, easyPuzzle); break; // ... } return fromPuzzleString(puz); } Todo lo que necesitamos hacer es sumar un cheque para DIFFICULTY_CONTINUE. Si eso está listo, Luego en lugar de comenzar con un acertijo fresco, leemos al único rellenamos En las preferencias. Después, necesitamos hacer el botón Continue en la pantalla de la cañería maestra (vea Resuelven 3.4, en página 51) realmente haga algo. Aquí hay donde nos sedimentamos Tan levantado. Download Sudokuv4/src/org/example/sudoku/Sudoku.java public void onClick(View v) { switch (v.getId()) { case R.id.continue_button: startGame(Game.DIFFICULTY_CONTINUE); break; // ... } } Sumamos un caso en Sudoku.onClick () para llamar a startGame () cuando el Continue El botón es presionado, pasajero él DIFFICULTY_CONTINUE. startGame () Pasa por alto la dificultad para la actividad de Juego, y Game.onCreate () llama por teléfono Intent.getIntExtra () para leyó la dificultad y le pasa eso a getPuzzle () (Usted puede ver el código para eso en la Sección 4.2, Iniciando el Juego, adelante Página 75). Hay una cosa más para hacer: Restaure de nuestro juego salvado cuando nuestro La actividad se desvanece y regresa en el suyo (como si otra actividad Comienza y luego el usuario conduce de regreso a la actividad de Juego). Esto La modificación para el método Game.onCreate () se encargará de eso: Download Sudokuv4/src/org/example/sudoku/Game.java @Override protected void onCreate(Bundle savedInstanceState) { // ... // If the activity is restarted, do a continue next time getIntent().putExtra(KEY_DIFFICULTY, DIFFICULTY_CONTINUE); } Eso bastante lo cubre para las preferencias. Después miremos economizar El estado de instancia.

.bundle.private static final String SELY = "selY" .putInt(SELY.public class PuzzleView extends View { 5 private static final String SELX = "selX" .// .// .. . Aquí hay lo que tenemos que hacer para implementarlo: Download Sudokuv4/src/org/example/sudoku/PuzzleView. -} 15 @Override . -} En línea 5.private static final String VIEW_STATE = "viewState" .java Line 1 import android..bundle. Lo mismo ocurre para onRestoreInstanceState ( . Necesitamos ahorrar ambas posiciones nuestra de x propia y y. .onSaveInstanceState(). no obtenemos eso gratis.onRestoreInstanceState(bundle.setId(ID).getInt(SELY)).d(TAG.. . el Androide caminará Derribe la jerarquía de vista y llame a View.Log. . Excepto desde que hicimos los nuestros.Parcelable p = super. . "onSaveInstanceState" ). -} 25 @Override . 30 super.Bundle.Log.os. . Vive adentro uno Ate en bultos clase en la pila aplicativa de Androide.putParcelable(VIEW_STATE.d(TAG.protected Parcelable onSaveInstanceState() { ..putInt(SELX.Bundle bundle = (Bundle) state. A diferencia de estado persistente. y Cualquier estado necesitado por la clase subyacente de Vista. usted lo hará Echo de ver que se le olvida dónde está su cursor.Parcelable.onSaveInstanceState () yendo en procesión.onSaveInstanceState () en cada La vista que encuentra que eso tiene un Idaho. Los puntos de vista normales del Androide salvan su estado de vista automáticamente.3 Recordando la Posición Actual Si usted cambia la orientación de la pantalla mientras Sudoku está corriendo. -} . Eso es porque usamos una costumbre La vista PuzzleView. . selX).Bundle bundle = new Bundle().return bundle.private static final int ID = 42. 10 public PuzzleView(Context context) { .getParcelable(VIEW_STATE)). . el estado de instancia no es permanente. . selY).getInt(SELX). Como parte de Activity. definimos algunas constantes para llaves para salvar y restaurar lo La posición del cursor. . 20 bundle.GARCIA JIM 6. .import android. El estado de instancia es pretendido Para servir para pedazos pequeños de información como posiciones del cursor. .os.select(bundle. bundle. "onRestoreInstanceState" ). p).return. .protected void onRestoreInstanceState(Parcelable state) { .

Éste es el agravio El lugar para eso.io. Aquí están los únicos que usted tiene más probabilidad de necesitar: DeleteFile () Suprima un archivo privado. Obtenemos nuestra x y posiciones y del Manojo. pero desde el Acertijo La vista fue creada en código. con la salvedad que su proceso tiene Los permisos limitados así es que no puede ensuciar los datos de alguna otra aplicación. y así lo es El ideal para la música de multimillón de caracteres de almacenaje y archivos de vídeo. la memoria interna no es el único almacenamiento que usted tiene que trabajar Con. Llamamos por teléfono lo La superclase para obtener a su estado. Nos reconciliamos uno El número arbitrario en línea 8 (cualquier valor hará con tal de que sea positivo) Y luego usa el método setId () para asignarle en línea 12. y luego salvamos lo nuestro y la de ellos en un Manojo. Y luego llamamos la superclase a dejarla obtener cualquier cosa que necesite. falso De otra manera. así es que son No perdido cuando el teléfono está apagado. la cosa más importante a la que puede acceder es un directorio del soldado raso del paquete creado En instala el tiempo (/ datos /datos / packagename). Si presente. este Idaho vendría de XML. En la Sección 5. y cuidadosamente la agarradera Yo los errores de la / O al escribir en el caso el espacio Sale corriendo.5 Accessing SD Cards Algunos artificios Android incluirán una ranura para la memoria adicional del destello a Sea taponado adentro. OpenFileOutput () Abra un archivo privado para escribir.4 Accediendo al Internal Archivan Sistema El androide corre a Linux bajo las coberteras.io estoy disponible Para que su programa use. el cursor será recordado por PuzzleView.2. tele-enviamos un video de muestra El archivo para el directorio de / datos del dispositivo emulado. y cada aplicación puede leer y puede escribir archivos allí. Los archivos son Almacenado en destello no volátil que la memoria incorporó en el dispositivo. Todo el archivo usual Java que Yo las rutinas de la / O del paquete del java. onRestoreInstanceState () (línea 26) se sentirá llamado a bromear fuera lo La información que ahorramos.FileInputStream. le recomiendo mantenimiento El tamaño de cualquier datos que usted pone allí punto bajo. desde que esta memoria interna está limitada. en página 107.io. Después Haciendo estos cambios. Algunos métodos del ayudante son provistos en la clase de Contexto (y así adelante La clase de Actividad extendida por cada uno de sus actividades) para dejarle leer y Los datos de escritura allí. El método onSaveInstanceState () está definido en línea 16.FileOutputStream. Jugando Video. diga un millón de caracteres o dos en lo Más. A falta de para llamar la superclase dará como resultado un error del runtime. Normalmente. Afortunadamente. es muy mayor que la memoria incorporada.GARCIA JIM ). Algo así como alguna otra vista Android. necesitamos proponérnosla. Más tarde. típicamente una tarjeta Digital Segura SD Cards Estos naipes de memoria. 6. Después miremos guardar datos en archivos francamente viejos. tan hay un sistema de archivo verdadero Montado allí dentro con un directorio raíz y todo. FileList () Devuelva una lista de todos los archivos en el soldado raso de la aplicación El área en un conjunto imponente de la Cuerda. Los regresos verdaderos si surtiese efecto. desde que no estamos supuestos a poner archivos grandes en lo interno . Sin embargo. Los regresos uno Java. Adentro El hecho. 6. No pueden ser Usado para código. OpenFileInput () Abra un archivo privado para leer. Los regresos uno Java.

Dándole Ocupación a SQL.6 Avances Rápidos En este capítulo. Usted ha aprendido todos los fundamentos de Androide programando. en página 171 para Las direcciones en relación a la forma de usar base de datos del SQLite incorporado del Androide y cómo para Comparta información entre proveedores contentos que consumen aplicaciones.3gp" ). que usted hará simplemente desaprovecha espacio adelante La unidad de disco de su computadora. Creando a un AVD. Entonces.246s) Luego necesitamos modificar el método onCreate () de la clase De Vídeo para jugar La película de la tarjeta SD Cards en lugar del directorio de / datos: Download Videov2/src/org/example/video/Video. ahora voy a mostrarle una mejor forma. 6. Vea Capítulo 9. incluyendo Las interfaces de usuario.3. en página 20 cuando creamos el "em15" El dispositivo virtual. cubrimos un par de formas básicas para almacenar datos locales adelante La plataforma del Androide. El primer paso es crear y formatear una tarjeta virtual SD Cards que formateamos " el tapón Adentro " para el emulador.3gp /sdcard/samplevideo. Usted puede Hágale cualquier tamaño que a usted le gusta.java // Load and start the movie video. Ahora es hora de dejar atrás a Sudoku y mover más allá de las cosas necesarias. copiemos el video de muestra para la tarjeta SD Cards: C:\> adb push c:\code\samplevideo. Eso debería ser suficiente iniciar usted. que puede causar El emulador a chocar. El video debería jugar normalmente. le dimos a un 128MB tarjeta virtual SD Cards igualmente.GARCIA JIM El sistema de archivo. Nota: Iniciando con Androide 1. Si usted lo hace demasiado gordo. sino por Los datos estructurados como las listas telefónicas y las recetas. usted necesitarán algo Más avanzaron. Ahora intente correr el programa. Después. video. y simple. . La lectura de la tarjeta no hace Requiera cualquier permisos especiales.start(). de vídeo. Con la Ayuda del ejemplo Sudoku. el almacenamiento de datos audio.3gp 1468 KB/s (369870 bytes in 0. los gráficos 2D. sino si usted lo hace demasiado pequeño.6 usted necesitará pedir al WRITE El permiso EXTERNAL_STORAGE en su archivo manifiesto si usted quisiera escribir Para la tarjeta de SD Cards de su aplicación. adentro Sección 1. Afortunadamente ya hemos hecho esto si usted recuerda. Esto nos trae al fin de Parte II.setVideoPath("/sdcard/samplevideo.

GARCIA JIM La parte III Más Allá De los Fundamentos .

el Androide le da su acceso de programas a servicios estándar de la red Guste los conectores de / protocolo entre redes de protocolo de control de transmisión. Figura 7. dando Ellos mucha más funcionabilidad con un mínimo de esfuerzo. La primera parte.1 Esto El punto ya ha sido alcanzado en algunas partes del world. El androide le deja usar el navegador como un componente Directamente el interior su aplicación.1: Abriendo un navegador usando un intento del Androide En este capítulo. cubriremos temas más adelantados tan El acceso de la red y los servicios basados en posiciones. ¿Para qué destina usted su teléfono móvil? Además de hacer llama.GARCIA JIM Capítulo 7 El Mundo Conectado Sobre los siguiente pocos capítulos. Los analistas predicen que en pocos años los teléfonos móviles sobrepasarán parte superior de un escritorio Las computadoras como la forma de número uno para conectarse al Internet. usted aprenderá a aprovecharse de todas estas características Y más a través de cuatro programas de ejemplo: " BrowserIntent: Demuestra abrir un navegador de Internet externo Usando un intento del Androide " BrowserView: Le muestra cómo incrustar un navegador en seguida en Su aplicación " LocalBrowser: Explica cómo JavaScript en un WebView incrustado Y el código Java en su programa Android puede hablar el uno para el otro " Translate: Usa datos teniendo fuerza obligatoria. y la parte superior de un escritorio de Safari El navegador pero con una torsión. Usted puede escribir muchos útiles Las aplicaciones sin estas características. más Y más personas están usando sus teléfonos como dispositivos de la Internet móviles. trenzándose. En segundo lugar. Yahoo. excepto ir más allá de las características básicas De Androide realmente ayudará que usted le añade el valor a sus programas. Amazon.3 abierto WebKit de la fuente éste está el mismo motor usted Encontrará en Cromo Google. el Apple IPhone. el Androide provee un navegador de Internet de amplio espectro Basado en el project.2 Los teléfonos del androide están bien acondicionados para el mundo conectado nuevo de lo La Internet móvil. y los servicios de trama para uno Divirtiendo propósito . Esto le deja consumir servicios de trama de búsquedas en la Internet usando Google. y muchas otras fuentes en la Internet.

GARCIA JIM 7.android.1 Haciendo Una Lectura Ligera por el Intento La cosa más simple que usted puede hacer con API de sistema de redes del Androide es abrirse Un navegador en una página de trama de su elección.6 Application name: BrowserIntent Package name: org. del Androide" con los siguientes valores adentro lo El mago nuevo de Proyecto Project name: BrowserIntent Build Target: Android 1. un control EditText y un Botón.0" para hacer el área del texto llenar Arriba de todo el espacio horizontal a la izquierda del botón. Usted podría querer hacer esto para Provéale un enlace a su página principal del sitio Web de su programa o lograr acceso a una cierta cantidad La aplicación basada en servidores como un sistema ordenador. simplemente la forma que es exhibido. .1). En EditText.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:id="@+id/url_field" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1. colocamos al androide:_ el peso del layout "1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.0" android:lines="1" android:inputType="textUri" android:imeOptions="actionGo" /> <Button android:id="@+id/go_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/go_button" /> </LinearLayout> Esto define nuestros dos controles.xml <?xml version="1. y también se sedimenta El androide:Le aplica delineador a "1" limitar la altura del control a una línea vertical. cuál Tendrá un campo de edición donde usted puede introducir un URL y un botón de Empuje Usted presiona para abrir el navegador en ese URL (vea Figura 7. cambie el archivo del layout (res/layout/ main. En Androide todo eso Toma son tres líneas de código. Para demostrar.browserintent Create Activity: BrowserIntent Una vez que usted tiene uno el programa básico.xml ) así es que se parece a esto: Download BrowserIntent/res/layout/main. escribamleos a un ejemplo nuevo designado BrowserIntent. Comience por Creando un proyecto de "hola" nuevo ".example. Reparo en que esto no tiene efecto en la cantidad de texto en la que el usuario puede entrar Aquí.

.net.import android.4 de trama Como siempre.import android. . -} .public boolean onKey(View view. . .0" encoding="utf-8"?> <resources> <string name="app_name">BrowserIntent</string> <string name="go_button">Go</string> </resources> Después necesitamos suplir el método onCreate () en la clase BrowserIntent.View.KeyEvent.setOnClickListener(new .browserintent.widget.5 introdujo soporte para teclados blandos y otro alterne Introduzca en la computadora métodos. 25 goButton = (Button) findViewById(R.import android.com" y entre en direcciones de trama Y un " Go " botón que abre el page.import android.GARCIA JIM El androide 1.import android.import android.xml: Download BrowserIntent/res/values/strings. KeyEvent event) { 35 if (keyCode == KeyEvent.public OnClickListener() { void onClick(View view) { 30 openBrowser().import android. .url_field).layout.KEYCODE_ENTER) { .id. .id. Las opciones para androide:InputType "textUri" y El androide:ImeOptions "actionGo" son indicios para cómo debería el teclado blando Aparezca.public void onCreate(Bundle savedInstanceState) { 20 super. . -} -} .content. 10 import android.setContentView(R.View. -} .public class BrowserIntent extends Activity { EditText urlText.return false. Le dicen a Android que reemplace el teclado estándar con uno Eso tiene botones convenientes para que ".view.// elements = (EditText) findViewById(R.Button.view.urlText.private Button goButton.main).Activity.setOnKeyListener(new OnKeyListener() { .import android.@Override .os.}).Uri.// Get a handle to all user interface . el texto legible en humano debería ser metido en un archivo del recurso res/ values/strings.EditText.go_button).Bundle.openBrowser(). int keyCode.java Line 1 package org. android. . 40 } .onCreate(savedInstanceState). .OnKeyListener. Esto está donde construiremos la interfaz de usuario y engancharemos todo el comportamiento.xml <?xml version="1.}). .widget. el código completo de la fuente para lo Los ejemplos están disponibles en línea. Si usted no siente guste introducir completamente esto. 5 import .urlText .example. .goButton.View. 15 private . Download BrowserIntent/src/org/example/browserintent/BrowserIntent.Intent.view. .view.OnClickListener.app. .return true. Setup event handlers .

Como prometido.android. Figura 7. llamamos al openBrowser () El método. uri). La siguiente línea crea una clase Atenta nueva con una acción De ACTION_VIEW. De otra manera.ACTION_VIEW. Si es la tecla ENTER. "Http://www. } La primera línea recupera la dirección de la página de trama como una cuerda (por ejemplo.com") y los conversos eso para un recurso uniforme El identificador (URI). Intent intent = new Intent(Intent. regresamos falsos para dejar el control del texto maniobrar la llave Normalmente. ya sea tocándolo o navegando para eso y presionando lo Centre botón de D-Pad. queremos que el navegador abra algo así como ellos Había dado un clic sobre Va. startActivity(intent). Línea 28 le dice a Android que corra algún código cuando el usuario selecciona el Empuje Abotone. Ahora viene la parte que usted ha estado esperando: El método openBrowser (). Para hacer esto.java /** Open a browser on the URL specified in the text box */ private void openBrowser() { Uri uri = Uri. le llamamos a setContentView () en línea 21 a cargar la vista De su definición en el recurso del layout. llamamos el método startActivity () a pedir eso Esta acción sea realizada. Como una conveniencia.toString()).2: Mirando una página de trama con el navegador predeterminado .GARCIA JIM Dentro de onCreate (). Cuando eso ocurre. tiene tres especialidades de largo: Download BrowserIntent/src/org/example/browserintent/BrowserIntent.parse(urlText. Finalmente.getText(). cuál estará definido en un momento. luego llamamos el método openBrowser () a abrir lo El navegador. definimos un oyente iniciando en línea 33 que Será designado cada vez que el usuario escribe un teclazo en el campo de edición. si el usuario escribe una dirección y le pega a la tecla ENTER (Si su teléfono tiene uno). pasando eso que la clase de Uros justamente creó como el objeto nosotros Quiera mirar. y luego llama a findViewById () En línea 24 para llevarle una agarradera a nuestros dos controles de la interfaz de usuario.

Cuando estaba trabajando en el Eclipse el proyecto y alguien sugirió Reemplazando algunos puntos de vista del texto comunes con navegadores de Internet incrustados. El androide provee una envoltura alrededor del motor del navegador WebKit llamado WebView con el que usted puede utilizar para traer el poder verdadero de un navegador tan poco Como 1MB de en lo alto. la ventana del navegador se irá. complicado. las barras de desplazamiento. Comience por crear un "hola" nuevo ". las etiquetas.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" .GARCIA JIM Cuando el Navegador que la actividad echa a andar. para Simplemente realce al espectador del texto para hacer letras itálicas o mesas o cualquier cosa que fue ¿Eso faltaba? Resulta no estaban chiflados porque: " Un navegador de Internet puede ser (relativamente) parco y término medio si usted se desnuda fuera Todos menos el motor básico de interpretación. El espectador del texto hinchado o un navegador poco accionado. No lo haría eso hace más sentido. creará su vista (vea Figura 7. y su aplicación Continuará. y su programa será hecho una pausa. yo Pensé que estaban chiflados.2). Aunque el 1MB es todavía significativo en uno incrustado El dispositivo. Pero qué ocurre si usted quiere ver a algunos de su usuario ¿La interfaz y una página de trama al mismo tiempo? El androide le deja hacer Tan por ahí utilizador la clase WebView. 7. Voy a mostrarle Cómo trabaja haciendo una versión incrustada del ejemplo previo.browserview Create Activity: BrowserView El archivo del layout para BrowserView es similar al mismo en BrowserIntent. Los plug-ines. desde eso Usa una Vista incrustada en lugar de un Intento. Éste será llamado BrowserView en lugar de BrowserIntent. Pero hayamos agregado a un WebView en la parte inferior: Download BrowserView/res/layout/main.xml <?xml version="1.6 Application name: BrowserView Package name: org." un proyecto del "androide" usando estos trasfondos: Project name: BrowserView Build Target: Android 1. " Si usted realza una vista del texto para sumar más y más cosas que uno El navegador que el motor puede restaurar. discutí. y así sucesivamente. hay muchos casos dónde utilizando a un WebView es apropiado.android. Programa que engulle memoria con toda clase de características como señales de lectura. un navegador de Internet es uno grande. Si el usuario presiona la Parte Trasera Teclee en ese momento. el estampado.example.2 Tejen con una Vista En su computador de escritorio. A las obras WebView bastante les gusta alguna otra vista Android excepto que ella Tiene algunos métodos adicionales específicos para el navegador. usted el fin con ya sea uno excesivamente complicado.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas. las animaciones del Destello.

} ... // . sin embargo.getText().setJavaScriptEnabled(true).getSettings(). @Override public void onCreate(Bundle savedInstanceState) { // . El LinearLayout íntimo es así como antes.... // .web_view).. } } El método openBrowser ().0" android:lines="1" android:inputType="textUri" android:imeOptions="actionGo" /> <Button android:id="@+id/go_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/go_button" /> </LinearLayout> <WebView android:id="@+id/web_view" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1. y el fondo tiene lo WebView.toString()). es diferente: Download BrowserView/src/org/example/browserview/BrowserView..loadUrl(urlText.java import android. El control extremo divide la pantalla en parte superior y fondo Las regiones.0" /> </LinearLayout> Usamos dos controles LinearLayout para hacer todo aparecer del lado de la razón El lugar. public class BrowserView extends Activity { private WebView webView.. webView = (WebView) findViewById(R.java /** Open a browser on the URL specified in the text box */ private void openBrowser() { webView. Justamente hace El empuje del texto del área en izquierda y el botón a la derecha.id.WebView. El método onCreate () para BrowserView es exactamente igual como antes Deduzca excepción eso ora hay una vista adicional para buscar: Download BrowserView/src/org/example/browserview/BrowserView. // . webView. La parte superior tiene el botón y área del texto.webkit.GARCIA JIM android:layout_height="wrap_content" > <EditText android:id="@+id/url_field" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1.

xml <?xml version="1.GARCIA JIM El método loadUrl () causa que el motor del navegador comience a carga y Exhibiendo una página de trama en la dirección dada. Pruebe correr el programa ahora. Usted puede encontrar una lista completa en la documentación en línea para WebView.0" encoding="utf-8"?> <resources> <string name="app_name">BrowserView</string> <string name="go_button">Go</string> </resources> Necesitamos hacer un cambio más para el programa.3.zip o un archivo . Regresa inmediatamente aun Aunque la carga real puede tomar bastante tiempo (si se termina en absoluto). y entre en una dirección válida de trama empezando Con "http:".xml <uses-permission android:name="android.INTERNET" /> Si usted omite esto. en la siguiente página).permission. WebView tiene docenas de otros métodos que usted puede usar para controlar lo que es Siendo exhibido o coloca notificaciones en los cambios estatales.apk " SetWebChromeClient (): Registra técnicas de venta de recuperación para los Eventos que necesitan para Hágase fuera del rectángulo WebView. el Androide no dará su acceso aplicativo para La Internet. Pero aquí es los métodos que usted tiene más probabilidad de necesitar: " AddJavascriptInterface (): Deja un objeto Java ser a lo que se accedió JavaScript (más en este en la siguiente sección) " CreateSnapshot (): Crea un screenshot de la página actual " GetSettings (): Regresos que un objeto WebSettings acostumbró controlar lo Los trasfondos " LoadData (): Carga los datos dados de la cuerda en el navegador " LoadDataWithBaseURL (): Carga los datos dados usando un URL de base " LoadUrl (): Carga una página de trama del URL dado " SetDownloadListener (): Las técnicas de venta de recuperación de registros para hacen un download de Eventos. Internet La página debería aparecer (vea Figura 7. Sume esta línea para AndroidManifest. Como cuando el usuario hace un download de un .xml antes de la > etiqueta < aplicativa: Download BrowserView/AndroidManifest.3: Incrustando un navegador utilizando a WebView . No olvide actualizar los recursos de la cuerda: Download BrowserView/res/values/strings. tan modernizante el título O la barra de progreso o abrir un diálogo JavaScript box Figura 7. Cuando usted presiona Interlineación o selecciona el botón de Empuje. y usted obtendrán una "página de Web" error "no disponible".

Eso Otra aplicación (el navegador) es la que necesita preguntar pues Los permisos de la Internet en su propio AndroidManifest. simplemente despedido anticuado un intento para Pida eso alguna otra vista aplicativa la página de trama.xml. La llave es el método addJavascriptInterface () en la clase WebView. 7. los gráficos levadizos. alquiler nosotros ahora construya un programa que es medio HTML JavaScript y medio Androide (vea Figura 7. puede cambiar variables JavaScript.4.6 Application name: LocalBrowser Package name: org. Usted lo puede usar prolongar el Modelo del Objeto del Documento (DOM) adentro lo El navegador incrustado y para definir un objeto nuevo que la lata de código JavaScript El acceso. Usted puede llamar un método. No lo haría que sea simpático si usted podría acceder a esa funcionabilidad de una trama ¿La página? Con un control incrustado WebView. BrowserIntent. Usted puede llamar métodos JavaScript de su programa Android también. Tomemos una apariencia más cercana en esta característica ahora. Todo Usted tiene que hacer es llamada el método loadUrl (). y la parte inferior es Un TextView y Botón del usuario del Androide interactúan. usted puede. " SetWebViewClient (): Alquileres el set de aplicación engancha el navegador para Intercepte Eventos como cargas del recurso. Para demostrar llamadas entre JavaScript en el WebView y Java adentro El programa del Androide. Cuando el código JavaScript conjura métodos en ese objeto. la música de obra teatral. afine prensas. en página 138). las llamadas de la marca.3 From JavaScript para Java y la Parte Trasera Su dispositivo Android puede hacer un número de cosas frescas como provisión local Los datos. pasándole por alto a ella un URL de la forma El javascript:El código a ejecutar. En lugar de ir a una página nueva. y determinan su posición. eso las llamadas de marcas entre los dos ambientes.localbrowser Create Activity: LocalBrowser . Cuando usted hace clic Los botones y los enlaces. el navegador Ajusticiará la expresión dada JavaScript dentro del paje actual." un programa del "androide" usando estos parámetros: Project name: LocalBrowser Build Target: Android 1. puede modificar el navegador Documente cualquier cosa que usted necesita.GARCIA JIM ¿Por qué No Hizo BrowserIntent Need permiso de usos? El ejemplo previo. La cabeza De la ventana de la aplicación está un control WebView.example. eso Realmente conjurará métodos en su programa Android. Comience por crear un "hola. y autorización Las peticiones " StopLoading (): Detiene la página actual de cargar Una de las cosas más poderosas que usted puede hacer con el control WebView Debe hablar de acá para allá entre eso y la aplicación del Androide que Lo contiene.

Usted debe perder algo. Y Recuerde la regla dorada de seguridad: No descarte cosas.0" /> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1. Implemente topes en las páginas que pueden acostumbrar Sus métodos y en las cosas que esos métodos pueden hacer. Ríjalos adentro. no confíe adelante La seguridad por oscuridad.xml: Download LocalBrowser/res/layout/main. Primero. En lugar de eso.xml <?xml version="1. En otras palabras. La interfaz de usuario para este programa será dividida en dos partes. Deje inválidos a los personajes en una averiguación). Por ejemplo. La primera parte La parte está definida en el archivo del layout del Androide.GARCIA JIM ¿Le permite JavaScript para Call Java Dangerous? Cada vez que usted deja una página de trama acceder a los recursos locales o Llame funciones fuera de la caja de arena del navegador. no intente revisar en busca de todo el Las malas cosas que alguien le puede pedir a usted que haga (por ejemplo.0" android:padding="5sp" > <TextView android:layout_width="fill_parent" Figura 7. Aquí hay algunas cosas para recordar. / res/layout/main. usted No querría crear un método para dejar a JavaScript rezar Los datos de cualquier camino arbitrario nombran porque puesta en evidencia del thatmight Algunos datos privados para un sitio malicioso que supo acerca de su El método y sus nombres de archivo. y pase sólo las buenas cosas usted Sepa está segura. usted necesita considerar Las implicaciones prendarias muy cuidadosamente.android.4: Comunicándose entre Androide y una Web incrustada La vista android:layout_height="wrap_content" android:textSize="24sp" android:text="TextView" /> <Button android:id="@+id/button" android:text="@string/call_javascript_from_android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" /> . prohíba todo.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <WebView android:id="@+id/web_view" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.

Call Android from JavaScript</a> . que esté en línea 19.</p> .<p id="replaceme"> 20 </p> .GARCIA JIM <TextView android:id="@+id/text_view" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="18sp" /> </LinearLayout> </LinearLayout> La segunda parte es el archivo del index. Toma una discusión de la cuerda y la intercala en La etiqueta del replaceme.<a href="#" onclick="window. Download LocalBrowser/assets/index. Ponga en alerta que () función abra una ventana exhibiendo un mensaje pequeño. en línea 16.html que estará cargado en Internet La vista. en la página previa. En Figura 7. .<p> .4.android El objeto.</body> .callAndroid('Hello from Browser')"> . llama el método callAndroid () en el window. la ventana.function callJS(arg) { 5 document.</head> .<body> 10 <h1>WebView</h1> .<script language="JavaScript"> . El androide estaría indefinido. imágenes.</script> .alert('Alert from JavaScript')"> . porque No es un recurso compilado. El directorio Está dirigido a servir para copias locales de HTML. podemos definir el objeto por nosotros mismos así lo La página lo puede usar. -} .innerHTML = arg. Lo primer justamente llama una ventana estándar.getElementById('replaceme').<head> . Este archivo se va en el directorio de activos.Display JavaScript alert</a> . Lo El segundo enlace.</p> 15 <p> . usted ve dos enlaces de HTML que son La puesta en marcha definida en línea 12.<a href="#" onclick="window. Si usted cargase esta página en un navegador de Internet normal.</html> Aplíquele delineador a 4 de index.html definen la función callJS () que nuestro programa Android Llamará por teléfono más tarde. no el directorio de res. y letras Que el navegador puede mirar sin estar conectado para la red. Cualquier cosa en el directorio de activos se copia Literalmente encima del almacenamiento local cuando su programa es instalado.android. Excepto desde que incrustamos un navegador En una aplicación del Androide.html Line 1 <html> .

web_view).button).webkit.widget.@Override .import android. . . 15 .private final Handler handler = new Handler(). .view. .// Rest of onCreate follows. . .import android.private WebView webView.Log.os.id.setContentView(R.private Button button.button = (Button) findViewById(R. incluyendo todas las importaciones necesitaremos más tarde: Download LocalBrowser/src/org/example/localbrowser/LocalBrowser.example.app. . 20 private TextView textView. Acostumbraremos La clase del Manipulador para hacer la transición.Bundle.java Line 1 package org. . .Toast.main).// Find the Android controls on the screen . pero el usuario del Androide Las llamadas de la interfaz pueden ser hechas sólo del hilo principal (la Interfaz Gráfica del Usuario). Aquí está lo El contorno básico.import android. .import android.import android.os.JsResult.Handler.util.import android.webView = (WebView) findViewById(R. ..webkit.GARCIA JIM Después recurrimos al código del Androide en la clase LocalBrowser.import android.Button. . . . JavaScript llama por teléfono Entre en un hilo especial dedicado al navegador.public void onCreate(Bundle savedInstanceState) { 25 super.id.WebChromeClient. .onCreate(savedInstanceState).Activity.widget.layout.id. 5 import android. -} -} Note la inicialización de un Manipulador objetar en línea 18.view.webkit.localbrowser. 10 import android.public class LocalBrowser extends Activity { .text_view).widget.private static final String TAG = "LocalBrowser" . . .OnClickListener. .WebView.View.TextView. ..import android.View. 30 textView = (TextView) findViewById(R.import android.import android.

d(TAG. textView. Ahora es hora de vincular todo adentro El método onCreate (). 3000). la aplicación crea Un objeto nuevo Runnable y un poste eso en la cola encendida de la cañería maestra Ensarte utilizar a Handler. "android" ).java // Set up a function to be called when JavaScript tries // to open an alert window webView. lo cual llamará a setText () a cambiar lo El texto en el objeto TextView.d(TAG. result. usted necesita definir una llanura Al objeto viejo Java con uno o más métodos. JsResult result) { Log. Luego creamos un objeto anónimo WebChromeClient y lo registramos Con el método setWebChromeClient (). " + result + ")" ).post(new Runnable() { public void run() { Log. final String url. Tan pronto como el hilo principal obtenga un acaso.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(final WebView view. " + message + ". "callAndroid(" + arg + ")" ).setJavaScriptEnabled(true). le gusta esto: Download LocalBrowser/src/org/example/localbrowser/LocalBrowser. Toast. message. } } Cuando JavaScript llama el método callAndroid ().GARCIA JIM Para llamar código Android Java de JavaScript.setText(arg). final String message.makeText(LocalBrowser.getSettings(). Primero nos volvemos contra JavaScript (se va por defecto) Y el registro nuestro puente para JavaScript: Download LocalBrowser/src/org/example/localbrowser/LocalBrowser.addJavascriptInterface(new AndroidBridge().java // Turn on JavaScript in the embedded browser webView. " + url + ". return true.show(). Conjurará el método corrido (). } }). // Expose a Java object to JavaScript in the browser webView. // I handled it .post ().confirm(). "onJsAlert(" + view + ".this.java /** Object exposed to JavaScript */ private class AndroidBridge { public void callAndroid(final String arg) { // must be final handler. Download LocalBrowser/src/org/example/localbrowser/LocalBrowser.

Para hacer eso. Download LocalBrowser/src/org/example/localbrowser/LocalBrowser. las señales de lectura. Cuando usted hace clic " el Despliegue JavaScript Ojo avizor.setOnClickListener(new OnClickListener() { public void onClick(View view) { Log. En este caso. Dentro de onJsAlert () Usamos la clase Toast del Androide para crear una ventana de mensaje que hará Aparezca para una pequeña cantidad de tiempo (en este caso.loadUrl (). y así sucesivamente. Una vez que terminamos de configurar al WebView. Y finalmente.xml de / valores de res para el ejemplo LocalBrowser: Download LocalBrowser/res/values/strings. Si éste fuera un cliente del navegador en toda la extensión de la palabra. podemos utilizar a loadUrl () para cargar La página local: Download LocalBrowser/src/org/example/localbrowser/LocalBrowser. 3000 milisegundos. nosotros cargamos el archivo del index.java // This function will be called when the user presses the // button on the Android side button.alert ()). Los URLs de la forma _ "activo /nombre de archivo file:///android" (note el tres adelante Las cuchilladas) tenga un sentido especial para motor del navegador de Android. Cuando el botón se aprieta. pasándolo por alto una expresión JavaScript para evaluar adentro El navegador. Aquí está el archivo del / strings. webView.html definido más temprano. " una ventana de mensaje del Androide aparecerá. La expresión es una llamada para la función callJS () definida adentro Index. lo cual da la vuelta y Llama a WebView. todo lo que queremos Hacer es cambiar lo que oc urre con código JavaScript cuando el navegador Intenta abrir al público una alerta JavaScript (utilizando a window.loadUrl("file:///android_asset/index. cuando usted presiona lo " la Llamada JavaScript de Androide "botón.java // Load the web page from a local asset webView.html. Como Usted podría haber adivinado. "onClick(" + view + ")" ). onClick () es designado. "la cuerda" Hola de Navegador " será exhibido En un control del texto Android. se refieren a los archivos en el directorio de activos. } }). colocamos a un oyente para los chasquidos del botón utilizando a setOnClickListener (). la cuerda" Hola de Androide " es enviado . Corra el programa ahora. Cuando usted hace clic " la Llamada El androide de JavaScript. o 3 Los segundos). necesitaríamos manipular La navegación. y pruébelo. los menús.0" encoding="utf-8"?> <resources> <string name="app_name">LocalBrowser</string> <string name="call_javascript_from_android"> Call JavaScript from Android </string> </resources> Lo último que tenemos que hacer es poner el alambrado del botón al pie de lo La pantalla así es que hará una llamada JavaScript (una llamada de Java para JavaScript).loadUrl("javascript:callJS('Hello from Android')" ).GARCIA JIM El chrome de término aquí se refiere a todos los adornos alrededor de un navegador La ventana.d(TAG. En esto El caso.xml <?xml version="1.html" ).

Hasta que esa llamada regrese (y lo puede hacer nunca El regreso). Adentro lo Después seccione.4 Web Utilizadora Services El androide provee un set lleno de APIs estándar a Java que enlaza en red. El paquete del java. Ilustrar estos conceptos. y usted Pueden interrumpir tareas corredoras si es necesario. Obviamente. que usted pueda acostumbrar en sus programas. Considere qué pasaría si usted justamente hace una llamada bloqueadora de la red En su hilo principal (la Interfaz Gráfica del Usuario). eso es algo que usted tendrá que evitar. su aplicación no puede responder para cualquier Eventos de la interfaz del usuario Como los teclazos o prensas del botón. La primera parte creada Por Doug Lea como una biblioteca autónoma y más tarde incorporado en Java 5. y todo lo que usted tiene que hacer es someterse Las tareas (las instancias de Runnable o las Acciones de Fácil Salida) para el albacea para tenerlos Corra. especialmente generado por computadora Figura 7. Algunas veces usted no necesita exhibir una página de trama.util. este paquete soporta programación concurrente en uno más alto Ras con ras que la clase normal Java Thread. lo cual es una referencia para Una cierta cantidad como aún el valor desconocido de futuro que será devuelto por su tarea (Si cualquier). La parte tramposa debe hacer las llamadas asincrónicamente tan tan su La interfaz de usuario del programa será receptiva en todo momento. le mostraré cómo hacer esto. tan El paquete de java. Una instancia de la clase Futura es devuelta.HttpURLConnección. La clase ExecutorService se ingenia Uno o más hilos para usted.5 Google Translation Le Tiene alguna vez reído en traducciones extrañas Hacia y desde las lenguas extranjeras. nos dejó crear una diversión programa pequeño que llama por teléfono El API. .GARCIA JIM Para el navegador e inserto en el HTML donde será exhibido El fin de la página de trama. Dará la apariencia de estar colgado para el usuario. Usted puede limitar el número de hilos que son creados. 7.net. pero usted justamente necesita Acceda a alguna clase de servicio de trama u otro recurso lateral en servidor.concurrent es perfecto para esta clase de trabajo.5: La traducción por máquina es todavía un trabajo en curso.

TableLayout le deja arreglar sus puntos de vista En filas y columnas. pero esto no es siempre lo El caso. Y luego comience a escribir una locución. y luego le pregunte Haga búsquedas en la Internet usando Google para retraducirlo en la lengua materna.example. simplemente selecto la puesta en marcha y las lenguas deseadas.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android. así Usaremos la vista TableLayout. Necesitaremos ordenarle a Android a concedernos permiso.com/titles/eband2) para otros gustar.permission. Pídale a Google que traduzca para un segundo idioma.xml before the <application> XML tag: Download Translate/AndroidManifest. Sume esta línea para AndroidManifest. por favor Échelos al correo en el foro de debate en el sitio Web del libro (http:// Pragprog. Como usted mecanografía. me imaginé que lo sería Fácil para obtener algunos resultados hilarantes. encargándose de alineación y desperezándose lo Las columnas para equipar el contenido.xml <?xml version="1. como usted pueda ver en Figura 7. Desafortunadamente (o afortunadamente. Es similar a usar > etiquetas de la < mesa > y < tr En el HTML.GARCIA JIM ¿Las traducciones? Este programa dejará al usuario introducir una locución en un lenguaje. el programa acostumbrará lo Haga Búsquedas En La Internet Usando Google servicio de trama Translation para traducir su texto en y de La lengua deseada. Desde que este ejemplo accederá a la Internet para hacer una trama reparar petición de fondos. Androide" aplicación Usando estos parámetros: Project name: Translate Build Target: Android 1. A merced de su punto de vista). Para usar este programa.INTERNET" /> El layout para este ejemplo está algo más complicado usual. el servicio Google hace Un trabajo bastante bueno con la mayoría de lenguajes.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TableLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchColumns="1" android:padding="10dip" > <TableRow> <TextView android:text="@string/from_text" /> <Spinner android:id="@+id/from_language" /> </TableRow> <EditText . usted fenecería Arriba con las mismas palabras con las que usted comenzó. Download Translate/res/layout/main.5. comience con un "hola.6 Application name: Translate Package name: org.xml <uses-permission android:name="android. Si usted encuentra a cualquier especialmente Los casos chistosos donde el traductor realmente flubs arriba. Para crear esta aplicación. Idealmente.translate Create Activity: Translate Perdido en Traducción Cuando primero pensé acerca de este ejemplo.

Note que si hay sólo una vista en fila. usted no tiene Para utilizar a un TableRow para contenerlo. tocándola). resulta de más para utilizar al androide: layout_width= and android:layout_height= on en cada vista como usted tenga que Con LinearLayout. En este ejemplo.xml <?xml version="1.GARCIA JIM android:id="@+id/original_text" android:hint="@string/original_hint" android:padding="10dip" android:textSize="18sp" /> <TableRow> <TextView android:text="@string/to_text" /> <Spinner android:id="@+id/to_language" /> </TableRow> <TextView android:id="@+id/translated_text" android:padding="10dip" android:textSize="18sp" /> <TextView android:text="@string/back_text" /> <TextView android:id="@+id/retranslated_text" android:padding="10dip" android:textSize="18sp" /> </TableLayout> </ScrollView> En este ejemplo.0" encoding="utf-8"?> <resources> <array name="languages"> <item>Bulgarian (bg)</item> <item>Chinese Simplified (zh-CN)</item> <item>Chinese Traditional (zh-TW)</item> <item>Catalan (ca)</item> <item>Croatian (hr)</item> <item>Czech (cs)</item> <item>Danish (da)</item> <item>Dutch (nl)</item> <item>English (en)</item> <item>Filipino (tl)</item> <item>Finnish (fi)</item> <item>French (fr)</item> <item>German (de)</item> <item>Greek (el)</item> <item>Indonesian (id)</item> <item>Italian (it)</item> .xml: Download Translate/res/values/arrays. La clase de la Máquina de Hilar es una nuevo que no hemos visto antes. Es parecido a un El cuadro combinado en otros toolkits de la interfaz de usuario. y una lista de valores posibles aparece Para que ellos escojan. le tenemos cinco filas. También. La lista real se guarda como un recurso del Androide en el archivo res/values/ arrays. El usuario selecciona la máquina de hilar (Por ejemplo. vamos a usar este control para Haciendo una selección de una lista de lenguajes. cada uno fila conteniendo a unos pocos Las columnas.

ExecutorService.text.widget.concurrent.view.import android.private Runnable updateTask. .RejectedExecutionException.private Spinner fromSpinner. español) y un nombre breve (por ejemplo. .Activity. .private TextView retransText. .import android.concurrent.translate.concurrent.TextWatcher.widget. .util.EditText. .Future. es). .os.Executors.import java. .widget.private Spinner toSpinner. . 25 private TextView transText.import java.OnItemSelectedListener.Spinner.util.import android. Aquí está el contorno básico: Download Translate/src/org/example/translate/Translate.Editable. .import android. Usaremos el nombre breve al pasar por alto el lenguaje para el software de traducción de textos.TextView. . 15 import android.import android. .Handler. . 5 import java.widget.widget.View.import android. .ArrayAdapter. .os. . 30 .Bundle.text. .concurrent.import android.AdapterView. . Ahora comencemos a modificar la clase Translate. . Google Translation Note que cada valor tiene uno El largo nombre (por ejemplo. .example.import java.private Handler guiThread.AdapterView.import android.private TextWatcher textWatcher.java Line 1 package org.util. .import android. 10 import android.app.private OnItemSelectedListener itemListener.widget.GARCIA JIM <item>Japanese (ja)</item> <item>Korean (ko)</item> <item>Latvian (lv)</item> <item>Lithuanian (lt)</item> <item>Norwegian (no)</item> <item>Polish (pl)</item> <item>Portuguese (pt-PT)</item> <item>Romanian (ro)</item> <item>Russian (ru)</item> <item>Spanish (es)</item> <item>Serbian (sr)</item> <item>Slovak (sk)</item> <item>Slovenian (sl)</item> <item>Swedish (sv)</item> <item>Ukrainian (uk)</item> </array> </resources> Esto define una lista designada lenguajes eso contiene más de los lenguajes Reconocido por el API.public class Translate extends Activity { .private ExecutorService transThread.util.import android. .private EditText origText.

java /** Define data source for the spinners */ private void setAdapters() { // Spinner list comes from a resource.retranslated_text). justamente le lleva una agarradera a todo el Los elementos de la interfaz de usuario definidos en el archivo del layout: Download Translate/src/org/example/translate/Translate.layout.setAdapter(adapter).@Override . El método findViews ().java /** Get a handle to all user interface elements */ private void findViews() { fromSpinner = (Spinner) findViewById(R.simple_spinner_item). adapter. // Spinner user interface uses standard layouts ArrayAdapter<CharSequence> adapter = ArrayAdapter.to_language). android. 45 } -} Después de declarar algunas variables. Creceremos en músculo y tamaño todos esos otros métodos que llama por teléfono como vamos. .createFromResource( this. fromSpinner.original_text).id.array.setSelection(11). R.setAdapters(). transText = (TextView) findViewById(R. 35 .id.languages.setSelection(8).id. No se preocupe.R.private Future transPending.findViews(). retransText = (TextView) findViewById(R.id. // English (en) toSpinner.main).from_language). toSpinner = (Spinner) findViewById(R. 40 setContentView(R. toSpinner. definimos el método onCreate () empezando En línea 37 para darle un reset a la rosca y la interfaz de usuario. designados de onCreate () en línea 43.id. // Automatically select two spinner items fromSpinner. } El método setAdapters ().translated_text).GARCIA JIM .initThreading().setAdapter(adapter).setListeners().public void onCreate(Bundle savedInstanceState) { .layout. origText = (EditText) findViewById(R.onCreate(savedInstanceState). .setDropDownViewResource( android.simple_spinner_dropdown_item). designado de línea 42. .layout. // French (fr) } . .R. definen uno La fuente de datos para las máquinas de hilar: Download Translate/src/org/example/translate/Translate.super.

} ¿Las s Todo Este Delay y Rosca Rellenan Realmente a Necessary? Una razón que usted necesita para hacerlo así es evitar hacer también Muchas llamadas para el parte exterior tejen servicio. Pero usemos un retraso más pequeño. int position. Las buenas noticias son eso ora eso Lo he hecho una vez para usted. int after) { /* Do nothing */ } public void onTextChanged(CharSequence s. Si no escriben otra carta Antes de que el retraso de un segundo termina. Usted quiere esperar a que el usuario termina de mecanografiar antes ¿Enviando la petición. Me supongo qué ocurre Como el usuario entra en las tijeras de palabra. Una petición retardada comienza. Además de golpear la pelota de golf La carga innecesaria en el servidor. } public void afterTextChanged(Editable s) { /* Do nothing */ } }. De otra manera. Lo mismo apuesta por cambios de lenguaje. El programa ve la palabra Escrito en un carácter a la vez. sino cómo dice usted se hacen? El algoritmo usado aquí es que tan pronto como el usuario escribe una carta. View v. int count) { queueUpdate(1000 /* milliseconds */). lo cual gasta un poquito de batería El poder. luego c. posiblemente con retrocede un espacio porque nadie puede recordar Cómo deletrear salto de tijera. luego la petición va A través.GARCIA JIM En Androide. Después hacemos caer en una trampa los manipuladores de la interfaz de usuario en la rutina setListeners () (Designado de línea 44 de onCreate ()): Download Translate/src/org/example/translate/Translate. primero s. sería antieconómico en términos De poder. luego yo.xml) para un control de la interfaz de usuario (adentro Este caso. la primera petición es petición distante del fromthe Haga cola antes de que salga fuera. una máquina de hilar). El conjunto imponente de lenguajes definido en arrays. Si la petición está ya en el progreso. long id) { queueUpdate(200 /* milliseconds */). int start. int before. Haga que tú en realidad quiere hacer una trama ¿La petición de servicio para cada carácter? No realmente. usted puede usar el mismo patrón en su Posea programas asincrónicos. y bien Adelante. Usamos los layouts estándar provistos por Androide Para artículos individuales en la lista y para la caja desplegable que usted ve cuándo Usted selecciona la máquina de hilar. Intentamos interrumpirlo. int start. Cada petición requiere que la radio del dispositivo transmita Y recibe varios paquetes de datos. int count. itemListener = new OnItemSelectedListener() { public void onItemSelected(AdapterView parent. un Adaptador es una clase que ata una fuente de datos (en este caso. .java /** Setup user interface event handlers */ private void setListeners() { // Define event listeners textWatcher = new TextWatcher() { public void beforeTextChanged(CharSequence s.

} Definimos a dos oyentes: Uno que es designado cuando el texto para traducir es Cambiado y uno que es designado cuando el lenguaje es cola cambiada.retransText.translating).updateTask = new Runnable() { .000 milisegundos para texto Los cambios y un retraso de 200 milisegundos para los cambios de lenguaje. .newSingleThreadExecutor().// Begin translation now but don't wait for it 30 try { .setText(R.string.if (original.setText(R.trim(). // reference to activity . .java Line 1 /** .GARCIA JIM public void onNothingSelected(AdapterView parent) { /* Do nothing */ } }.string.transPending.original.toString(). . fromSpinner.addTextChangedListener(textWatcher). 10 // This task does a translation and updates the screen .cancel(true). 5 */ . 20 // Take care of the easy case .private void initThreading() { . which we start using an executor.empty).* and 2) The translate thread.* Initialize multi-threading.} else { 25 // Let user know we're doing something .Translate.guiThread = new Handler().translating).if (transPending != null) .// Cancel previous translation if there was one . Arbitrariamente destinamos un retraso de 1.public void run() { .* graphical user interface thread already started by Android.TranslateTask translateTask = new TranslateTask( .this.transText. .// Get text to translate .length() == 0) { . La petición de actualización es interior definido el método initThreading (): Download Translate/src/org/example/translate/Translate.setOnItemSelectedListener(itemListener). .retransText. La actualización () pone una petición retardada de actualización en la lista de conmoción del hilo principal Utilizando a un Manipulador.setText(R.String original = origText.transText. .transThread = Executors. // original text . toSpinner.setOnItemSelectedListener(itemListener).string. // Set listeners on graphical user interface widgets origText.getText().empty). There are two threads: 1) The main . 15 .string.setText(R.

Ese texto será reemplazado más tarde por ahí El texto traducido real.indexOf(')' ). Línea 37 propone la tarea nueva para lo El hilo de traducción. -} -} -} 45 }. int lparen = result. creamos una instancia de TranslateTask.transPending = transThread.GARCIA JIM . // Start an update if nothing happens after a few milliseconds guiThread. en línea 31. nosotros realmente no tenemos un valor de regreso desde los cambios TranslateTask La Interfaz Gráfica del Usuario en seguida. lo cual será programado por la cola Actualice () método. Una cuerda conteniendo el texto original.string.postDelayed(updateTask. delayMillis). pero usamos la referencia Futura de regreso en línea 18 para Cancélele la traducción si es necesario.} catch (RejectedExecutionException e) { . Línea 11 define la tarea de actualización.getSelectedItem(). aquí son algunas funciones de utilidad usadas adentro Otros lugares: Download Translate/src/org/example/translate/Translate.java /** Extract the language code from the current spinner item */ private String getLang(Spinner spinner) { String result = spinner. dándola uno La referencia para la actividad Translate así es que pueda llamar de regreso a cambiar el texto. las tomas les importa del caso donde no hay texto para traducir (la línea 22) Y suple los dos controles del texto donde el texto traducido aparecerá La cuerda " la Traducción..// Unable to start new task 40 transText. y los nombres breves de lo dos Los lenguajes seleccionados en las máquinas de hilar." (Línea 26).translation_error).setText(R.submit(translateTask). Finalmente.).substring(lparen + 1. } /** Request an update to start after a short delay */ private void queueUpdate(long delayMillis) { // Cancel previous update if it hasn't started yet guiThread. Adentro Este caso. // from language 35 getLang(toSpinner) // to language . . result = result. rparen). devolviéndole una referencia al valor Futuro de regreso. . Representamos al primero con un Manipulador del Androide y El segundo con el ExecutorService de Java.toString(). -} Tenemos dos hilos: El hilo del Androide principal destinado para la interfaz de usuario Y uno traduce flujo de ejecución que crearemos para correr lo real El trabajo de traducción. return result.setText(R. Concluir la clase Translate.removeCallbacks(updateTask).translation_error). Cuando consigue correr.getLang(fromSpinner).indexOf('(' ).. Le cancela cualquier traducción que está ya en el progreso (en línea 18). int rparen = result.string. } . primero va a traer el texto actual para Traduzca y luego se dispone a enviar un trabajo de traducción a lo traduzca El hilo.retransText. .

</string> <string name="translation_error">(Translation error)</string> <string name="translation_interrupted">(Translation interrupted)</string> </resources> . text). } })..post () para preguntar el flujo de ejecución principal de la Interfaz Gráfica del Usuario Para actualizar el texto en un control TextView. final String text) { guiThread. Este paso adicional es menester Porque usted no puede llamar por teléfono la interfaz de usuario funciona de interfaz de falta de uso Los hilos. Aquí está el archivo del / strings. Si allí Estaba ya una petición en la cola. y analiza gramaticalmente fuera del lenguaje breve El código necesitado por el API.0" encoding="utf-8"?> <resources> <string name="app_name">Translate</string> <string name="from_text">From:</string> <string name="to_text">To:</string> <string name="back_text">And back again:</string> <string name="original_hint">Enter text to translate</string> <string name="empty"></string> <string name="translating">Translating. compra la cuerda para que ítem. es distante.setText(text)..xml de / valores de res para el ejemplo Translate: Download Translate/res/values/strings. El setTranslated () y setRetranslated () que los métodos serán usados por TranslateTask Para actualizar la interfaz de usuario cuando los resultados traducidos regresan Del servicio de trama. Ambos llaman una función privada designada guiSet El Texto (). Translation QueueUpdate () pone una petición de actualización en la petición del hilo principal La cola pero lo dice para esperar un poco de tiempo antes de realmente corriéndolo. } /** Modify text on the screen (called from another thread) */ public void setRetranslated(String text) { guiSetText(retransText.xml <?xml version="1. } /** All changes to the GUI must be done in the GUI thread */ private void guiSetText(final TextView view.post(new Runnable() { public void run() { view. y guiSetText () serán designados por ahí lo traduce flujo de ejecución. text). } El método getLang () resuelve cuál ítem es actualmente seleccionado en uno La máquina de hilar.GARCIA JIM /** Modify text on the screen (called from another thread) */ public void setTranslated(String text) { guiSetText(transText. GuiSetText () usa el método Handler.

. Si usted está ansioso por aprender más acerca de datos A las fuentes y los datos teniendo fuerza obligatoria. de abrir al público una trama simple La página para usar un servicio asincrónico de trama. en página 171. Golpeando la Pelota de Golf El lenguaje normalizado de consulta para Trabajar. cubrimos mucho terreno. y maniobrando toda clase de red Los errores y las peticiones para interrupciones.GARCIA JIM No voy a incluir la fuente a la clase TranslateTask aquí porque Es más bien largo y contiene al Androide insignificante específico excepto por unos cuantos Depurando mensajes. Si a usted le gustaría ver un ejemplo agradable de llamar por teléfono uno El servicio descansado de trama utilizando HttpURLConnection. HTML / JavaScript programando Trasciende el alcance de este libro. el análisis gramatical resulta en Java El formato de Notación del Objeto de la letra (JSON). El siguiente capítulo explorará un nivel nuevo de interactividad a través de posición Y los servicios del sensor. 7. a usted puede pasárseles delante para Chapter 9. recomiendo a Java Concurrency En Practice Goe06 por Brian Goetz.5 de Avances Rápidos En este capítulo. luego usted puede hacer un download lo La fuente del sitio Web del libro. pero hay varios bien Las referencias disponibles. Si usted va a hacer mucha programación concurrente Con clases como ExecutorService.

a través de dispositivos baratos de SPG " Los acelerómetros de mano. como esos encontraron en el Nintendo Wii remoto " Mashups. Con La buena recepción y un poco de matemáticas.2 ¿Le deja el Gps Alguien el Entrometido saber Mi Location? No. nadie lo puede usar encontrarle. Es a usted siempre olvidar colocar su botón de llamada para vibrar cuando usted es ¿En el trabajo o el cine? La localidad puede encargarse tan utilizadora el Androide La API de la posición descrita aquí. originalmente desarrollado por las fuerzas armadas Pero luego convirtió para el uso del civil. por ejemplo. Cuál es Único acerca de Androide es cómo surten efecto estas tecnologías juntos. a menudo combinándose hace mapas con otra información Varios programas populares del Androide usan estos conceptos para crear uno más Compeliendo y la experiencia pertinente para el usuario. sabe dónde Es. puede usar eso también. la Posición. 8. y si usted está conectado Para un wifi hotspot. Pero a menos que uno de esos programas deliberadamente transmita eso La información. Algunos de ellos Es nuevo. Por ejemplo. y algunos se han visto antes de adentro otros trasfondos. las vigas las señales horarias altamente precisas Para aparatos receptores basados en tierras como el mismo en su teléfono Android. el chip de SPG pueden resolver su posición Para dentro de 50 feet. adelante . y Así de cualquier programa corriendo en su dispositivo Android. Mantenga en mente que todos estos Los proveedores de la posición son poco confiables hasta cierto punto. la Localidad El application1 puede adaptar los trasfondos en su teléfono basado en donde usted Es. las señales de Gps no le pueden alcanzar. nos dejó escribir un programa de prueba Eso simplemente exhibe su posición actual y se mantiene actualizándola adelante lo La pantalla como usted la maniobra aproximadamente. Demostrar los servicios de la posición de Androide. consideraremos lo siguiente: " La conciencia de la posición. el Androide también le da apoyo a calcular su posición La información utilizadora de teléfono celular cercano se encumbra. Cuando usted camina adentro Un edificio. la Posición Ahora mismo hay 31 satélites cerrando con zíper alrededor del mundo con nada Mejore para hacer que la ayuda a la que usted encuentra su camino la tienda de comestibles. El chip de Gps. En esto Subsidiaria.1.1 la Posición. Los aparatos receptores de Gps son simplemente que _ los aparatos receptores.GARCIA JIM Capítulo 8 Localizando y la Sensación La plataforma del Androide usa muchas tecnologías diferentes. Además del Gps. El sistema de posición global (el SPG). Usted puede ver el programa en Figura 8.

xml file before the <application> tag: Download LocationTest/AndroidManifest.example. Figura 8.xml <uses-permission android:name="android.GARCIA JIM La siguiente página.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android. ¿Dónde Estoy Yo? Comience por crear un "hola.6 Application name: LocationTest Package name: org." una aplicación del "androide" usando estos parámetros En el mago Nuevo de Proyecto: Project name: LocationTest Build Target: Android 1.permission. ambos proveedores de la posición de grano fino como el SPG y Los proveedores veteados en curso de la posición como la triangulación de la torre de la célula lo harán Sea soportado. usted necesitará echar estas líneas lo AndroidManifest. Para Logre entrar.locationtest Create Activity: LocationTest El acceso para la información de la posición está protegido por permisos del Androide.ACCESS_FINE_LOCATION" /> En este ejemplo.1: Examinando Al LocationManager .permission.

dumpLocation(location).import .location.app.best Criteria(). .TextView. 15 LocationListener 20 @Override .os.setContentView(R.LocationProvider. .public class LocationTest extends Activity implements { .import android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/output" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </ScrollView> Con los preliminares fuera del camino. . = mgr.private LocationManager mgr. (Ignore Lo La referencia para LocationListener en línea 15 por ahora. location = mgr. 10 import android. . -} -} .private TextView output.xml: Download LocationTest/res/layout/main.public void onCreate(Bundle savedInstanceState) { .import android.import android.Location.log("Location providers:" ).example.main).Activity.android. true).location.import java.import android.output = (TextView) findViewById(R. Le regresaremos Más tarde.java Line 1 package org.util.getLastKnownLocation(best).private String best. android. .GARCIA JIM Para la interfaz de usuario.layout.dumpProviders(). . 5 import android. vamos a imprimir todos los datos de la posición en uno TextView grande que enrolla.) Download LocationTest/src/org/example/locationtest/LocationTest. .xml <?xml version="1.Criteria.Criteria criteria = new .locationtest. . podemos iniciar codificación.output).widget.import android.getBestProvider(criteria. cuál está definido en res/layout/main.Bundle. 35 log("\nLocations . .LocationManager. .log("\nBest provider is: " + best).location.location.id.Location (starting with last known):" ). . 30 . . .0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas. . 25 mgr = (LocationManager) getSystemService(LOCATION_SERVICE).super.location.LocationListener. Aquí está lo El contorno de la clase LocationTest y el método onCreate ().List.onCreate(savedInstanceState). .

onResume(). En este ejemplo. // Start updates (doc recommends delay >= 60000 ms) mgr. Para ahorrar batería El poder. así es que lo podemos hacer Simplemente pase por alto una referencia para la actividad en lugar de hacer a un oyente nuevo El objeto. Esto está donde usted los pone. un minuto. Sin embargo. como mostrado aquí.java @Override protected void onResume() { super.removeUpdates(this). Éste podrían ser algunos segundos. etcétera. necesitamos engarzarnos en los métodos de ciclo biológico de actividad del Androide Pasando sobre la disposición de onResume () y onPause (): Download LocationTest/src/org/example/locationtest/LocationTest. He visto Algunos ejemplos que simplemente escogen lo primer disponible. una distancia mínima Menos de esto está ignorado). la exactitud.GARCIA JIM El punto de puesta en marcha para los servicios de la posición del Androide es el getSystemService () Llame en línea 25. el Androide recuerda la última posición que devolvió.requestLocationUpdates(best. Toma cuatro parámetros: El nombre del proveedor. Ahora usted sabe por qué implementa LocationTest LocationListener. Devuelve una clase LocationManager que economizamos en uno El campo para uso más adelante. Si usted tiene cualquier restricciones en el costo. llamamos nuestro método dumpProviders () a imprimir una lista de todo el Los proveedores de la posición en el sistema. llama a los requestLocationUpdates () El método en el objeto LocationManager. O más. ¿Dónde vamos nosotros después? Actualizando la Posición Tener al Androide le notifica acerca de posición cambie. } @Override protected void onPause() { super. A merced del proveedor. this). Esta posición podría Esté atrasado de noticias _ por ejemplo. La proveedora de la posición será pelusa accionada si no es necesaria Por algún rato. } Cuando la aplicación vuelve a la carga. Aquí está la definición de los cuatro métodos requeridos por esa interfaz: . Saber dónde fuimos es sólo la mitad de diversión. poder. nosotros que las actualizaciones de faltante sólo cuando el programa están en primer plano.onPause(). uno El retraso (los cambios (así es que usted no obtiene actualizaciones demasiadas veces). puede tomar bastante tiempo para el dispositivo para Resuelva su posición actual. Por consiguiente. // Stop updates to save power while app paused mgr. Cuando la hoja de solicitud toma una pausa. La voluntad del androide Escoja al mejor proveedor según una Criteria que usted provee (vea línea 31). 1. Después necesitamos escoger uno de los proveedores posibles para usar. llamamos a removeUpdates () a dejar de llegar Actualiza. En línea 29. llamamos a requestLocationUpdates () a empezar El proceso de actualización. así Podemos poner en duda y podemos imprimir eso inmediatamente en línea 36. excepto recomiendan a usar el método getBestProvider (). si el dispositivo estuviese apagado y emocionado Pero es usualmente mejor que nada. no hay restricciones. 15000. Eso nos salvará acerca de 1KB de memoria en runtime. y un objeto LocationListener.

GARCIA JIM
Download LocationTest/src/org/example/locationtest/LocationTest.java public void onLocationChanged(Location location) { dumpLocation(location); } public void onProviderDisabled(String provider) { log("\nProvider disabled: " + provider); } public void onProviderEnabled(String provider) { log("\nProvider enabled: " + provider); } public void onStatusChanged(String provider, int status, Bundle extras) { log("\nProvider status changed: " + provider + ", status=" + S[status] + ", extras=" + extras); } El método más importante en el racimo es onLocationChanged (). Como el nombre sugiere, es designado cada vez que el proveedor nota eso La posición del dispositivo ha cambiado. El onProviderDisabled ((), onProviderEnabled ), y onStatusChanged () que los métodos pueden usarse para cambiar para otro Los proveedores en caso su primera elección se vuelve agotada. El código para los demás métodos de leño LocationTest ((), dumpProviders ), y la dumpLocación () no es muy interesante, así es que no le aburriré Con eso aquí. Usted puede encontrar todo ello en las pruebas bajables desde disco en lo El sitio Web del libro. Las Notas de Emulación Si usted corre el ejemplo LocationTest en un dispositivo verdadero, saldrá a la vista su La posición actual como usted el paseo aproximadamente. En el emulador, usa una estafa El proveedor de SPG que siempre devuelve la misma posición a menos que usted cambia Eso. Hagamos eso ahora. En Eclipse usted puede cambiar su posición simulada utilizando al Emulador La vista de control (Window > Show View > Other... > Android > Emulator Control). Desplace la imagen hacia abajo de la pantalla para el fondo, y usted encontrará un lugar para entrar La longitud y la latitud manualmente. Cuando usted da un clic sobre el botón Send, El eclipse enviará la posición nueva al dispositivo emulado, y usted verá Exhibió en cualquier programas que lo esperan. Usted también puede correr el programa DDMS fuera de Eclipse y puede enviar estafa La posición cambia de esa manera. Además de manual, la posición en un tiempo Actualiza, usted puede usar una lectura grabada del camino de un archivo externo. Vea La documentación DDMS para más information.3 Con proveedores de la posición del Androide, usted puede averiguar donde usted está dentro uno El sentido amplio, global. Si usted quiere más información local como inclinación y La temperatura, usted tiene que usar un API. diferente Que es el tema de lo La siguiente sección. 8.2 Colocan A Sensors para Maximum Digámosle escribe un juego de carreras así es que usted necesita darle al jugador uno La forma para timonear su coche en la pantalla. Una forma sería usar botones, Como conducir juega en un Sony Playstation o el Nintendo DS. El derecho de la prensa Timonear prensa bien, dejada para timonear salió, y el agarre abajo de otro botón para El gas. Surte efecto, pero no es muy natural. ¿Ha observado usted alguna vez alguien jugar uno de esos juegos? Inconscientemente,

GARCIA JIM
Se contonean de un lado para otro al hacer una curva de horquilla, Sacuda con fuerza al controlador al dar contra otro coche, inclínese hacia adelante cuando La aceleración, y el tirón echan para atrás al adoptar las suspensiones. No lo haría que sea ¿Enfríese si esos movimientos realmente tuvieron algún efecto en la obra teatral de juego? Ahora Pueden. Embragando Sensores El Android SDK soporta muchos tipos diferentes de dispositivos del sensor: " TYPE_ACCELEROMETER: Mide aceleración en la x, y, y hachas z " TYPE_LIGHT Le dice qué tan brillante su área circundante es " TYPE_MAGNETIC_FIELD: Devuelve atracción magnética en la x, y, y Las hachas de la z " TYPE_ORIENTATION: Mide la guiñada, el tono, y rollo de lo El dispositivo " TYPE_PRESSURE: Siente la presión atmosférica actual " TYPE_PROXIMITY: Provee la distancia entre el sensor y Algún objeto " TYPE_TEMPERATURE: Mide la temperatura de lo circundante El área No todos los dispositivos ofrecerán toda esta funcionabilidad, de course.4 El ejemplo SensorTest, disponible en el libro el sitio Web, demuestra Utilizar API. Sensor SensorManager Android que la clase es parecido a LocationManager, Pero las actualizaciones se originarán bastante más rápidamente, quizá Los centenares por segundo. Para ganar acceso a los sensores, usted primero llama por teléfono lo El método getSystemService () como esto: Download SensorTest/src/org/example/sensortest/SensorTest.java private SensorManager mgr; // ... mgr = (SensorManager) getSystemService(SENSOR_SERVICE); Luego usted llama al registerListener () en su método onResume () a empezar Metiendo actualizaciones y unregisterListener () en su método onPause () alto Obteniéndolos. Interpretando Lecturas del Sensor El servicio del sensor llamará su método onSensorChanged () todo el tiempo Un valor cambia. Debería mirar algo así como esto: Download SensorTest/src/org/example/sensortest/SensorTest.java public void onSensorChanged(SensorEvent event) { for (int i = 0; i < event.values.length; i++) { // ... } } Todos los sensores devuelven un montón de valores en coma flotante. El tamaño de lo El conjunto imponente depende del sensor particular; Por ejemplo, TYPE_ TEMPERATURE devuelve sólo un valor, la temperatura en centígrado de grados. Usted aun no puede necesitar usar todos los números devueltos. Para La instancia, si usted justamente necesita un rumbo proa brújula, usted puede usar la primera parte El número regresó del sensor TYPE_ORIENTATION.

GARCIA JIM
Revolviendo las inscripciones del sensor (especialmente del acelerómetro) en La información significativa es algo de un arte negra. Aquí hay algunos consejos Para mantener en mente: " Las lecturas del acelerómetro son sumamente nerviosas. Usted necesitará alisar Expulse los datos usando alguna clase de premediación oprimida, pero usted lo ha hecho Cuidarse de no alisarle demasiado, o su interfaz sentirá El laggy y suave. " Los números del sensor vendrán al azar por. Usted puede ponerse varios En fila, luego tenga un compás de espera, y luego reciba un racimo más. No asuma una tasa constante agradable. " Intente aventajar al usuario prediciendo lo que van a hacer Después. Digamos que las últimas tres lecturas muestran el principio de un rollo a La derecha, con cada uno un un poco de ayunador que lo último. Usted puede adivinar Con algún grado de exactitud lo que la siguiente lectura vaya a ser Y el reaccionar principios basó en su predicción. El uso más desafiante de sensores es un juego de acción que requiere Una conexión individual de en medio cómo las maniobras del jugador el dispositivo y Lo que da con la pantalla. Desafortunadamente, el emulador no va a Sea mucho uso para esta cosa. Las Notas de Emulación Según Google, no cabe probar los sensores acostumbrando lo El emulador en absoluto. La mayoría de computadoras no tienen un sensor ligero, un chip de SPG, O una brújula incorporada en ellos. De seguro, si usted corre al SensorTest Programe en el emulador, no exhibirá resultados en absoluto. Sin Embargo, Uno El proyecto llamó a OpenIntents5 provee la API de un sensor alterno que usted Puede demandar justamente probando propósitos. La forma que surte efecto es que usted asocia al emulador para otra aplicación Funcionar con su computador de escritorio llamó el Simulador del Sensor. El simulador muestra un cuadro de un teléfono virtual y le deja moverlo Alrededor de adelante la pantalla con el ratón (vea Figura 8.2, en la siguiente página) Y luego alimenta esos movimientos para su programa Android corriendo En el emulador. Si su computadora de desarrollo realmente tiene sensores Del suyo (guste al Apple MacBook) o usted puede conectarse a un Wii Remoto con Bluetooth, el Simulador del Sensor puede usar eso como una información La fuente.

. Ahora que usted sabe las llamadas de bajo nivel para obtener su posición y averiguación Los sensores para números como su brújula dirigiendo. Manténgase pellizcando sus algoritmos hasta eso Parece estar bien. La idea fue rápidamente emulada por otros vendedores Como Corporación Microsoft y Provinciano.6 Using Java La letra y el XmlHttpRequest objetan. pero la versión Google es discutiblemente Aquiete lo mejor. Google Maps 8. con toda seguridad Las aplicaciones que usted puede olvidar tan y justamente puede usar el API. El espectador zumbable del mapa de alisado.GARCIA JIM Figura 8.2: La falsificación fuera de los sensores con el Simulador del Sensor Lo negativo es que usted tiene que modificar su código de la fuente para hacerlo El trabajo. Mi recomendación es olvidarme de emulación del sensor y Atrape un dispositivo verdadero. Vea el sitio Web OpenIntents para más información si se desea Para probarlo. ingenieros Google crearon a un draggable.3 la Vista Panorámica Una de las primeras "aplicaciones homicidas(killer apps´ )" para Ajax fue Google Maps. sedoso que corrió en cualquier trama moderna El navegador sin un plug-in.

Eso es por qué Google creó el control MapView. Web con una Vista.3). Puede mostrar su posición actual en el mapa y aun el despliegue una brújula Mostrando qué dirección usted se dirige.GARCIA JIM Figura 8. Incrustando A Un MapView Un MapView puede estar incrustado directamente en su aplicación Android con Simplemente algunas líneas de código. La mayor parte de la funcionabilidad de Google Hace Mapas.example. Pero la arquitectura de su aplicación estaría excesivamente con muchas curvas. Primero cree un "hola.mymap Create Activity: MyMap . y Se engarza para sumar sus toques.6) Application name: MyMap Package name: org. Creemos un programa de muestra Para demostrar unos cuantos de sus capacidades. quizá con uno incrustado El control WebView tan discutido en la Sección 7." una aplicación del "androide" usando estos valores en lo El mago: Project name: MyMap Build Target: Google APIs (Platform: 1. es provisto (vea Figura 8. adelante Página 131.3: El mapa incrustado mostrando su posición actual Usted puede usar estos mapas basados en la Web en Androide.2. La clase MapView también puede relacionarse con su posición y proveedores del sensor.

android.maps.google.intent.permission.android. Android.7 Note que tenemos para utilizar el nombre con creces calificado (com.google.com/apk/res/android" android:id="@+id/frame" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.MAIN" /> <category android:name="android.permission.LAUNCHER" /> </intent-filter> </activity> <uses-library android:name="com.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas. Eso es porque los APIs Google Maps no forman parte De la distribución normal del Androide.mymap" android:versionCode="1" android:versionName="1.permission.GARCIA JIM Reparo en que acostumbramos lo "hacen búsquedas en la Internet usando Google que APIs" construyen blanco en lugar de lo "El androide 1.xml <?xml version="1.MyMap" android:label="@string/app_name" > <intent-filter> <action android:name="android.google.MapView android:id="@+id/map" android:apiKey="MapAPIKey" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </LinearLayout> Substitúyale a MapAPIKey con una llave de API de Mapas Google de la que usted obtiene Google. Edite el archivo del layout.0" > <uses-permission android:name="android.xml: Download MyMap/AndroidManifest. También necesitamos atascarnos a <uses-library> tag in the <application> element of AndroidManifest.android.category.5" el blanco.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.maps" /> </application> <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4" /> </manifest> .ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.com/apk/res/android" package="org.action.xml <?xml version="1.android.maps.example.INTERNET" /> <application android:icon="@drawable/icon" android:label="@string/app_name" > <activity android:name=". y reemplácelo Con un MapView que asume el control de la pantalla entera: Download MyMap/res/layout/main.MapView) porque MapView no es un Androide estándar La clase.intent.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.

onCreate(savedInstanceState).main).layout. Alistándose La primera cosa que necesitamos hacer es llamada findViewById () al que ganar acceso lo MapView y su envase. initMyLocation().java /** Find and initialize the map view. import android.android. Además de los proveedores de la posición buena y de grano grueso.mymap.getController().android.Bundle.google.setBuiltInZoomControls(true).android.GARCIA JIM Si usted omite la > etiqueta de la biblioteca de usos. private MapController controller. El MapActivity que la clase hace girar arriba del trasfondo avanza con pies de plomo. usted traerá a un ClassNotFoundException En runtime.MapController.maps.google. @Override public void onCreate(Bundle savedInstanceState) { super. Aquí está el contorno de la clase MyMap: Download MyMap/src/org/example/mymap/MyMap.setSatellite(true). */ private void initMapView() { map = (MapView) findViewById(R. el Mapa La clase de vista necesita acceso de la Internet a fin de que pueda llamar los servidores de Google Para obtener las tejas de imagen del mapa. } .id. hace animaciones.maps. setContentView(R.MapView. manipula esconder en reserva. import com. import com. está conectado para La Internet para datos de la tile. cautela de tomas de El ciclo biológico. initMapView(). Podemos hacer eso en el método initMapView (): Download MyMap/src/org/example/mymap/MyMap. } } La parte más importante es que su actividad tiene que extender a MapActivity.android. import com.MapActivity. public class MyMap extends MapActivity { private MapView map.maps.google.MyLocationOverlay.map).google. Todo lo que usted necesita hacer es correctamente determinado eso arriba Y el alquiler eso el empuje. import com. y bastante más. } @Override protected boolean isRouteDisplayed() { // Required by MapActivity return false.os.maps. Estos serán escondidos en reserva en su aplicación El directorio automáticamente. map. map.java package org. controller = map.example.

Http://code. overlay. controller. .animateTo(overlay. Cuando usted pasea Llevando el teléfono. En este caso.maps Package ¿Y No android. el punto en el mapa le debería seguir.GARCIA JIM El método getController () devuelve a un MapController que soleremos situar Y el zoom the map. Toque y arrastre la pantalla para ir de arriba abajo por el mapa. Es fuente abierta y disponible en cada dispositivo del Androide. map). Por qué Sea MapView en el com.enableMyLocation().getMyLocation()). } }). setSatellite () el mapa en satélite El modo. map. usted debería ver algo así como Figura 8.google. nos sedimentamos El nivel de zumbido y luego inicie una animación que mueve el mapa de Dondequiera que apunta ahora hacia donde usted está ubicado. y setBuiltInZoomControls () 8 vueltas en los controles estándar de zumbido.3.getOverlays(). usted puede comenzar a rodar sus puntos de vista y puede encontrar sus datos Las fuentes. Que en este caso es un punto que pulsa mostrando su posición actual. Usted La enableMyLocación de llamada () para distinguir la capa superpuesta a comenzar a escuchar para la posición Actualiza y enableCompass () para decirles que comiencen a escuchar actualizaciones de La brújula. //overlay. pero eso no va a ser fácil o barato. Por ahí El contraste.android.add(overlay).google.html El androide provee a un MyLocationOverlay la clase que hace más de la persona de mucha importancia El alzamiento.maps? Cualquier código en el androide.setZoom(8). Y el uso los botones de zumbido para obtener una apariencia más cercana. Haga búsquedas en la Internet usando Google provee la API libre de cargo tan largo como Usted accede a ciertas condiciones.runOnFirstFix(new Runnable() { public void run() { // Zoom in to current location controller. Una capa superpuesta es simplemente algo que se traza encima del mapa.El * empaqueta está en parte del corazón del Androide. los mapas es propietario para Google y para la información Los proveedores que hacen búsquedas en la Internet usando Google pagaron por la información geológica y La imaginería. . El último paso es decirle al MapView que siga su posición en el initMy El método de la posición (): Download MyMap/src/org/example/mymap/MyMap.java /** Start tracking the position on the map. Si usted corre el programa ahora. Si usted no es feliz con lo Las restricciones. El método runOnFirstFix () dice la capa superpuesta qué hacer a la primera vez ella Pone una posición a rezar del proveedor de la posición. */ private void initMyLocation() { final MyLocationOverlay overlay = new MyLocationOverlay(this. En página 165. La clase MapView se encargará de hacer los controles visibles cuando lo El usuario cocina en un sartén el mapa y desdibujarlos lentamente al criticar severamente altos.enableCompass(). // does not work in emulator overlay.com/apis/maps/terms.

pero usted también lo puede usar hacer otras cosas como Haga una lectora de código de barras. Como antes. un leño de viaje de posiciones. el encarte de la brújula no será mostrado Porque el sensor de la brújula no es emulado. Las fotos. en combinación Con tendencias como la adopción de Internet del móvil de banda ancha Y el crecimiento exponencial de computar poder y almacenamiento. Si eso no es su El área de interés. . El androide Provee el class9 Camera para fotografiar usando lo incorporado La cámara (si hay uno). consúltele la documentación en línea. y las notas) localmente en su teléfono móvil.3. Siga las direcciones en la Sección 1.4 Avances Rápidos Este capítulo le inició en el Nuevo Mundo excitante de posición y La computación móvil consciente medioambiental. a usted puede pasársele delante para Chapter 10. use el Control del Emulador La vista en proceso de desaparición (o en el programa DDMS autónomo) para alimentar GPS falso Los datos para la aplicación de muestra. 8. Estas tecnologías. Otra forma de percibir el mundo es mirando y escuchando.GARCIA JIM Las Notas de Emulación La primera vez que usted corra el programa MyMap en el emulador usted puede llegar Un Android AVD Error. El MediaRecorder Class10 le deja registro Y los clips audios de la tienda. Al correr en el emulador. Creating uno AVD. es Yendo para revolucionar la forma le interactuamos computadoras y Cada quien. pero si Usted los necesita para su programa. Hablando de almacenamiento. el siguiente capítulo le mostrará cómo usar lenguaje normalizado de consulta Almacenar estructuró información (por ejemplo. 3D Graphics adentro OpenGL. En el emulador. usted inicialmente verá un zoomed expulsar mapa del mundo y Ningún punto para su posición actual. Estos trascienden el alcance de este libro. adelante mande a llamar 191 y aprenda a desenllavar el 3D escondido de Android El potencial de gráficos. adelante mande a llamar 20 para crear a un AVD nuevo para lo "hacen búsquedas en la Internet usando Google que APIs" construyen blanco "Em15google" designado.

usted mirará en la clase ContentProvider. y muchos otros lugares. No hay servidor. ningún config El archivo. AIRE Adobino. Almacenando Datos Locales. "No requiere plan o administración. Finalmente. "Es pequeño. Symbian llama por teléfono. Sin embargo. SQLite. Eso es cambiante con en trozos pequeños incorporado los motores como el incluido con la plataforma del Androide. Por los pasados 30 años. Usted también aprenderá a usar los datos de Androide teniendo fuerza obligatoria para conecte sus fuentes de datos para su interfaz de usuario.GARCIA JIM En Capítulo 6. que deja dos aplicaciones compartir lo mismos datos. hay una mejor forma para almacenar grande las cantidades de datos estructurados: una base de datos relacional. Este capítulo le mostrará cómo usar incorporada base de datos del Androide Motor. La versión actual se trata de 150KB. nunca tomando más de lo que usted da. Hay tres razones por qué es tan popular: "Es gratis. exploró mantenerse los datos alrededor en las Preferencias y en archivos simples. SQLite puede ser encontrado en la Apple IPhone. Richard Hipp en 2000. computadora Mac La x del sistema operativo. en página 116. Mozilla Firefox. El SQLite License El código de la fuente del SQLite no contiene licencia porque está de moda lo Dominio público. Skype. bien dentro lo el presupuesto de memoria de un teléfono del Androide. Los autores lo han colocado en el dominio público y no hacen haga un cargo por su uso. Es discutiblemente la mayor parte de base de datos de lenguaje normalizado de consulta ampliamente utilizada el motor en el mundo. Solaris. pero hasta hace poco fueron muy caras y dificultoso para el uso de escala más pequeña. Que usted pueda encontrar perdón para usted mismo y puede perdonar a los otros. la fuente le ofrece esto Bendición: Que usted pueda obrar bien y no maldad. las bases de datos han sido una grapa de aplicación de la empresa El desarrollo. Que usted pueda compartir libremente. 9. Que las obras multan cuando lo la cantidad de datos es pequeña o cuando los datos es todo un tipo (tan uno la foto o un archivo de audio). y ninguna necesidad para un administrador de la base de datos. PHP. Capítulo 9 Poniendo a trabajar lenguaje normalizado de consulta . Además de Androide.1 Introduciendo SQLite El SQLite1 es un motor de la base de datos diminuto pero energético creado por Dr. En lugar de una licencia.

en lo siguiente La página). Usted puede saltarse esta sección y el empuje para la Sección 9.2 SQL 101 Si usted ha utilizado a la Oracle.GARCIA JIM Una base de datos del SQLite es simplemente un archivo. lo puede mover de un lado para otro. usted propone declaraciones de lenguaje normalizado de consulta y regresa Resultados. u otra base de datos Motores. Aló. la Base de Datos. Figura 9. Por lo demás de usted. la maniobra. Modificación.. .3. A través su ayudante clasifica y métodos de conveniencia. cueros del Androide una cierta cantidad de lo la sintaxis de usted. e incluso lo copia para otro sistema (por ejemplo. Hay tres tipos principales de declaraciones de lenguaje normalizado de consulta: Lenguaje de descripción de datos.. 9. de su teléfono para su estación de trabajo). aquí un refresco rápido. en ese entonces el lenguaje normalizado de consulta debería estar pasado de moda para usted.1. el Servidor de lenguaje normalizado de consulta. y eso surtirá efecto muy bien. usted maneja (el lenguaje normalizado de consulta) declaraciones Estructuradas de Lenguaje de Consulta. en página 174. Usted puede tomar ese archivo. Usted puede usar la orden del adb o la vista del Explorador del Archivo En Eclipse (> el Otro de Vista de > Espectáculo de la Ventana . MySQL. o lo borra. pero usted todavía necesita saber un poquito de lenguaje normalizado de consulta para usarlo. El androide almacena el archivo en lo / el directorio de /packagename/databases de datos /datos (vea Figura 9. Para usar una base de datos de lenguaje normalizado de consulta. DB2. En lugar de llamar Java Yo las rutinas de la /O para ganar acceso a este archivo de su programa.Y la Averiguación. el Explorador del > Archivo del > Androide) para La vista.1: El SQLite almacena una entera base de datos en un archivo.

GARCIA JIM
Las declaraciones de lenguaje de descripción de datos DDL Statements Un archivo de la base de datos puede tener cualquier número de mesas. Una mesa consiste en filas, y cada fila tiene un cierto número de columnas. Cada columna de lo la mesa hace un nombre y unos datos determinar el tipo sanguíneo (avise por escrito cuerda, número, y así sucesivamente). Usted define estas mesas y la columna nombra por primero Definición corredora de Datos Las declaraciones de lenguaje (el lenguaje de descripción de datos). Aquí hay una declaración que crea uno la mesa con tres columnas:
Download SQLite/create.sql

create table mytable ( _id integer primary key autoincrement, name text, phone text );

Una de las columnas es denominada como la LLAVE PRIMARIA PRIMARY KEY , un número que Excepcionalmente identifica la fila. EL AUTOINCREMENTO AUTOINCREMENT quiere decir que la base de datos Continuará diciendo que 1 para la llave para cada registro hacer seguro es único. Por ahí Convención, la primera columna es siempre llamado _ id. La columna de _ id no es estrictamente requeridos para SQLite, pero más tarde cuando queremos utilizar a un Androide ContentProvider, lo necesitaremos. para poner en marcha la simple y constitución desde allí. Abra un nuevo "hola, Androide" programe usar estos valores en el mago de proyecto:
Project name: Events Build Target: Android 1.6 Application name: Events Package name: org.example.events Create Activity: Events

Como siempre, usted puede hacer un download del código originario completo del libro Sitio Web. Necesitamos en alguna parte mantener algunas constantes describiendo la base de datos, así es que creemos una interfaz de Constantes:
Download Eventsv1/src/org/example/events/Constants.java

package org.example.events; import android.provider.BaseColumns; public interface Constants extends BaseColumns { public static final String TABLE_NAME = "events" ; // Columns in the Events database public static final String TIME = "time" ; public static final String TITLE = "title" ; }

GARCIA JIM
Cada acontecimiento será almacenado como una fila en la mesa de Eventos. Cada fila lo hará tenga un _ id, de tiempo, y la columna del título. _el id es la llave primaria, declarada adentro Los BaseColumns interfaz que extendemos. la vez y se destinó para titulamos un estampilla de tiempo y acontecimiento titulan, respectivamente. Usando SQLiteOpenHelper Después creamos una clase del ayudante llamada EventsData para representar la base de datos Sí mismo. Esta clase prolonga la clase del SQLiteOpenHelper Android, que maneja creación de la base de datos y versiones. Todo lo que usted necesita hacer es proveer un constructor y sobresueldo dos métodos.
Download Eventsv1/src/org/example/events/EventsData.java Line 1 package - import - import 5 import - import - import - import - import 10 - public

org.example.events;

static android.provider.BaseColumns._ID; static org.example.events.Constants.TABLE_NAME; static org.example.events.Constants.TIME; static org.example.events.Constants.TITLE; android.content.Context; android.database.sqlite.SQLiteDatabase; android.database.sqlite.SQLiteOpenHelper; class EventsData extends SQLiteOpenHelper { static final String DATABASE_NAME = "events.db" ; static final int DATABASE_VERSION = 1;

- private - private 15 /**

Create a helper object for the Events database */ EventsData(Context ctx) { DATABASE_NAME, null, DATABASE_VERSION);

- public

- super(ctx, -} -

20 @Override - public

void onCreate(SQLiteDatabase db) { TABLE " + TABLE_NAME + " (" + _ID

- db.execSQL("CREATE -+ -+

" INTEGER PRIMARY KEY AUTOINCREMENT, " + TIME " INTEGER," + TITLE + " TEXT NOT NULL);" );

25 } - @Override - public - int

void onUpgrade(SQLiteDatabase db, int oldVersion,

newVersion) { TABLE IF EXISTS " + TABLE_NAME);

30 db.execSQL("DROP -

onCreate(db);

-} -}

GARCIA JIM
El constructor empieza en línea 16. DATABASE_NAME es el real nombre de archivo de la base de datos que estaremos usando (events.db), y DATABASE_VERSION es justo un número que hacemos. Si esto fuera un verdadero programa, usted aumentaría el número de versión cada vez que usted tuvo para hacer cambios significativos el diseño de la base de datos (por ejemplo, para sumar una nueva columna). La primera vez que usted intenta ganar acceso a una base de datos, SQLiteOpenHelper se fijará no existe y llama al método onCreate () para crearlo. En línea 21, pasamos sobre la disposición de eso y corremos uno CREA declaración de lenguaje normalizado de consulta DE ALTER TABLE SQL Esto creará los Eventos posponen y el archivo de la base de datos del events.db que lo contiene. Cuando el Androide detecta que usted está estableciendo referencias para una vieja base de datos (basado adelante el número de versión), llamará al método onUpgrade (la línea 28) (). Adentro este ejemplo, sólo borramos la vieja mesa, pero usted podría hacer algo más listo aquí si Ud. quiere. Por ejemplo, usted podría manejar un lenguaje normalizado de consulta ALTER TABLE SQL capitanee añadirle una columna a una existente base de datos. Definiendo el Programa Principal Nuestro primer intento en el programa de Eventos usará una base de datos local del SQLite para almacenar los Eventos, y a eso les mostrarán como una cuerda dentro de un TextView. ¿Por qué Son las Constantes Una Interfaz? Es una cosa de Java. No sé de a usted, pero me desagrada tener que repita el nombre de clase cada vez que use una constante. Por ejemplo, Quiero sólo escribir just type TIME y no Constants.TIME. Tradicionalmente, la forma para hacer eso en Java es uso interfaces. Las clases pueden heredar de la interfaz de Constantes y en ese entonces omite la interfaz nombre al ponerle notas a algunos campos. Si usted mira a los BaseColumns Interactúe, usted verá al Androide que los programadores utilizaron lo mismo truco. Comenzando con Java 5, sin embargo, hay una mejor forma: La estática Importaciones. Ese es el método que usaré en EventsData y otro las clases en este capítulo. Desde las Constantes está una interfaz, usted lo puede hacer úsele la vieja forma o el nuevo método como usted escoge. Desafortunadamente, a partir de esta escritura, el soporte del Eclipse para la estática las importaciones es un poco lleno de manchas, así que si usted usa importaciones estáticas en la suya Programas, Eclipse no pueden insertar las declaraciones del artículo importado para usted Automáticamente. Aquí hay un truco pequeño para usuarios del Eclipse: escriba un comodín el artículo importado estático después de la declaración del paquete (por ejemplo, org.example.events.Constants de estática del artículo importado.*;) para hacer cosas compile. Más tarde, usted puede usar Importaciones Originarias > Organize para expandir el comodín y tipo las declaraciones del artículo importado. Esperemos que esta voluntad sea más intuitivo en versiones futuras de Eclipse.

import 5 import .Constants. static org. static org.events.2. El programa principal es el método onCreate () en la actividad de Eventos.BaseColumns. Aquí hay el contorno Download Eventsv1/src/org/example/events/Events.content.import - android.Bundle. static android.TITLE.import .TIME.GARCIA JIM Defina el archivo del layout (el layout/main.ContentValues. android.example.import . Figura 9.widget.Cursor.xml) como sigue: Download Eventsv1/res/layout/main. android. android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </ScrollView> Esto declara al TextView con un Idaho imaginativo de texto (R. Usted puede ver cómo mira en Figura 9. .events.id.2: La primera versión exhibe registros de la base de datos en un TextView.text en código secreto) y lo envuelve con un ScrollView en caso que hay demasiados Eventos para calzar bien en la pantalla.java Line 1 package .provider.TextView.sqlite.Constants.SQLiteDatabase.database.Activity. android.os.import .events.example. 10 import .android.example._ID.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas. android.events. static org.import . en lo siguiente La página.TABLE_NAME.app.import .example.Constants.import org.database.xml <?xml version="1.

llamamos al método showEvents () para exhibir la lista para el usuario. colocamos el layout para esta vista. null. cursor = getEvents().put(TITLE. 15 private - . Si usted mira adelante para aplicarle delineador a 27. Download Eventsv1/src/org/example/events/Events. y finalmente en línea 25. SQLiteDatabase db = events. System. En ese entonces creamos una instancia de la clase EventsData en línea 21 y de inicio un intento se bloquean. Table evento no sería muy interesante si no hubiera ningún evento tan en línea 23 llamamos al método addEvent () para añadirle un acontecimiento a él.public class Events extends Activity { EventsData events. quiere. ContentValues values = new ContentValues(). Así es que aunque un error ocurra en el medio.insertOrThrow(TABLE_NAME. Cada el tiempo que usted maneja este programa.@Override . la base de datos lo hará todavía esté cerrado. values. usted recibirá un nuevo acontecimiento. { . En línea 24.java private void addEvent(String string) { // Insert a new record into the Events data source. // You would do something similar for delete and update.main). ¿Bastante fácil.put(TIME.public void onCreate(Bundle savedInstanceState) { . 20 setContentView(R. values.onCreate(savedInstanceState). Sumando Una Fila El método addEvent () corta un nuevo registro en la base de datos acostumbrando lo la cuerda provista como el título de acontecimiento. Android!" ).Cursor 25 showEvents(cursor). eh? Ahora definamos esos nuevos métodos que acabamos de usar.getWritableDatabase().super.close().layout. db. pero lo haré salga que como un ejercicio para el lector. } . string).currentTimeMillis()).try - addEvent("Hello. -} -} 30 } En línea 20 de onCreate (). values).GARCIA JIM . usted puede ver que cerramos la base de datos adentro lo finalmente bloquéese. llamamos al método getEvents () para conseguir la lista de Eventos. Usted podría sumar menúes o los gestos o los teclazos para generar otros Eventos si Ud. - events = new EventsData(this). . -} - finally { events.

y ORDER_BY distingue SQLite para devolver los resultados en orden de más nuevo para más viejo. Usted no necesita pasar en el Idaho discográfico porque el SQLite hará se mantiene un paso adelante y regresa eso de la llamada de método. The Activity will handle closing // and re-querying the cursor when needed. Si usted la necesidad para cantidad de cosas arriba o las modificaciones de retraso por alguna razón. Manejando a Query El método getEvents () hace el Query de la base de datos para conseguir una lista de Eventos: Download Eventsv1/src/org/example/events/Events. private Cursor getEvents() { // Perform a managed query. Como el nombre entraña. null. Por defecto. FROM. el programa Terminará la relación. TITLE. null. Cursor cursor = db. . la consulta lo El sitio Web del SQLite para más detalles. private static String ORDER_BY = TIME + " DESC" . la base de datos está actualizada. el regreso el valor es un objeto del Cursor que representa el set de resultado. null. La agarradera de la base de datos es Escondido en reserva. y un traceback será echado para el leño del Androide. No tiene que ser declarado con una palabra clave de lanzamientos porque es un RuntimeException y no una excepción revisada.java private static String[] FROM = { _ID. insertOrThrow (de tipo () puede tirar algo único en su género La SQLExcepción) si fracasa. DE es un montón de las columnas queremos. así es que llamamos a getReadableDatabase ( ) para conseguir una agarradera de sólo lectura. De una u otra manera. Si usted escoge. Aunque no los usemos en este ejemplo. TIME. En ese entonces llamamos a la Query () para actuar la declaración SELECT sql real de lenguaje normalizado de consulta. null.query(TABLE_NAME. SQLiteDatabase db = events. startManagingCursor(cursor). tan pronto como usted haga el inserto. el método de Query () lo ha hecho los parámetros para especificar una cláusula WHERE. si usted quiere. un GROUP BY cláusula. usted todavía puede maniobrar eso en un bloque de intento /cogida como cualquier otra excepción. la Query () es simplemente una conveniencia para el programador. return cursor. llamamos a getWritableDatabase () a llegar una lectura/escribe agarradera para la base de datos de Eventos. }. } No necesitamos modificar la base de datos para una Query. así es que usted puede llamar a este método cuantas veces a usted le guste.GARCIA JIM Desde que necesitamos modificar los datos. usted podría acumular la declaración SELECTA por usted mismo en una cuerda y el uso el método rawQuery () para ejecutarlo. Sin embargo. y uno HAVING Cláusula. Si usted no lo maniobra y hay un error. Después rellenamos un objeto ContentValues con el tiempo actual y el acontecimiento el título y el paso que para el método insertOrThrow () para hacer el INSERTO real La declaración de lenguaje normalizado de consulta. ORDER_BY). En verdad.getReadableDatabase().

que indica allí es no más filas. es colocado antes lo primero registre.String 10 builder. todos los cursores administrados estarán cerrados. sino surtirá efecto por ahora.text.append(title).getLong(1). Veremos cómo usarlo cuando exhibimos los resultados en un momento. Cuando usted primero consigue un Cursor. Usted llama a los métodos en eso para informarse acerca de la fila actual. -} En esta versión de Eventos. El paso final es llamar a startManagingCursor (). Nos mantenemos girar hasta moveToNext () devuelve falaz.GARCIA JIM Un Cursor es similar a una Java Iterator o un JDBC ResultSet. Dentro del lazo (línea 7).moveToNext () para avanzar a la siguiente fila en el conjunto de datos.append(id). vamos justamente a crear una cuerda grande (vea línea 3) para sujetar todos los artículos de Eventos. lo hará automáticamente desactive el cursor y entonces repóngalo en duda cuando la actividad es vuelta a arrancar. que pudimos haber solido recibir los números índice de la columna (los valores 0.append("\n" -} .append(": . getColumnIndex OrThrow ().builder.StringBuilder . Esto no es lo la forma recomendada para hacer cosas. Sin embargo."Saved 5 while . ). y en ese entonces usted llama a otro método a mudarse a la siguiente fila. cuando la actividad es hecha una pausa.append(": . Cuando la actividad se termina.append(time). Download Eventsv1/src/org/example/events/Events. es un poco lento. (cursor. Por ejemplo. .java Line 1 private .setText(builder).builder.long . usted le debería llamar fuera del lazo y recuerde los índices por usted mismo.id.long . separados por newlines. Aplíquele delineador a 5 llamadas el método Cursor.moveToNext()) { Could use getColumnIndexOrThrow() to get indexes id = cursor. que dice la actividad a encárguese de manejar el ciclo biológico del cursor basado en la vida de la actividad Ciclo. time = cursor.// Display on the screen text = (TextView) findViewById(R. 15 TextView . y en ese entonces anexa los valores para lo Cuerda (línea 10). . Hay otro método en Cursor.getLong(0).// events:\n" ). Esta función toma uno El cursor como el aporte y los formatos la salida así es que el usuario lo puede leer. y 2 pasaron para getLong () y getString ()). Exhibiendo los Resultados de Query El último método que necesitamos definir es showEvents ().getString(2). así llamar Cursor. " ). llamamos a getLong () y getString () a ir a traer datos de las columnas de interés. title = cursor. 1.text). así que si usted lo necesita. " ).// void showEvents(Cursor cursor) { Stuff them all into a big string builder = new StringBuilder( .moveToNext( ) le lleva al primer registro.

Afortunadamente. R. necesitamos hacer la clase de Eventos extender a ListActivity en lugar de eso De Actividad: Download Eventsv2/src/org/example/events/Events. en página 178.app. usted debería ver algo así como Figura 9. sin embargo. el método showEvents (): Download Eventsv2/src/org/example/events/Events. modificaremos lo El ejemplo de Eventos para utilizar a un ListView que está obligado con el resultado de una base de datos Query.title. }.java import android.layout. // ..id.SimpleCursorAdapter.2.. usted no puede hacer eso. el Androide provee una mejor forma: Datos Obligatorio. } . Qué pasaría si hubiera miles o millones de Eventos adentro ¿La lista? El programa sería muy lento y podría quedarse sin memoria intentando construir una cuerda para sujetarlos a todos ellos.widget. R. setListAdapter(adapter). FROM. necesitamos cambiar cómo son los Eventos exhibidos en los Eventos.4 Datos El atar datos le deja asociar su modelo (los datos) para su vista con simplemente algunas líneas de código. Atadura de 9. public class Events extends ListActivity { // . private static int[] TO = { R. cursor. Para demostrar datos teniendo fuerza obligatoria. TO).GARCIA JIM Una vez todas las filas han sido procesadas. ¡Las felicitaciones en su primera base de datos del Androide programan! Hay mucho campo para la mejora. private void showEvents(Cursor cursor) { // Set up data binding SimpleCursorAdapter adapter = new SimpleCursorAdapter(this.xml del layout y cosas la cuerda grande en eso (línea 15)... } Después... Primero.rowid.java import android. R. vamos a visitar al TextView de / main.id. Qué ocurre si usted quisiera dejar a lo ¿El usuario selecciona un acontecimiento y hace algo con él? Si todo está dentro uno Cuerda.id. Si usted maneja el ejemplo ahora.time. // .item.ListActivity.

Lo la primera línea crea a un SimpleCursorAdapter para el Cursor.4. asociando la vista con su fuente de datos. primero usamos un adaptador en el programa de muestra Translate (vea a Translate. El constructor para SimpleCursorAdapter toma cinco parámetros: "El context: : Una referencia para la Actividad actual "El layout : Un recurso que define los puntos de vista para un solo artículo de la lista "El cursor : Los datos colocan cursor "Dfrom La lista de nombres de la columna donde los datos es venir de "P to : La lista de puntos de vista donde los datos es ir a El layout para un artículo de la lista está definido en/item.GARCIA JIM Note que este código es muy más pequeño que antes (dos líneas vs.xml del layout. utilizamos a un SimpleCursorAdapter porque la fuente de datos es un Cursor objeto que vino de un Query de la base de datos. El adaptador actúa como uno El mediador. y el segundo el verso le dice al ListActivity que use el nuevo adaptador. Note las definiciones para el fila Idaho. Si usted recuerda. En ese ejemplo. Usando Web Repara.setAdapters () en la Sección 7. diez). el tiempo. Para este. y los puntos de vista del título que se estableció referencias para en el conjunto imponente the TO array Download Eventsv2/res/layout/item.android.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.xml <?xml version="1.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:padding="10sp" > <TextView android:id="@+id/rowid" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/rowidcolon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=": " android:layout_toRightOf="@id/rowid" /> <TextView android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/rowidcolon" /> <TextView android:id="@+id/timecolon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=": " . utilizamos a un ArrayAdapter porque los datos la fuente fue un personal del jurado definido en XML. adelante Página 143).

El tiempo. el androide:la vista de id /lista será exhibido. Sumé uno poco relleno y formateando para hacerles lucir bien. De otra manera. Todo lo que estamos haciendo está poniendo el Idaho. Aquí está la nueva versión: Download Eventsv2/res/layout/main. Esto se ve más complicado que eso.GARCIA JIM android:layout_toRightOf="@id/time" /> <TextView android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" android:textStyle="italic" android:layout_toRightOf="@id/timecolon" /> </RelativeLayout>. Así que si no hay artículos.android. el Androide busca dos especial Los ides en el archivo del layout.Note built-in ids for 'list' and 'empty' --> <ListView android:id="@android:id/list" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@android:id/empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/empty" /> </LinearLayout> Porque la actividad extiende a ListActivity. en lugar de una pantalla en blanco que el usuario verá lo ¡Mensaje " Ninguno de los Eventos! Aquí están los recursos de la cuerda que necesitamos: . Finalmente. necesitamos cambiar el layout por la actividad misma en layout Main.xml.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas. Si la lista tiene artículos en ella.xml <?xml version="1.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-. el androide:el id la vista/hueca será exhibido. y el título en una línea con dos puntos en medio de los campos.

GARCIA JIM Download Eventsv2/res/values/strings. idea de aproximadamente cómo podría realzar usted esta aplicación ahora que usted tiene una lista real con la que jugar. . usted podría abrir a un espectador de detalle.xml <?xml version="1. cuando el usuario hace una selección un Eventos. vea Figura 9. podría enviar por correo el Eventos para técnico Soporte.0" encoding="utf-8"?> <resources> <string name="app_name">Events</string> <string name="empty">No events!</string> </resources> Para el resultado final. o quizá borre el Eventos seleccionado y todo el que está debajo de él de la base de datos. necesitaremos utilizar a un Android ContentProvider. Hay todavía un problema pequeño con este ejemplo. adelante lo en la otra página. Ninguna otra aplicación ¡Le pueden añadir las cosas a la base de datos de acontecimientos o incluso mirada en ellas! Para Eso. Por ejemplo.3.3: Esta versión utiliza a un ListActivity y datos teniendo fuerza obligatoria. Figura 9. Como un ejercicio para el lector.

"path es un directorio virtual dentro del proveedor que identifica lo la clase de ser datos pidió. adelante mandan a llamar 38). omita esto y el arrastramiento La cuchillada. éstos serán URIs vigentes: content://org. La caja fuerte y Secure. Cuando esa información es pedida. Los programas del androide pueden comunicarse entre sí en dos formas: "Inter-Process Communication (IPC): Un proceso declara uno arbitrario La API usando el Lenguaje de Definición de la Interface del Androide (AIDL) y la interfaz del IBinder. Esto es lo la técnica que vamos a destinar para los Eventos la muestra. nos dejó convertir el ejemplo de Eventos para utilizar uno. Cualquier trozo de información administrado por un ContentProvider es tratado a través de un URI que se parece a esto: Content://authority/path/id Dónde: "content:// es el prefijo requerido estándar. son llamados por Androide a través de una API fija para poner en duda o modifica el contenido de cualquier modo que vean ataque. Para nuestro proveedor de Eventos. "id es la llave primaria de un registro específico siendo pedido.events/events/3 -.all events .events/events -.example. incluyendo lo Siguiente content://browser content://contacts content://media content://settings Demostrar utilizar a un ContentProvider. Esto avanzó la técnica sirve para llamadas de procedimiento remoto para un background Service thread "ContentProvider : Los procesos se registran ellos mismos para el sistema tan los proveedores de ciertas clases de datos. Para pida todos los registros de un tipo particular. El androide viene con varios proveedores ya construido adentro.GARCIA JIM 9. Acostumbrando su completamente capacitado el nombre del paquete se recomienda prevenir colisiones de nombre. "authority es el nombre del proveedor. Los parámetros son colocados sin ningún daño y eficazmente entre los procesos cuando la API es llamada.example.5 Utilizando A Un ContentProvider En el modelo de medidas de seguridad del Androide (vea la discusión arriba de en la Sección 2. los archivos escritos por una aplicación no pueden ser lea de o escrito para por alguna otra aplicación. Cada programa tiene su Posea identificación de usuario Linux y guía de datos (/datos/packagename) y el suyo protegió espacio de memoria.5.single event with _id=3 content://org.

put(TITLE. Android!" ).. // . // You would do something similar for delete and update.java: Download Eventsv3/src/org/example/events/Constants.java import static org.parse("content://" + AUTHORITY + "/" + TABLE_NAME).events. Aquí está la nueva versión: Download Eventsv3/src/org/example/events/Events.net.Constants. y podemos eliminar referencias para EventData. Cursor cursor = getEvents(). } No necesitamos el intento/finalmente bloque.java import android. Los archivos del layout (main. public static final Uri CONTENT_URI = Uri. values. string). así lo el siguiente paso es hacer algunos cambios menores para la clase de Eventos Cambiando el Programa Principal El método principal de programa (el Events..currentTimeMillis()). public static final String AUTHORITY = "org.events" .GARCIA JIM Primero necesitamos añadirle unas dos constantes más a Constants. getContentResolver(). ContentValues values = new ContentValues().xml) no necesitan variarse.main). setContentView(R. values.example.insert(CONTENT_URI.example. showEvents(cursor).put(TIME.layout. private void addEvent(String string) { // Insert a new record into the Events data source.java @Override public void onCreate(Bundle savedInstanceState) { super.CONTENT_URI.onCreate ()) en verdad consigue un poco más simple porque no hay base de datos objeto al que seguirle la pista: Download Eventsv3/src/org/example/events/Events.onCreate(savedInstanceState).Uri. addEvent("Hello. } .xml e item. values). Sumando Una Fila Adding a Row Dos líneas cambian en addEvent (). System.

example.insert (). desacopló los Acontecimientos el cliente del proveedor de datos de Acontecimientos. la lista de columnas en la que estamos interesados.content. pero ahora nosotros tenga que implementar una nueva pieza que no tuvimos antes.Constants. The Activity will handle closing // and re-querying the cursor when needed. y androide:las autoridades es string usada en el content URI.ContentProvider.Constants. null.events.events. FROM. el primer paso al hacer a uno es sumar eso para su archivo AndroidManifest.events. ORDER_BY).6 Implementando A Un ContentProvider Un ContentProvider es un objeto de alto nivel como una Actividad que necesita serlo declarado para el sistema.CONTENT_URI.GARCIA JIM La llamada para getWritableDatabase () se va. import android.content. null. usamos un content URI. Eliminando todas las cartas de recomendación para la base de datos. tienen.TABLE_NAME. Aquí está el contorno básico: Download Eventsv3/src/org/example/events/EventsProvider.example. import android. import static org. El cliente es más simplista.xml delante de la > etiqueta de <activity> (como un niño de < la aplicación > ): Download Eventsv3/AndroidManifest. return managedQuery(CONTENT_URI.example. import static org. que debemos extender Contenido Proveedor.Cursor.AUTHORITY. y la llamada para insertOrThrow () es reemplazado por getContentResolver () . } Aquí usamos el método Activity.events.BaseColumns.example. 9.database. . y la orden que deberían sea ordenado adentro. import android.UriMatcher.content.Constants. Manejando Una Query El método getEvents () es también simplificado al utilizar a un ContentProvider: Download Eventsv3/src/org/example/events/Events.xml <provider android:name="EventsProvider" android:authorities="org.ContentValues.ContentUris. import android.provider. import android. import static android. import static org.example. pasándole el contenido URI.java private Cursor getEvents() { // Perform a managed query. Después creamos la clase EventsProvider.content.events" /> Androide:el nombre es el nombre de clase. Entonces.managedQuery ().java package org._ID. En lugar de una agarradera de la base de datos.

TextUtils.example en lugar de org. pero el segundo tipo hace.text.android. En interés de espacio. Todos los tres las versiones del ejemplo de Acontecimientos pueden encontrarse en el archivo originario del .event" .item/vnd.4 EventsProvider maneja dos tipos de datos: "EVENTS (MIME type CONTENT_TYPE): Un directorio o una lista de acontecimientos "EVENTS_ID (MIME type CONTENT_ITEM_TYPE): Un solo acontecimiento En términos del URI. Por dentro..example. private static final int EVENTS_ID = 2. private EventsData events. } Por convención usamos vnd. La versión final de la apariencia de muestra Events exactamente como lo previo la versión en el exterior (vea Figura 9.. // .example. usted ahora tiene el armazón para un acontecimiento tienda que puede ser usado por otras aplicaciones en el sistema.cursor. import android. la diferencia es que el primer tipo no especifica Un Idaho. import android.SQLiteDatabase. /** The MIME type of a directory of events */ private static final String CONTENT_TYPE = "vnd.example en the MIME type.dir/vnd. incluso los unos escritos por otro Desarrolladores.zip de código. no estoy sirviendo para demostrar el resto de la clase aquí. . Y nosotros reutilice la clase EventsData de más temprano en el capítulo para ingeniarse lo la real base de datos dentro del proveedor.cursor.net. Sin embargo. public class EventsProvider extends ContentProvider { private static final int EVENTS = 1. Usamos la clase UriMatcher de Androide para analizar gramaticalmente al URI y decirnos cuál el cliente especificado.3.event" . pero usted puede hacer un download de completamente todo del sitio Web del libro. /** The MIME type of a single event */ private static final String CONTENT_ITEM_TYPE = "vnd. en página 185).android.database.GARCIA JIM import android. private UriMatcher uriMatcher.sqlite.Uri.

El SimpleCursorAdapter introdujo en este capítulo puede estar hecho a la medida muestre más de lo que sólo avise por escrito.. Por ejemplo. . aprendimos a almacenar datos en una base de datos de lenguaje normalizado de consulta del Androide. usted necesitará enterarse de más las declaraciones y las expresiones que los que cubrimos aquí.6 Y ahora por algo completamente diferente . especialmente si usted no hace Sepa lenguaje normalizado de consulta.7 Avances Rápidos En este capítulo. Busque a ViewBinder en la documentación SimpleCursorAdapter para más information. Un libro Como Guía del Bolsillo de lenguaje normalizado de consulta Gen06 por Jonathan Gennick o El Definitive Guíe a SQLite Owe06 por Mike Owens sería una inversión productiva. pero tenga presente que la sintaxis de lenguaje normalizado de consulta y las funciones varían ligeramente de base de datos para base de datos. Si usted quiere hacer más con lenguaje normalizado de consulta.GARCIA JIM 9. usted podría ostentar evaluar estrellas o los sparklines u otros puntos de vista basados en datos en el Cursor.5 que Esta biblioteca es más grande que SQLite y los usos una licencia diferente (lGNU Public License) pero es gratis y puede ser más fácil para usted para acostumbrar.. el siguiente capítulo cubrirá Los gráficos del 3D con OpenGL. Otra opción para el almacenamiento de datos en Androide es db4o.

pero rutinariamente lo miramos en dos dimensiones. 10. en la siguiente página. y viaja a su ojo así es que usted puede percibir Eso. o realismo que no es posible en 2D. usted puede ver una cantidad limitada exterior del mundo.1. interactividad. ¿Qué ve usted? La luz del sol rebota contra objetos afuera. el 3D las imágenes son aplanadas fuera.GARCIA JIM Capítulo 10 Los gráficos del 3D en OpenGL Los gráficos de dos dimensiones son geniales para la mayoría de programas. Si usted saca una línea de su ojo a las cuatro esquinas de la ventana y más allá. la escena de afuera es proyectada encima de la ventana (o viewport). Para las razones de función. Basado en qué tan cercano su ojo es para la ventana y qué tan grande la ventana Es. Por estas veces. Éste es llamado el tronco de vista (latín para uno " el pedazo quebrado feriado "). Pruebe este experimento simple: cubra un ojo y mire por la ventana. atraviesa la ventana. Cuando usted ve televisión o mira una foto en un libro.1 Gráficos Comprensivos del 3D El mundo es tridimensional. . En este capítulo. se vería lo mismo hasta que usted se movió. el Androide provee uno tridimensional la biblioteca de gráficos basó en el estándar DE EINSTENIO OpenGL. Esto es llamado su campo de vista. pero a veces usted necesita un nivel adicional de profundidad. Si alguien reemplazara su ventana con una alta calidad La foto. usted metería la pirámide en Figura 10. el tronco está usualmente rodeado por ahí acérquese y el recorte lejano cepilla también. exploraremos conceptos del 3D y acumularemos un programa de muestra que acostumbra OpenGL. Usted puede ver todo adentro el tronco pero nada fuera de eso. o proyectadas. En los términos de gráficos. encima de una superficie del 2D (el panel de audiencia de TV o la página del libro).

pero casi no fue. y Sony. Su Destino salvajemente popular y sus juegos de Temblor casi los fabricantes del hardware sin ayuda de nadie forzados a mantenerse sus Los controladores de dispositivo OpenGL modernos en la PC. John Carmack. La misma biblioteca .2 Este estándar fue creado por el Khronos Group. OpenGL implementa conceptos familiares tan como viewports y alumbrado e intentos para esconder la mayor parte del estrato del hardware del desarrollador. rehusó para acceder. A causa de la posición dominante de mercado de Corporación Microsoft y significativo Las inversiones de investigación y desarrollo. Sin embargo. Linux de hoy. Su trabajo es conducir al usuario con engaño a pensar que es una ventana en otro el mundo simplemente adelante el otro lado del vaso. AMD. su pantalla de la computadora actúa como el viewport. 10. Porque fue diseñado para estaciones de trabajo. y los usuarios móviles del dispositivo pueden agradecer a Juan e id El software para ayudar a mantener el estándar OpenGL pertinente. Samsung. cofundador de Software de id. La x del sistema operativo del impermeable. Entonces. Provee uno unificado interactúe para que programadores se aprovechen de hardware de cualquier Fabricante. Nokia. el Androide implementa un subconjunto de OpenGL llamado Gracias. Nvidia. la Corporación Microsoft le introdujo a un competidor llamado Direct3D. John Carmack OpenGL ha resultado muy exitoso. En su corazón. En 1995.1: Mirando una escena tridimensional En gráficos de computadora del 3D. La biblioteca de gráficos OpenGL ¿ es la API que usted usa para lograr eso ?. OpenGL es demasiado grande para equipar en un dispositivo móvil.GARCIA JIM Figura 10. OpenGL para Sistemas Incrustado (EL EINSTENIO OpenGL) .2 Introducing OpenGL OpenGL1 fue desarrollado por Silicon Graphics en 1992. un consorcio de la industria de compañías algo semejante Como Intel. Uno. por algún rato pareció que Direct3D iba a la absorción como una industria de facto estándar para jugar.

Sin embargo. pueden lisiar una cierta cantidad de su caramelo del ojo para recibir mejor función. Java para contener su actividad principal.opengl.3 el Androide implementa este estándar como de cerca como posible.2. . Edite Esto. import android. Download OpenGL/src/org/example/opengl/OpenGL. Java el atar lenguajes estaba definido por una Java La petición de especificación (JSR) 239. view = new GLView(this). De ese modo. public class OpenGL extends Activity { GLView view.GARCIA JIM (con diferencias menores) está ahora disponible en plataformas móviles principales Incluyendo a Androide. Todas las funciones del 3D serán emuladas en software. @Override public void onCreate(Bundle savedInstanceState) { super. import android. pero será mucho más lentamente que un dispositivo acelerado en hardware.os.java package org.Activity. si el usuario está corriendo su programa en un dispositivo más lento. 10.example. excepto este suministro de tiempo lo siguiente los parámetros en el Nuevo Androide Proyectan ventana de diálogo: Project name: OpenGL Build Target: Android 1. el OpenGL programando la interfaz todavía estará allí. Esto creará OpenGL.3 Fortaleciendo A Un OpenGL Program Empiece por crear un proyecto de "hola" nuevo ".Bundle.opengl Create Activity: OpenGL Joe Asks. . Es una buena idea proveer las opciones para que usuarios se vayan ciertos los detalles y los efectos especiales que demora en dibujar pero no es absolutamente necesario para el programa.6 Application name: OpenGL Package name: org. en página 20. como se muestra después. del Androide" así como en la Sección 1. así es que usted puede referirse a una colección variada de libros y una colección variada de documentación En JSR 239 y EINSTENIO OpenGL para una descripción llena de todo su las clases y los métodos. setContentView(view). Cada lenguaje tiene sus ataduras de lenguaje para EINSTENIO OpenGL.onCreate(savedInstanceState). Por esta razón. e iPhone. Su programa todavía correrá. .example. y Java no es excepción. Symbian. Ahora echémosle un vistazo cómo crear un programa simple OpenGL adentro Androide. Creating Su Primer Programa. y lo cambia para referirse a una vista aduanera denominada GLView. Algún Androide que corre dispositivos inferiores no puede en verdad tenga hardware del 3D.app. ¿Tendrá Cada Teléfono 3D? Sí y no.

Context. } @Override protected void onResume() { super.GLSurfaceView.onPause(). setRenderer(renderer). } } El GLSurfaceView es una nueva clase introducida en Androide 1.java package org.content. GLView(Context context) { super(context). Ahora definamos nuestra clase aduanera de vista: Download OpenGL/src/org/example/opengl/GLView. class GLView extends GLSurfaceView { private final GLRenderer renderer.GARCIA JIM } @Override protected void onPause() { super.opengl.onPause().xml) . No necesitaremos el rayout resource (res/layout/main. así es que usted puede borrar Eso.onResume(). OpenGL es un poco diferente.4 Dando la Escena Como vimos en la Sección 4.2. import android.example. en página 80. Provee la goma para conectar OpenGL ES para el sistema de Vista y el ciclo biológico de Actividad. view. // Uncomment this to turn on error-checking and logging //setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS). En el siguiente seccione.opengl. llenaremos la pantalla de un color entero. En ES OpenGL en Androide. renderer = new GLRenderer(context). el Androide La biblioteca del 2D llama al método onDraw () de su vista cada vez que necesita para redibuje una sección de la pantalla. Definamos eso ora . Dibujando a la Junta Directiva. } } Pasamos sobre la disposición del onPause () y métodos onResume () así es que pueden llamar por teléfono lo los métodos del mismo nombre en la vista.5 que en gran medida simplifica utilizar a OpenGL en Androide.onResume(). Se requiere cuidado de escoger el formato apropiado de pixel del amortiguador del marco y eso maneja una separata entregando hilo para permitir animación muy fácil. import android. 10. el dibujo es distanciado fuera en una interpretación la clase que es responsable de inicializar y extraer la pantalla entera. Todo GLView necesita para haga es extiende GLSurfaceView y defina un dador para la vista. view.

import javax.util. Comencemos con el método onSurfaceCreated ().opengl.GARCIA JIM Aquí está el contorno para la clase del GLRenderer: Download OpenGL/src/org/example/opengl/GLRenderer.glDisable(GL10. 4 gl.Context.egl.glEnableClientState(GL10. int width.Log.GL_VERTEX_ARRAY)..java Line 1 public 2 // void onSurfaceCreated(GL10 gl. que tiene tres métodos. } } El GLRenderer implementa la interfaz del GLSurfaceView.context = context.khronos. EGLConfig config) { // . 5 gl.GLU.GL_DITHER). private final Context context.microedition.example.opengles..GL10.opengl. class GLRenderer implements GLSurfaceView.glDepthFunc(GL10.GLSurfaceView. que es llamado cuando el OpenGL Surface (la clase de como una Lona en 2D regular) es creado o recreado: Download OpenGL/src/org/example/opengl/GLRenderer.khronos. } public void onSurfaceChanged(GL10 gl.Renderer. } public void onDrawFrame(GL10 gl) { // .microedition.. import android.. } public void onSurfaceCreated(GL10 gl. GLRenderer(Context context) { this. EGLConfig config) { Set up any OpenGL options we need 3 gl.java package org.GL_DEPTH_TEST)..opengl. import android.GL_LEQUAL). import android.glEnable(GL10. import android. import javax. . int height) { // .content. 6 7 // 8 // 9} Optional: disable dither to boost performance gl..Renderer { private static final String TAG = "GLRenderer" .EGLConfig.

GL_MULTISAMPLE Realice multitomar muestras para el antisubmuestreo y otro Efectos. Después complementemos el método onSurfaceChanged ().GL_PROJECTION). GL_TEXTURE_2D El uso las texturas para dibujar alisa. int width.glViewport(0.1. GL_LIGHTi Incluya número leve al entender unos 's del objeto la claridad y el color. 1. 8} Aquí configuramos nuestro tronco de vista y establecemos algunas opciones OpenGL.GARCIA JIM En línea 3. height). . 45. 5 gl. OpenGL tiene docenas de las opciones que pueden ser permitidas o deshabilitadas con glEnable () y glDisable ().java Line 1 public 2 // void onSurfaceChanged(GL10 gl.gluPerspective(gl. establecemos un par de opciones OpenGL. 100f). width. GL_POINT_SMOOTH El antialiased levadizo señala. Nota la llamada para la función del ayudante GLU. Lo último dos las discusiones son la distancia del ojo para el recorte cercano y lejano Aviones (vea Figura 10. 4 gl.glLoadIdentity(). Repare en que todo lo que usted permite tiene algunos lo cuestan en la función. GL_LINE_SMOOTH Dibuje líneas del antialiased (las líneas sin jaggies). Este método es llamado una vez después de que la Superficie sea creada y no obstante cada vez que el tamaño de lo Cambios superficiales: Download OpenGL/src/org/example/opengl/GLRenderer. ratio. GL_CULL_FACE Ignore polígonos basados en su serpenteo (en sentido de las manecillas del reloj o en sentido contrario a las manecillas del reloj) en coordenadas de la ventana. y actualice la profundidad Amortiguador. GL_LIGHTING Encienda alumbrado y los cálculos materiales. 6 float ratio = (float) width / height. La mayor parte de comúnmente usados incluyen lo siguiente: La Descripción de Opción GL_BLEND Mezcle los valores entrantes de color con los valores ya en el amortiguador de color.glMatrixMode(GL10. GL_DEPTH_TEST Haga comparaciones de profundidad. 3 gl. 7 GLU. gluPerspective () en línea 7. int height) { Define the view frustum 0. Los pixeles más lejos que esos ya dibujado será ignorado. en página 192). Esto es una forma barata para eliminar atrás afronta. Todas las opciones son poco apropiadas por defecto excepto GL_DITHER and GL_MULTISAMPLE.0f.

java public void onDrawFrame(GL10 gl) { // Clear the screen to black gl.glMatrixMode(GL10. // Other drawing commands go here.glTranslatef(0.0f). 0.glClear(GL10. Download OpenGL/src/org/example/opengl/GLRenderer.GARCIA JIM Figura 10. // Position model so we can see it gl.glLoadIdentity().GL_COLOR_BUFFER_BIT | GL10..2: Esa fue bastante problema para conseguir una pantalla negra. } . -3.. Es hora de dibujar algo. gl.GL_MODELVIEW). El método onDrawFrame () es enumerado y en el hilo de interpretación creado por la clase del GLSurfaceView.GL_DEPTH_BUFFER_BIT). gl.

-half. -half. half.int vertices[] = { 20 // FRONT . -half.IntBuffer.mVertexBuffer = vbb. half.ByteOrder.khronos. usted lo hará típicamente créelos usar una herramienta gráfica del diseño e impórtelos en su programa. half.example.-half.// Buffers to be passed to gl*Pointer() functions must be direct. half. android. .// float) must have their byte order set to native order 45 ByteBuffer vbb = ByteBuffer.-half. half. -half.opengles. -half. 5 import java. Si usted está pensando que es tonto dibujar la misma pantalla negra encima y otra vez en un lazo. Sigamos adelante y dibujemos algo un poco más interesándole. half. -half. half.import javax. .nio. . -half.int one = 65536.nio.BitmapFactory. . -half. -half. 40 // .// TOP .// Buffers with multi-byte data types (e.// where the garbage collector cannot move them. -half. También colocamos la posición de puesta en marcha para el resto de las órdenes del dibujo cuál será completado en la siguiente sección.5 Construyendo Un Modelo A merced de la complejidad de los objetos usted quiere dibujar.ByteBuffer. half.opengl. -half.GLUtils.-half. . GLCube { final IntBuffer mVertexBuffer.GL10.. Pero primero nosotros necesite definir exactamente lo que estamos dibujando (el modelo).-half. -half. usted consigue Figura 10. . -half. .2.public GLCube() { . .half.import android. half. -half.microedition. half. int. half.java Line 1 package org. 10 import .graphics. they must be placed on the native heap .// .import . -half. -half. half. half. así es que sólo sopórteme por ahora.-half.import java. .// LEFT . sólo definiremos uno el modelo simple en código secreto: un cubo Download OpenGL/src/org/example/opengl/GLCube. half. Siempre acuérdese de exonerar ambos. half.asIntBuffer(). -half.vbb. . -half.g. half.length * 4). short. . i.// RIGHT 30 half. -half.Bitmap. -half. .int half = one / 2. half. -half.half. Si usted maneja el programa ahora. 10. 15 private . 35 // BOTTOM . -half.// BACK .. half.class android. half. .-half.nativeOrder()). Para los propósitos de este ejemplo. . half.Context. . 25 half.import java. half.GARCIA JIM Para empezar.nio. Aclaramos ambos el color y los amortiguadores de profundidad. half. . . . half. Esto hará más sentir más tarde cuándo hablamos de animación.import android. half. -half. half.order(ByteOrder. half. half. -half. o a usted le comprarán algunos resultados muy extraños de la información de profundidad para lo previo Marco. la razón está de su parte. half. -half. . half. -half.graphics. en la página precedente.e.-half.opengl. -half. }.allocateDirect(vertices. . . half. half. -half. half. -half.content. colocamos la pantalla a negro.

gl. 1. -1). 4).glNormal3f(-1.glDrawArrays(GL10. 12. Cada cara de un cubo es un cuadrado.glDrawArrays(GL10. 4. 1). 0.GL_TRIANGLE_STRIP. -} -} . En un programa real. 0). . ..glColor4f(1.glNormal3f(0. 0).GL_TRIANGLE_STRIP.gl.gl. 4).GL_TRIANGLE_STRIP.gl. 1. .3.glNormal3f(0. 0). 20. Es una forma rápida para ponga una buena cantidad de geometría fuera de para el hardware de gráficos apresurada. 70 gl. y entonces después de tan cada subsiguiente el punto define un triángulo con los puntos dos previos.gl. 55 gl. . 0.gl. 0).gl.public . 4).mVertexBuffer. porque el número de más pocos de OpenGL le llama Haga. respectivamente. mVertexBuffer). -1.draw(gl). . 4). es más excitante que negro. 1). void draw(GL10 gl) { GL10.GL_TRIANGLE_STRIP. Los vertices forman en orden en línea 19 definen las esquinas del cubo en fixedpoint modele coordenadas (vea lo "Fixed vs. public void onDrawFrame(GL10 gl) { // .gl. 65 gl. y z).glDrawArrays(GL10. 1. En el método levadizo (línea 52).glColor4f(1. ..gl.gl. .java private final GLCube cube = new GLCube(). 1). Repare en que cada punto tiene tres coordenadas (la x. usamos el amortiguador del vértice creado en lo el constructor y carreras diferentes seis levadizas de triángulos (para los seis lados del cubo).put(vertices). y. 1). 8.GL_FIXED. // Draw the model cube.glNormal3f(0. usted verá la imagen excitante en Figura 10. 1. 4). Floating Point" el recuadro complementario). Ahora usemos nuestra nueva clase en GLRenderer: Download OpenGL/src/org/example/opengl/GLRenderer.GL_TRIANGLE_STRIP.gl. lo más rápido de lo que su programa irá.glVertexPointer(3. 60 .glNormal3f(0.glNormal3f(1.gl. La x y y las hachas señalan el derecho y arriba. 0.gl. 16. . En este modo.mVertexBuffer. 0. Bien.glDrawArrays(GL10. . 1.glDrawArrays(GL10. Acostumbramos un OpenGL común extrayendo modo llamadas triangle strips . . 4).GL_TRIANGLE_STRIP.position(0). que consiste en dos triángulos.glColor4f(1. . 50 } . 0. y el eje de la z señala fuera de la pantalla hacia el punto del ojo. 1. especificamos dos puntos de partida.glDrawArrays(GL10. adelante lo en la otra página. usted querría combinar las llamadas en uno o dos tiras. . } Ahora si usted maneja el programa. 0. 1.GARCIA JIM .

focos delanteros. Todas las bibliotecas de gráficos del 3D soportan tres tipos de alumbrado: "Ambient: Un resplandor general al que la luz contribuye lo entero Escena. o la lava encendida se empoza. Estos valores ahonde en una ecuación alumbrante que determina el color y claridad de cada pixel en la pantalla. Hay dos partes para iluminar una luz y algo para dele brillo adelante. "Specular: Brillante luz. La mayor parte de la luz contribuyó a su voluntad de la escena típicamente venga de diseminar fuentes.6 Luces. Figura 10. usualmente de fuentes puntuales claras.GARCIA JIM 10.. . esto le da rayos del cabello (los destellos de luz) que sume realismo. Comencemos con la luz. antorchas. OpenGL le deja definir hasta ocho puntos de luz en su escena. como usted podría poner de uno fluorescente Panel. Combinado con materiales brillantes. "Diffuse: El alumbrado direccional suave.3: Dibujando un cubo no sombreado Un solo punto de luz puede contribuir todo lo que el tres escribe de luz. . incluso para objetos afrontando fuera de la luz. Es importante para tenga un poco de luz ambiente así es que usted pueda escoger detalles incluso adentro lo Sombras. En la vida real usted tiene puntos de luz como el sol.. la Cámara Fotográfica.

Es un blanco la luz omnidireccional que tiene un componente difuso brillante y uno oscuro ambiente componente. lightDiffuse. GL10. difuso. lightPos. gl. float lightDiffuse[] = new float[] { 1. 0). 1 }. GL10. sume este código en onSurfaceCreated ( ) para definir cómo reacciona el material con el tres mecanografía de luz: Ambiente. 1.glLightfv(GL10. 1. 0). o el escrito. 0.GL_LIGHT0.GL_AMBIENT.glLightfv(GL10. Después.glLightfv(GL10. 1. lightAmbient. Figura 10. La luz refleja diferentemente fuera de materiales diferentes. 1. float[] lightPos = new float[] { 1. 1 }.4: Iluminando la escena En nuestro código definimos un punto de luz en posición (1.GARCIA JIM El alumbrado está definido en el método GLRenderer. GL10.GL_POSITION. 1. 0).GL_DIFFUSE. gl. gl.GL_LIGHT0.glEnable(GL10.GL_LIGHT0.GL_LIGHTING).2f. no estamos usando alumbrado del specular. 1). 0.glEnable(GL10.onSurfaceCreated (): Download OpenGL/src/org/example/opengl/GLRenderer.2f. y specular: . gl. En este ejemplo. 1 }.java // Define the lighting float lightAmbient[] = new float[] { 0. el plástico.GL_LIGHT0).2f. gl. Para simular esto en OpenGL. necesitamos contarle a OpenGL sobre los materiales de los que nuestro cubo está hecho. como metal.

glRotatef(elapsed * (30f / 1000f).startTime.4.5. gl. gl. gl.glMaterialfv(GL10. 1 }. El resultado será un alisado agradable. numFrames = 0. 0. GL10. Eso es bastante aburrido.. gl. 0).java private long startTime. } public void onDrawFrame(GL10 gl) { // . 1..GARCIA JIM Download OpenGL/src/org/example/opengl/GLRenderer. en la siguiente página). // Set rotation angle based on the time long elapsed = System. 1. GL10.. 1. ¡10. // Draw the model cube. así es que nos deja hacerle moverse. La esquina que se sobrepasa bien de el cubo está más cerca para la luz. 1.GL_FRONT_AND_BACK. necesitamos hacer uno la dos los cambios para nuestro onSurfaceCreated () y los métodos onDrawFrame () En GLRenderer.. . } Este código rota el cubo un tanto todo el tiempo a través del lazo principal.GL_DIFFUSE.. fpsStartTime = startTime. en la página precedente). startTime = System. public void onSurfaceCreated(GL10 gl.GL_AMBIENT.7 Ponen en Marcha! Hasta ahora el cubo recién ha estado sentándose allí a pie firme. 1 }. 0). Para hacer eso. matAmbient. 1.java // What is the cube made of? float matAmbient[] = new float[] { 1. float matDiffuse[] = new float[] { 1. 0. cada segundo que alterna 30 grados alrededor del eje de las abscisas y 15 los grados alrededor del eje vertical.currentTimeMillis(). EGLConfig config) { // . Download OpenGL/src/org/example/opengl/GLRenderer. private long fpsStartTime. como si fuera hecho apagado Escrito (vea Figura 10.draw(gl). 0). 1.GL_FRONT_AND_BACK. private long numFrames.glMaterialfv(GL10. así es que aparece más brillante.glRotatef(elapsed * (15f / 1000f). matDiffuse. 0). Específicamente.currentTimeMillis() . hilandería Cubo (vea Figura 10. El objeto parecerá tener un acabado desafilado.

¿Puede pensar usted una razón por la cual esa fue una idea mala? Desde que el Androide puede funcionar con una colección variada de dispositivos diferentes.5: Rotando el cubo La Animación Basada En Tiempos La primera versión de este ejemplo le siguió la pista a la rotación actual reflecte y simplemente incrementado a eso cada vez a través del lazo. Vinculando la cantidad de movimiento para cuánto el tiempo ha transcurrido. Usted reconoce uno ¿Laminada mesa? Una madera laminada es simplemente una foto de grano de madera eso es pegado en la superficie de un material menos caro como plástico o el pizarrón de la partícula. Figura 10. El hardware más rápido dibujará la animación más Suavemente.8 Aplicando Textura Aunque la escena esté comenzando a verse más interesante.GARCIA JIM 10. . usted puede lograr movimiento previsible en cualquier dispositivo. como el rough la superficie de una pared de ladrillos o la grava en un sendero. pero los objetos entrarán de un sitio a otro en la misma cantidad de tiempo. Si usted se moviera un objeto una cantidad fija cada marco. y en dispositivos rápidos que haría muévase demasiado rápido. usted no puede predecir cuánto tiempo llevará para dibujar un solo marco. entonces en dispositivos lentos el objeto se movería demasiado lentamente. Eso podrían tomar la mitad de segundo o 1/100th de un segundo. Los objetos de todos los días tienen texturas. nadie lo haría confúndalo por vida real.

Desafortunadamente. 0.order(ByteOrder.java gl. // RIGHT one. one. one. Context context.java private final IntBuffer mTextureBuffer. 0. // BOTTOM 0.loadTexture(gl. int resource) { Bitmap bmp = BitmapFactory. one.length * 4). mTextureBuffer = tbb. GL10. 0. R. one.GL_TEXTURE_2D). one. Figura 10. gl.glTexParameterx(GL10. // BACK one. el código para hacer esto es medianamente largo.GL_TEXTURE_2D.GL_TEXTURE_2D.java // Enable textures gl. GL10. // LEFT one. 0. one. one. gl. 0. 0.GARCIA JIM Vamos a hacerle lo mismo a nuestro cubo usando una foto. one. one.GL_TEXTURE_COORD_ARRAY). one.put(texCoords). 0. }. one. GL10.glEnableClientState(GL10. 0.recycle(). gl. 0.GL_TEXTURE_MIN_FILTER. 0.nativeOrder()). 0. one. mTextureBuffer. mTextureBuffer. 0).texImage2D(GL10.glTexParameterx(GL10. tbb. one.allocateDirect(texCoords. 0.getResources(). 0. 0. 0. 0. GL10. 0.position(0). one. // workaround bug 3623 gl.GL_TEXTURE_MAG_FILTER. 0. 0. } } Después necesitamos decir que OpenGL para usar la textura coordina.drawable. mTextureBuffer). one. // .glEnable(GL10.. Sume esto para el comienzo del draw( ) method: Download OpenGL/src/org/example/opengl/GLCube. Sume estas líneas hasta el final del método onSurfaceCreated (): Download OpenGL/src/org/example/opengl/GLRenderer.GL_TEXTURE_2D. bmp. . bmp.asIntBuffer(). 0. one. // TOP one. context. one..android). 0.GL_FIXED. } static void loadTexture(GL10 gl.6: Aplicando una textura Y finalmente necesitamos llamar al método loadTexture () en GLRenderer.glEnable(GL10. 0. one. resource). 0. ByteBuffer tbb = ByteBuffer.GL_LINEAR). No se preocupe si usted no hace comprenda todo ello de inmediato.glTexCoordPointer(2. GLUtils. one.decodeResource( context. // Load the cube's texture from a bitmap GLCube.GL_TEXTURE_2D).GL_LINEAR). public GLCube() { int texCoords[] = { // FRONT 0. Download OpenGL/src/org/example/opengl/GLCube. GL10. one. 0.

R. if (SEE_THRU) { gl.onSurfaceCreated (): Download OpenGL/src/org/example/opengl/GLRenderer. Usted puede ver nuestro progreso en lo que va de Figura 10. Para el resultado final.glBlendFunc(GL10. Sume esto para GLRenderer. También se vuelve contra un modo de mezcla que deja a la opacidad de objetos se base en su canal alfa.java boolean SEE_THRU = true. Note el número 128 no aparece en cualquier parte del código. así es que usted substituye uno más grande o más pequeño la imagen fácilmente.drawable. gl. en la página previa.android es un archivo PNG reducido a escala para 128 cuadrado de pixeles que copiado para res/drawable/android. } Esto desactiva profundidad experimentando.7.9 Peekaboo Solo por sport.6. Intente divirtiéndose con modos diferentes del preparado para recibir efectos estupendos.GL_ONE). porque queremos ver objetos obscurecidos tan sano como los unos del primer plano.GARCIA JIM Figura 10.glDisable(GL10. en la página precedente. // .glEnable(GL10. sede Figura 10.7: La versión final: un cubo transparente Aparezca Este código habilita texturas y la textura se coordina y entonces llama por teléfono nuestra el método loadTexture (). gl.png Usted lo puede encontrar en lo bajable desde disco codifique paquete que acompaña este libro.GL_SRC_ALPHA..GL_DEPTH_TEST). . hagamos el cubo a medias transparentes. 10. pasándole el contexto de Actividad y recurso Idaho así puede cargar la imagen de la textura.GL_BLEND). El efecto neto es que las caras de atrás del cubo aparecerán a través de las caras delanteras.. Se lo dejaré a usted implementar una opción para dar vuelta tan abierto y cerrado. GL10.

GARCIA JIM 10. Si este número desciende debajo de su tasa objeto. Eliminando las Pulgas de Un Programa con Mensajes del Leño.d(TAG. Una tasa alta del marco es desafiante. y es también la velocidad aprovechada adelante las plataformas populares de tablajería como Playstation de Sony y Playstation El objeto portátil (PSP).currentTimeMillis(). En particular. usted puede echar de ver que el emulador maneja bastante más lentamente que el dispositivo real. pero más jugadores serios han venido a esperar una tasa más alta Como 60FPS o más. uno ancho la variedad de información adicional está disponible si usted quiere aprender más. long fpsElapsed = System. Manténgase iterando hasta que usted alcanza su blanco. Porque el Androide usa la API estándar en la industria DE EINSTENIO OpenGL. incluyendo cualquier animación. Recomiendo que usted haga todo lo posible para alcance una tasa coherente de 60FPS. probar sumar este pedacito de código hasta el final del método onDrawFrame (): Download OpenGL/src/org/example/opengl/GLRenderer. porque en 60FPS que usted sólo tiene El 1/60th de un segundo (16. en ese entonces ajústese su el algoritmo y el intento otra vez. Log. adelante Página 67). eso es enteramente decisión de usted.10.currentTimeMillis() . La única manera a decir si usted está haciendo Su blanco DE PIES POR SEGUNDO debe medirlo.67 milisegundos) de en medio llama a onDrawFrame () para hacer todo lo que necesite hacerse. fpsStartTime = System. y cálculos de juego. Repare en que usted debería evite la tentación para exhibir esto en la pantalla encima de su otro los gráficos porque el acto de exhibirlo se quitará de encima el número. Los 1530FPS son a veces aceptables a informales Los jugadores.11 Avances Rápidos En este capítulo. } Cada cinco segundos exhibirá su número común DE PIES POR SEGUNDO para el Androide el leño del sistema (vea Sección 3.6 ¿Qué es el siguiente? Bien. así es que empuje marca algo gran! . 10. Usted tiene todo el le equipa con herramientas ¡Necesidad. usted aprendió a usar la biblioteca de gráficos 3D de Androide. Para hacer eso.fpsStartTime.0F) / fpsElapsed. Si usted prueba esto ahora. 5 Para otros gráficos que los consejos registran la salida que el desarrollador hablan en lo Haga búsquedas en la Internet usando Google Yo/Oh conference. y el tiempo que lleva en verdad extraer la escena para el marco actual. La lección aquí es eso para la comprobación de rendimiento usted no puede confiar en el emulador.java // Keep track of number of frames drawn numFrames++. En mis pruebas que vi acerca de los 12FPS en lo el emulador y más cerca para 60FPS en un teléfono real. La física. "Frames per second: " + fps + " (" + numFrames + " frames in " + fpsElapsed + " ms)" ). A el perfilador como traceview4 también puede venir bien. numFrames = 0. Esto es típicamente medido contando el número de pantallas o los números de marcos por segundo (LOS PIES POR SEGUNDO) eso es exhibido. if (fpsElapsed > 5 * 1000) { // every 5 seconds float fps = (numFrames * 1000.10 Midiendo Suavidad ¿Qué tan suave es el alisado? La suavidad de un juego u otro graphicsheavy el programa está definido por ahí con qué rapidez puede actualizar la vitrina. Las personas diferentes perciben diferentes las velocidades tan " alise. recomiendo al Javadoc para la especificación de API JSR 239. Eso concuerda con el máximo renueve tasa de dispositivos actuales del Androide.

hacerlo muy más lentamente que la normalidad. El Nivel de Lenguaje El androide soporta código compatible con Java Standard Edition 5 o más temprano. por mucho tiempo. flotan. usted debería requerirse una mirada cercana para ver qué cosas usted necesita " desaprenda. Compare esto al Google Web Toolkit (GWT). Un hilo es dedicado para la principal interfaz de usuario (si usted tiene uno). Que los recursos es realizada en software en lugar de hardware. los programas del Androide se escriben con el lenguaje de Java. Aunque el uso ocasional esté bien. no sólo un subconjunto. Utilizando al compilador estándar y Bytecodes. La máquina virtual Dalvik implementa la sincronización y palabra clave sincronizada . Cuerda. en general usted debería utilizar sólo a unos pocos. Sin embargo. Aunque el Androide soporte cualquier número de hilos. Objeto.1 El androide utiliza a un compilador estándar de Java compilar su código originario en bytecodes normales y entonces traducen esos bytecodes en Dalvik Instrucciones. el Androide El lenguaje y APIs En la mayoría de los casos. int. cortocircuito. El Multiposicionamiento y la Sincronización Los hilos múltiples cuentan con el respaldo de división del tiempo: dando cada hilo uno pocos milisegundos a correr y entonces realizando un cambio de contexto al que dejar otro hilo tiene una vuelta. Digo " para lo más sepárese " porque hay algunas diferencias. duplican. Si usted es ya diestro en desarrollo de Java en otras plataformas. y otro el hilo sirve para largas operaciones que corre como cálculos o la red Yo/O. y usan la Java 5 APIs de la biblioteca de la Edición del Estándar (EL SELENIO). Tipos Instrinsicos Todos los tipos intrínsecos Java incluyendo byte. Este apéndice resalta las diferencias entre la normal Java y lo que usted encontrará en Androide. El Subconjunto de Lenguaje del A. quemadura. Java 6 y 7 formatos de clase y características no son aún mantenido sino podría agregarse en ediciones futuras. Las operaciones simples en números reales podrían tome un milisegundo para completar.GARCIA JIM A del Apéndice Java vs. Por consiguiente. el lenguaje entero de Java es soportado. en hardware actual comúnmente encontrada en dispositivos móviles. y conjuntos imponentes son soportados. no lo haga el uso el flotador o al doble en código crítico en la función. que tiene Su Java para el traductor JavaScript. la coma flotante es emulada. usted no necesite tener el código originario para bibliotecas que usted quiere acostumbrar en sus aplicaciones.

util. use final explícito () o termine la relación () Métodos.net: Socket factories.concurrent): Listas. Sin embargo. También soporta el paquete del java. Consulte lo Java de Edición de 2 Plataformas de Estándar 5. En lugar de finalizadores. conjuntos imponentes.rowset): Más base de datos interactúa javax.dom (but not subpackages): Los nodos DOM y los elementos org. La razón es función simple: Reflexión es lento.xml. Úselos como usted lo haría en cualquier programa de Java para resguardar hilos múltiples de interferir con uno a otro.auth.sql (except javax.sax: La API simple para XML Note que si bien la base de datos regular de lenguaje normalizado de consulta de Java APIs (JDBC) es Incluido.management): El lenguaje y la excepción Soporte java. mapas.font: Algunas constantes para Unicode y los carácteres de imprenta java.lang (except java. y Object. Colecciones javax. URLs.net: Network I/O.security: Autorización.parsers: El análisis gramatical XML org.GARCIA JIM los métodos relacionados de la biblioteca como Object. cotejo java. El Subconjunto de la Biblioteca del Estándar El androide soporta un subconjunto relativamente tremendo de la Java Standard Edition 5.lang.util. . y los otros fueron omitidos porque mejoran APIs está disponible eso es específico para el Androide (como interfaces de usuario). sockets java.io: El archivo y la corriente I/O java.spi. and javax.text: Formateo. Utilice al android. Reflexión Aunque la plataforma del Androide soporte reflexión de Java. sets. Considere alternativas como preprocesadores y herramientas de fases de compilación En lugar de eso. Dándole Ocupación a SQL.auth. usted no los usa ganar acceso a las bases de datos locales del SQLite.security.concurrent para más sofisticados algoritmos.security. la precisión java.xml. el redondeo.crypto: Cifras.khronos: Los gráficos OpenGL (de Java Micro Edition) javax.microedition. El androide es al que se apuntó hacia hardware constreñido en recurso.notify ().sasl) javax.util (including java. Finalización La máquina virtual Dalvik soporta finalización del objeto durante colección de basura algo así como VMs normales de Java.beans: Algunas clases e interfaces para propiedad JavaBeans Cambia java.security (except javax. adelante Página 171).0 biblioteca. Object.0 el documentation1 de API para información en relación a la forma de usarlos: java. así es que es importante que usted suelta todos los recursos tan pronto como usted ya no los necesita. como un general la regla que usted no lo debería usar. la mayoría de expertos de Java no le aconsejan para confiar en finalizadores porque usted no puede predecir cuándo (o si) harán Corra. llaves públicas java.kerberos.sql: La base de datos interactúa java. Algunas cosas se quedaron apagadas porque simplemente no hicieron El sentido (como imprimir). llaves públicas javax.database APIs en lugar de eso (vea Capítulo 9. javax.awt.sql.w3c.notifyAll (). certificados.wait (). SSL javax.nio: El archivo y el canal I/O java. lenguaje natural.security.math: Grandes números. Mantenido Los siguientes paquetes estándar son soportados en Androide.

apache. normalmente parte de la Java de Edición de 2 Plataformas de Estándar.omg.http: HTTP authentication.applet java.security.security.management javax.spi javax. no cuenta con el respaldo de Androide: java. methods.json: JavaScript Object Notation org.rmi javax.* org.lang.sasl javax. el Android SDK viene con varias bibliotecas de terceros para su conveniencia: org.xml.sax: XML parsing org.* (subpackages) Las Bibliotecas de Terceros Además de las bibliotecas estándar listadas tiempo atrás.naming javax.management java.awt java.accessibility javax.ietf.xml (except javax.auth.xml. cookies.w3c.activity javax.security.print javax.dom.xmlpull.transaction javax. and protocol org.sound javax.* org.imageio javax.rmi javax.parsers) org.GARCIA JIM No Soportada Estos paquetes.auth.v1: XML parsing .kerberos javax.swing javax.

2.GARCIA JIM B del Apéndice Hello. Este apéndice le mostrará cómo. y Más. y usted pueden también. el Androide" la aplicación como nosotros hizo en la Sección 1. para abrir el Nuevo Proyecto Ventana de diálogo. deje ese campo espacio en blanco y apague la marca de verificación posteriormente para Crear Actividad..1.5 (la Magdalena Glaseada).widget En lugar de introducir un nombre para la Actividad.. horóscopos. eso debería verse algo así como Figure B. Los archivos no serán correctos para un proyecto del dispositivo así es que preparémoslos ora. El plug-in del Androide creará el proyecto y lo suplirá con algunos archivos predeterminados. B. adelante lo en la otra página. un controlador de música. y haga clic Después. y uno que sólo muestra una foto. Dispositivo Introducidos en Androide 1. El Acabado de Clic. Muchos desarrolladores han creado interesarle los dispositivos para exhibir el clima. Entonces seleccione Proyecto del > Androide del Androide. los dispositivos de la aplicación son aplicación de la miniatura los puntos de vista que pueden estar incrustados en la pantalla de la página principal del sitio Web. Seleccione > Proyecto del Archivo > New . en página 20. resumen de las noticias. Algunos dispositivos es provisto de Androide incluyendo un reloj analógico.1 Creando Su Primer Dispositivo Actualmente no hay mago especial del Eclipse para crear un Dispositivo del Androide así es que vamos a crear un "hola" regular ". Cuando usted está muy cansado.6 Application name: Widget Package name: org. y bien ajústele un poco.example. Entre la siguiente información: Project name: Widget Build Target: Android 1. . Creando Su Primer Programa.

GARCIA JIM B.1 de la Figura: El nuevo proyecto del dispositivo del Androide .

Aquí está la definición: <?xml version="1.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/widget_bg" > <TextView android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="@string/hello" android:gravity="center" android:textColor="@android:color/black" /> </LinearLayout> .GARCIA JIM ¡Llamando a Todos los Dispositivos! Nuestra primera parada es el archivo AndroidManifest.appwidget. y una referencia para su trazado de puesta en marcha.android.android.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.Widget" android:label="@string/widget_name" > <intent-filter> <action android:name= "android.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.com/apk/res/android" package="org.xml.widget" android:versionCode="1" android:versionName="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.action.android. Aquí está lo el archivo manifiesto revisado: Download Widget/AndroidManifest. El layout está definido adentro res/layout/main.appwidget.com/apk/res/android" android:minWidth="146dip" android:minHeight="72dip" android:updatePeriodMillis="60000" android:initialLayout="@layout/main" /> Esto especifica un tamaño mínimo para el dispositivo. este ejemplo sólo tendrá un dispositivo.0" > <application android:icon="@drawable/icon" android:label="@string/app_name" > <!-. cada cuánto debería ser Actualizado (más en tan posterior).xml. Mientras es técnicamente posible (y común) para poner dispositivos y actividades en la misma aplicación. No necesitamos una > etiqueta de < actividad pero nosotros necesitamos añadirle un < aparato receptor para definir el dispositivo.provider" android:resource="@xml/widget" /> </receiver> </application> <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4" /> </manifest> La etiqueta <meta-data>le dice al Androide que puede encontrar la definición del dispositivo adentro res/xml/widget.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.Broadcast Receiver that will process AppWidget updates --> <receiver android:name=".xml <?xml version="1.xml: Download Widget/res/layout/main.xml <?xml version="1.example.

Usted usa el Draw tool1 de 9 parches incluido con el SDK para crear uno. Extraible. adelante lo en la otra página. Nosotros incluso lo pudo haber omitido para conseguir un historial completamente transparente. El archivo resultante debe usar el .1. el Androide" el ejemplo excepto que esta versión especifica el texto negro centrado y una imagen de fondo. como un color entero o un bitmap (vea Sección 4.GARCIA JIM usted pudo haber echado de ver que este layout es casi así como el usado para el "hola. . Pero para este ejemplo quise mostrarle cómo usar una imagen NinePatch. Definiendo un historial estirable con el Empate de Draw 9-patch tool. Una imagen NinePatch es una imagen PNG estirable a menudo destinada para el historial de botones capaz de ajustares los tamaños. como se muestra en Figure B.9. Líneas en el fondo y borde correcto le dice al Androide dónde el contenido debería ir. Stretch a Satisfacer Para el historial pudimos haber utilizado a cualquier Androide Drawable. Un borde de un pixel alrededor de la imagen real contiene información adicional sobre cómo estirar la imagen e insertar acolchó contenido. La siguiente cosa que necesitamos es la clase del Dispositivo. Si el contenido no encaja en ese área (que es usualmente el caso) en ese entonces lo los versos en izquierda y carel le dicen al Androide que el pixel rema y columnas debería ser duplicado para estirar la imagen.2. en página 73).png de la extensión y se colocó en lo res/drawable directory.

} Regresaremos a suplir esta clase en un momento pero por ahora lo podemos hacer simplemente use el comportamiento predeterminado provisto por AppWidgetProvider. import android.GARCIA JIM El resto de la Historia El Widget necesita extender a AppWidgetProvider.. public class Widget extends AppWidgetProvider { // .java package org. Aquí está la definición de La clase del Dispositivo: Download Widget/src/org/example/widget/Widget. realmente no necesita Para. Está bien.appwidget.widget.. pero seguro hace cosas más convenientes.example.AppWidgetProvider. Haciendo a la medida su pantalla de la página principal del sitio Web con dispositivos .

hagámosle uno mejor exhibiendo la corriente salga en citas y cronometre dentro de nuestro dispositivo. y entonces seleccione el dispositivo denominado Dispositivo ¿(?).Run As > Android Application .3.0" encoding="utf-8"?> <resources> <string name="hello">Hello World!</string> <string name="app_name">Widget</string> <string name="widget_name">Widget</string> </resources> Todo lo que queda ora debe manejarlo. Escoja Dispositivos entre el menú. vaya a la ventana del Explorador del Paquete. deshagámonos de algunos molestosos mensajes de error definiendo a unos cuantos los valores de la cuerda: Download Widget/res/values/strings. clic derecho El proyecto del Dispositivo. Alterne el despliegue para ver cómo el dispositivo automáticamente ajusta el tamaño de sí mismo. Para ver el nuevo dispositivo. Running el Dispositivo Para echar a andar su nuevo dispositivo. su dispositivo debería aparecer (vea a Figure B. .xml <?xml version="1.GARCIA JIM Finalmente. suba el menú de contexto de la pantalla de la página principal del sitio Web: la prensa y el agarre su dedo (o el ratón) en la página principal del sitio Web filtran. Un menú aparecerá con opciones listando todos los tipos de cosas que usted puede sumar (vea Figura B. Pruebe moverlo de un lado para otro por presionar y sujetar su dedo en el dispositivo. en la página precedente). Tan excitante como eso fue.4). Para quítelo. Al fin. Nada mucho parecerá ocurrir como el Eclipse construye e instala el dispositivo en su emulador o dispositivo. arrástrelo para el icono del cubo de la basura al pie de la pantalla.

example. secundan. Finalmente.String now = formatter.appwidget.setTextViewText(R. .appwidget. La llamada para super. en línea 27 que enviamos nuestra vista actualizada para reemplazar la corriente el contenido del dispositivo.xml file .5.updateAppWidget(appWidgetIds.5. int[] appWidgetIds) { 20 // Retrieve and format the current date and time .public .RemoteViews.GARCIA JIM Estando Al Día En Androide 1. el minuto. En línea 21.action.. . nombre de mes. formateamos el dátil actual acostumbrando uno SimpleDateFormat creó en línea 14. Cuando usted suma eso de regreso a la pantalla de la página principal del sitio Web. el día del mes.import java. R.widget.SimpleDateFormat. .public void onUpdate(Context context.onUpdate () en línea 30 es justa allí para la higiene de código. appWidgetManager. android. .appWidgetManager.// Define the format string for the date and time .// class Widget extends AppWidgetProvider { . .AppWidgetManager.Date. el intento es android. updateViews). De regreso cuando hacemos caer en una trampa al AndroidManifest. los anfitriones del dispositivo (los programas como la pantalla de la página principal del sitio Web que puede contienen dispositivos) envíele una razón a que todo su dispositivo pequeño bromea cada vez que los dispositivos deberían exhibir algo.. y en ese entonces la hora. dijimos al Androide que podríamos recibir ese intento y podríamos hacer algo interesándole con eso. usted debería ver Algo así como Figure B. just a habit appWidgetManager. .text.private SimpleDateFormat formatter = new SimpleDateFormat( 15 "EEE.id. Not really necessary. d MMM yyyy\nHH:mm:ss.layout.import java.onUpdate(context. el Androide llamará por teléfono nuestro el método onUpdate ().AppWidgetManager .format(new Date()).updateViews. . now). appWidgetIds). y los milisegundos en lo secunde alboroto.@Override .main). Ahora Es hora de complementar la clase del Dispositivo para hacer justamente eso: Download Widget/src/org/example/widget/Widget.import 5 . Después.import android.import android.APPWIDGET_UPDATE.SSS" ). . Esto saldrá a la vista el día de la semana. La forma del Androide a la que enviarle una razón debe difundir un intento.layout.getPackageName().main.text." texto "mundial" con lo el tiempo y fecha actual. Línea 26 reemplaza el "hola" original ". .import . En este caso.// Change the text in the widget updateViews = new RemoteViews( 25 context.appwidget.AppWidgetProvider.Context. Cada vez que el intento APPWIDGET_UPDATE llega adentro. Eso simplemente tanto ocurre que este ejemplo usa el mismo layout.java Line 1 package org.content. Remueva el dispositivo de su pantalla de la página principal del sitio Web y reinstálelo de Eclipse.util. android. . . al actualizar como hizo cuando él comienza. en línea 24 que creamos una instancia RemoteViews para la nueva vista el layout que el dispositivo exhibirá.// -} -} 30 super.RemoteViews . R.widget. y año en la primera fila de lo El dispositivo. 10 .

y especificar una actividad inicial para la configuración.xml. . Haga búsquedas en la Internet usando Google recomienda que usted coloque dispositivos para actualizar infrecuentemente. sin embargo. así es que nuestro dispositivo estará actualizado una vez un minuto. proceso subordinado. para conservar poder de la batería. La frecuencia de actualizaciones es controlada por el androide:UpdatePeriodMillis el parámetro en res xml widget. por ejemplo una vez al día o una vez cada hora. Un valor de 60000 representa 60 segundos.GARCIA JIM Exhibiendo la fecha y el tiempo. Go Wild Ahora que usted sabe los elementos básicos de dispositivo construyendo. El acontecimiento real de actualización puede ser demorado (posiblemente mucho tiempo) por otras cosas sucediendo en el teléfono.2 en línea Intente conservar sus dispositivos simples y útiles. Si usted necesita características más adelantadas como originarse de acontecimientos. Pero simplemente Por diversión. Por ingeniosamente acostumbrar los dispositivos de la aplicación que usted puede hacer al Androide experimentan más personales y dinámico para sus usuarios. la consulta el documentation. Repare en que esto lo es sólo un número aproximado. pruebe sedimentarse el período de actualización para un número bajo como 1000 o empareje Los 100ms para ver lo que ocurre. hay sinnúmero para lo interesándole chunches que usted puede crear.