You are on page 1of 175

GARCIA JIM

GARCIA JIM

Qu lectores le ponen alrededor de Hola, Androide ste es un libro excelentsimo: Muy bien escrito, fcil para leer, y la diversin. Adems, 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 Bsquedas 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 Pragmtico popular. Para el material En 2D y grficos 3D a solas, esto es digno de un lugar en cualquier La biblioteca del desarrollador del androide.

Mark Murphy El Fundador, CommonsWare Recuerdo cundo yo primero comenc a trabajar con Androide; Estaba como uno El laberinto enorme. Con este libro, la introduccin habra sido mucha Menos doloroso. Estoy convencido de que leyendo este libro Androide nuevo Los programadores tendrn un principio ms fcil.

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

GARCIA JIM

La plataforma mvil de Desarrollo, la Edicin 2

El hola, el Androide Introduciendo de Google


Ed Burnette

El Estante de Libros Pragmtico

GARCIA JIM
Muchas de las designaciones usadas por fabricantes y suplidores para distinguir sus productos Es reclamado como marcas registradas. Donde esas designaciones aparecen en este libro, y Lo Los programadores pragmticos, LLC se dio cuenta de un reclamo de marca registrada, las designaciones tienen Sido impreso en letras maysculas iniciales o en todos los capitales. El Juego Pragmtico del Arrancador, Lo El programador pragmtico, Pragmatic Programando, Estante de Libros Pragmtico y la g de eslabonamiento El dispositivo son marcas registradas de Los Programadores Pragmticos, LLC. Las porciones de la cobertera del libro son reproducidas de trabajo creado y compartidas por Google y Usado segn los trminos descritos en los Creative Commons 2.5 la Licencia de Atribucin. Vea Http://code.google.com/policies.html #restrictions para los detalles. Cada precaucin fue llevada en la preparacin de este libro. Sin embargo, el editor publicista No carga con la responsabilidad para los errores o las omisiones, o para daos que pueden resultar de El uso de informacin (incluyendo listados de programa) contenida en este punto. Nuestros cursos Pragmticos, talleres, y otros productos pueden ayudar a usted y su equipo Cree mejor software y tenga ms diversin. Para ms informacin, as como tambin lo ltimo Los ttulos pragmticos, por favor nos visitan en Http://www.pragprog.com

Derecho De Autor 2009 Ed Burnette. Todos los derechos reservados. Ninguna parte de esta publicacin puede ser reproducida, almacenada en un sistema de recuperacin, o puede ser transmitido, En cualquier forma, o por cualquier medio, electrnico, mecnico, fotocopiando, la grabacin, o De otra manera, sin el anterior consentimiento del editor publicista. Impreso en los Estados Unidos de Norte Amrica. ISBN-10: El 1-934356-49-2 ISBN-13: El 978-1-934356-49-4 Impreso en peridico libre de cido. P1.0 escribiendo en letras de imprenta, octubre del 2009 La versin: El 2009-10-6

GARCIA JIM
EL CONTENIDO Las aceptaciones 9 Prlogo 10 Qu Hace Al Androide Especial? . . . . . . . . . . . . . . . . . . 10 Quin Debera Leer Este Libro? . . . . . . . . . . . . . . . . . . . 11 Qu hay en Este Book? . . . . . . . . . . . . . . . . . . . . . . . . 12 Qu es New para Cupcake? . . . . . . . . . . . . . . . . . . . . . 12 Qu es New para Dona? . . . . . . . . . . . . . . . . . . . . . . . 13 Los Recursos en Lnea. . . . . . . . . . . . . . . . . . . . . . . . . . 13 Que Se Ayuna Adelante. . . . . . . . . . . . . . . . . . . . . . . . . . 14 Yo Introduciendo Al Androide 15 1 Ponen en Marcha 16 1.1 Instalando las Herramientas. . . . . . . . . . . . . . . . . . . . . 16 1.2 Creando Su Programa de Primera Parte. . . . . . . . . . . . . . . . 20 1.3 Corriendo en el Emulador. . . . . . . . . . . . . . . . . 20 1.4 Funcionando con un Telfono Verdadero. . . . . . . . . . . . . . . . . 23 1.5 Que Se Ayunan Adelante. . . . . . . . . . . . . . . . . . . . . . . 24 2 Teclean Conceptos 27 2.1 el Cuadro Grande. . . . . . . . . . . . . . . . . . . . . . . 27 2.2 que es Vivo! . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.3 Bloques Constructivos. . . . . . . . . . . . . . . . . . . . . . . 36 2.4 Recursos Utilizadores. . . . . . . . . . . . . . . . . . . . . . 37 2.5 Seguro y Seguro. . . . . . . . . . . . . . . . . . . . . . . 38 2.6 Que Se Ayunan Adelante. . . . . . . . . . . . . . . . . . . . . . . 39 Los fundamentos II Android 40 3 Diseando la Interfaz del Usuario 41 3.1 Introduciendo Al Sudoku Example. . . . . . . . . . . . . 41 3.2 Diseando por Declaracin. . . . . . . . . . . . . . . . . 42 3.3 Creando Al Opening Filtran. . . . . . . . . . . . . . . 43 3.4 Recursos Alternos Utilizadores. . . . . . . . . . . . . . . . . 51 3.5 Implementando Uno Acerca de Caja. . . . . . . . . . . . . . . . 54 3.6 Aplicndole Un Tema. . . . . . . . . . . . . . . . . . . . . . 59 3.7 Sumando Un Men. . . . . . . . . . . . . . . . . . . . . . . 60 3.8 Trasfondos de Adicin. . . . . . . . . . . . . . . . . . . . . . . 63 3.9 Iniciando Un Juego New. . . . . . . . . . . . . . . . . . . . 65 3.10 Depurando con Mensajes del Leo. . . . . . . . . . . . . . . 67 3.11 Depurando con el Debugger. . . . . . . . . . . . . . . 68 3.12 Egresando el Juego. . . . . . . . . . . . . . . . . . . . . . 68 3.13 Que Se Ayunan Adelante. . . . . . . . . . . . . . . . . . . . . . . 69 4 Grficos del 2D Exploring 70 4.1 Aprendiendo los Fundamentos. . . . . . . . . . . . . . . . . . . . . 70 4.2 Adicin Graphics para Sudoku. . . . . . . . . . . . . . . . 75 4.3 Manejando Aporte. . . . . . . . . . . . . . . . . . . . . . . 84 4.4 El Resto de Historia. . . . . . . . . . . . . . . . . . . . 90 4.5 Haciendo Ms Mejoras. . . . . . . . . . . . . . . . 99 4.6 Que Se Ayunan Adelante. . . . . . . . . . . . . . . . . . . . . . . 100

GARCIA JIM
5 Multimedia 101 5.1 Jugando contra Audio. . . . . . . . . . . . . . . . . . . . . . . . 101 5.2 Jugando Video. . . . . . . . . . . . . . . . . . . . . . . . 107 5.3 Adicin Sounds para Sudoku. . . . . . . . . . . . . . . . . 112 5.4 Que Se Ayunan Adelante. . . . . . . . . . . . . . . . . . . . . . . 115 6 Datos Locales Storing 116 6.1 Adicin Options para Sudoku. . . . . . . . . . . . . . . . . 116 6.2 Continuando Un Juego Old. . . . . . . . . . . . . . . . . 118 6.3 Recordando la Posicin Actual. . . . . . . . . . . . 120 6.4 Accediendo al Internal Archivan Sistema. . . . . . . . . . . . 122 6.5 Accessing Dakota del Sur Cards. . . . . . . . . . . . . . . . . . . . 123 6.6 Que Se Ayunan Adelante. . . . . . . . . . . . . . . . . . . . . . . 124 III Ms All de los Fundamentos 125 7 el Mundo Conectado 126 7.1 Haciendo Una Lectura Ligera por el Intento. . . . . . . . . . . . . . . . . . . . . 127 7.2 Tejen con una Vista. . . . . . . . . . . . . . . . . . . . . . . 131 7.3 From JavaScript para Java y la Parte Trasera. . . . . . . . . . . . 136 7.4 Web Utilizadora Services. . . . . . . . . . . . . . . . . . . . . 143 7.5 Que Se Ayunan Adelante. . . . . . . . . . . . . . . . . . . . . . . 154 8 Localizando y Sintiendo 155 8.1 la Posicin, la Posicin, la Posicin. . . . . . . . . . . . . . . . 155 8.2 Colocan A Sensors para Maximum. . . . . . . . . . . . . . . . . 161 8.3 la Vista Panormica. . . . . . . . . . . . . . . . . . . . . . . 164 8.4 Que Se Ayunan Adelante. . . . . . . . . . . . . . . . . . . . . . . 170 9 Ponindole SQL a Work 171 9.1 Introduciendo SQLite. . . . . . . . . . . . . . . . . . . . . 171 9.2 SQL 101. . . . . . . . . . . . . . . . . . . . . . . . . . . 172 9.3 el Hola, la Base de Datos. . . . . . . . . . . . . . . . . . . . . . . 174 Atadura de 9.4 Datos. . . . . . . . . . . . . . . . . . . . . . . . . 182 9.5 Utilizando A Un ContentProvider. . . . . . . . . . . . . . . . . . 185 9.6 Implementando A Un ContentProvider. . . . . . . . . . . . . 188 9.7 Que Se Ayunan Adelante. . . . . . . . . . . . . . . . . . . . . . . 189 10 3D Graphics en OpenGL 191 10.1 Grficos Comprensivos del 3D. . . . . . . . . . . . . . . . 191 10.2 Introducing OpenGL. . . . . . . . . . . . . . . . . . . . 192 10.3 Creando A Un OpenGL Program. . . . . . . . . . . . . . . 193 10.4 Dando la Escena. . . . . . . . . . . . . . . . . . . . 195 10.5 Construyendo Un Modelo. . . . . . . . . . . . . . . . . . . . . . 199 10.6 Luces, la Cmara, .... . . . . . . . . . . . . . . . . . . . . 202 10.7 Ponen en Marcha! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 10.8 Aplicndole Textura. . . . . . . . . . . . . . . . . . . . . . 205 10.9 el Cuc. . . . . . . . . . . . . . . . . . . . . . . . . . . 209 10.10 Midiendo Suavidad. . . . . . . . . . . . . . . . . . 210 10.11 Que Se Ayunan Adelante. . . . . . . . . . . . . . . . . . . . . . . 211

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

GARCIA JIM

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

GARCIA JIM
Quin Debera Leer Este Libro? El nico requisito es una comprensin bsica de programar en Java O un lenguaje orientado en objeto similar (C # har en caso necesario). Usted no hace Necesito cualquier anterior experiencia desarrollando software para dispositivos mviles. Adentro El hecho, si usted lo hace, es probablemente mejor si usted intenta olvidar esa experiencia. El androide es tan diferente que es buena para empezar una mente abierta.

Qu hay en Este Libro? El hola, el Androide est dividido en tres partes. Hablando en trminos generales, el libro Los progresos de menos adelantado para los temas ms adelantados, o de ms Comn para los aspectos menos comunes de Androide. Varios captulos comparten un ejemplo comn: Un juego Android Sudoku. Por gradualmente aadirle las caractersticas al juego, usted se enterar de muchos Los aspectos de interfaces inclusivas programadoras Android del usuario, multimedios, Y el ciclo biolgico del Androide. En parte yo, comenzaremos con una introduccin para Android. Esto est donde usted lo har Aprenda a instalar el emulador del Androide y cmo usar uno integrado El ambiente de desarrollo (IDE) para escribir su primer programa. Luego lo haremos Introduzca algunos conceptos cruciales como el ciclo biolgico del Androide. La programacin En Androide es un poco diferente lo que usted es probablemente usado, as Asegrese de que usted ponga estos conceptos adelante a seguir adelante. La parte II habla de la interfaz del usuario de Androide, los grficos de dos dimensiones, Los componentes multimedia, y el acceso simple de datos. Estas caractersticas sern Usado en la mayora de programas usted escribe. La parte III cava ms profundo en la plataforma del Androide. Aqu usted aprender acerca de Conectndose a los exteriores servicios mundiales, basados en posiciones, lo incorporado La base de datos del SQLite, y los grficos tridimensionales. Al final del libro, usted encontrar appendices que cubren las diferencias Entre Androide y Java Standard Edition (SE), cmo crear un dispositivo Y publicando su aplicacin. Qu es New para Cupcake? El androide 1.5 (Cupcake) introdujo un nmero de realces a lo La plataforma del androide incluyendo soporte para teclados suaves (sobre la pantalla) La videograbacin, y los dispositivos aplicativos. Bajo las coberteras, hubo Ms que 1,000 cambios para el Android API entre 1.1 y 1.5.1 Para acomodar la nueva versin, cada pgina y ejemplo en este libro Ha estado revisado y actualizado as es que surtir efecto con 1.5. Si usted ha ledo La primera edicin de este libro, luego vaya de seguro a revisar estos captulos En particular: " Captulo 1, Ayuda Rpida para Iniciar, en pgina 16 incluye instrucciones en acostumbrar Los SDKs del blanco y los Dispositivos del Androide Virtual (AVDs). " Captulo 8, Localizando y Sentir, en pgina 155 ahora usa lo nuevo SensorManager APIs y el mtodo nuevo setBuiltInZoomControls (). " Captulo 10, 3D Graphics en OpenGL, en pgina 191 ha sido grandemente Simplificado gracias a la clase nueva del GLSurfaceView. Adems, por la demanda popular hemos sumado dos apndices nuevas: " La apndice B, en pgina 217 le muestra cmo crear un Dispositivo para lo La pantalla anfitriona. sta es una caracterstica nueva de Cupcake.

GARCIA JIM
" La apndice C, en pgina 227 le gua a travs de los pasos de hacer Su aplicacin disponible en venta o gratis en el Androide El mercado. El androide 1.5 ( ahora o ms tarde) est disponible para todos los dispositivos navieros del Androide. Todos los dispositivos nuevos lo tienen instalados, y Google dice tan casi todo mayor Los dispositivos han mejorado. Esta edicin del libro no cubre versin 1.1 o ms temprano. Qu es New para Dona? El androide 1.6 (la Dona) sum soporte para los despliegues - la densidad baja alta y Ms un nmero de menor de edad cambia eso no afecta la mayora de developers.2 l Puede ser un rato antes de que todos los dispositivos sean mejorados a 1.6, entonces Section C.1, Construyendo para 1.5, 1.6, y Ms All, en pgina 228 cubre cmo crear uno Singularice programa que soporta versiones mltiples. Todos los ejemplos en esto El libro ha sido probado en ambos 1.5 y 1.6. Los Recursos en Lnea En el sitio Web para este libro, http://pragprog.com/titles/eband2, usted encontrar Lo siguiente: " El cdigo lleno de la fuente para todos los programas de muestra us en este libro " Una pgina de fe de erratas, listando cualquier errores en la edicin actual (el alquiler Espere que eso estar vaco!) " 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 cdigo de la fuente en sus aplicaciones como usted ve Equipe. Nota: Si usted lee la versin PDF de este libro, usted lo puede hacer tambin D un clic sobre el rectngulo gris pequeo antes de los listados de cdigo para hacer un download de eso El archivo de la fuente en seguida. Que Se Ayuna Adelante Aunque la mayora de autores esperan que usted lea cada palabra en sus libros, yo S que usted no va a hacer eso. Usted quiere leer justo la adecuada cantidad a dejar Usted logra terminar algo, y entonces tal vez usted regresar ms tarde y Lea alguna otra cosa para dejarle lograr terminar otro pedazo. Entonces, he intentado Provale de un poco de ayuda as es que usted no se perder. Cada captulo en este libro llega al final con una seccin "que se ayuna adelante". Estos Las secciones proveern alguna gua para dnde a usted debera ir despus cuando Usted necesita leer en voz alta el libro de orden. Usted tambin encontrar punteros para otro Los recursos como libros y documentacin en lnea aqu en el caso usted Quiera aprender ms acerca del tema. Entonces, a qu est usted esperando? El siguiente _ Captulo de captulo 1, Ayuda Rpida para Iniciar, En pgina 16 _ se cae usted bien en el fin profundo con su primer Androide El programa. Divida en captulos 2, Conceptos Cruciales, en pgina 27 tomas un paso atrs y Le inicia en la filosofa y conceptos bsicos de Androide, y Captulo 3, Diseando la Interfaz del Usuario, en pgina 41 cava en el usuario La interfaz, cul ser la parte ms importante de la mayora de Androide Los programas.

GARCIA JIM

Parte I Introduciendo al Androide

GARCIA JIM

Captulo 1 La Ayuda Rpida Para Iniciar


El androide combina la ubicuidad de telfonos celulares, la excitacin de claro El software de la fuente, y el apoyo corporativo de Google y otro Open A los miembros de la Alianza del microtelfono les gusta Intel, TI, mvil a T, y NTT DoCoMo. El resultado es una plataforma mvil que usted no puede permitirse no aprender. Afortunadamente, comenzar que revelado con Androide es fcil. Usted no se empareja Necesito acceso para un telfono del Androide _ simplemente una computadora donde usted pueda Instale al Android SDK y el emulador telefnico. En este captulo, le mostrar cmo obtener todas las herramientas de desarrollo Instalado, y luego entraremos directamente de un salto y crearemos una aplicacin en funciones: La versin de "hola, Mundo" del androide. 1.1 Instalando las Herramientas El juego de desarrollo del software del Androide (SDK) trabaja en Ventanas, Linux Y la Macintosh OS X. Las aplicaciones que usted crea, claro est, puede ser destacado En cualquier dispositivos del Androide. Antes de que usted inicia codificacin, usted necesita instalar a Java, un IDE, y lo El androide SDK. Java 5.0 + Primero usted necesita una copia de Java. Todas las herramientas de desarrollo del Androide requieren Eso, y los programas que usted escribe estarn usando el lenguaje Java. JDK 5 o 6 Es requerido. Es lo suficientemente no para justamente tener un ambiente del runtime (JRE); Usted necesita El juego lleno de desarrollo. Recomiendo a traer al ltimo JDK 6.0 Sun La actualizacin de los usuarios Solares de la Macintosh del site.1 de descarga OS X debera llegar lo La ltima versin de Macintosh OS X y el JDK del sitio Web de la Manzana. Para asegurarse usted tiene la versin correcta, corra esta orden de su concha La ventana. Aqu hay lo que comprendo cundo lo corro: C: java - la versin La versin del java "1.6.0_14" Java SE Runtime (TM) Environment (construya 1.6.0_14-b08) Java HotSpot Client (TM) VM (cree a 14.0-b16, modo mixto, uso compartido) Usted debera ver algo semejante, con versin "1.6.something" o ms tarde. El eclipse Despus, usted debera instalar un ambiente de desarrollo Java si usted no hace Tenga uno ya. Recomiendo Eclipse, porque sea gratis y porque Es usado y soportado por los desarrolladores Google que crearon Androide. Si usted no quiere usar Eclipse (all es siempre nico en cada gento) El soporte para otro idus como la IDEA NetBeans y JetBrains est disponible De sus comunidades respectivas. O si usted es escuela realmente vieja, Usted puede preceder a un IDE enteramente y justamente puede usar el tools.2 de lnea de comando La versin mnima de Eclipse es 3.3.1, pero usted siempre debera acostumbrar Cualquier cosa que sea la versin de produccin ms actual. Reparo en que usted necesita Ms que simplemente la plataforma estndar del "clsico" Eclipse SDK. Vaya a lo

GARCIA JIM
El eclipse que las descargas paginan, 3 y escogen "eclipse IDE para Java Developers". Siga las direcciones all para hacer un download, desempacando, e instalar El eclipse en una posicin adecuada (guste a C:\Eclipse en Ventanas). El androide Despus, haga un download del ltimo Android SDK de Google. La descarga del Androide El page4 tiene paquetes para Ventanas, Macintosh OS X, y Linux. Despus Haciendo un download del paquete as mismo para usted, desempaca el archivo del .zip para Un directorio conveniente (por ejemplo, C:\Google). Por defecto, el SDK ser expandido en un subdirectorio como androidsdk Windows-1.6 _ r1. ste es su SDK instala directorio; Haga una nota de lo Abatane camino as es que usted puede referirse a l ms tarde.

Figura 1.1: Instalando Al Android Development Toolkit Ningn especial instala programa es necesario pero yo le recomiendo sume lo El directorio del tarro para depsito de SDK para su CAMINO. El siguiente paso es iniciar Eclipse y Configrelo. El Plug-In del Eclipse Para simplificar desarrollo, Google ha escrito un plug-in para Eclipse Designado el Android Development Toolkit (ADT). Para instalar el plug-in, Siga estos pasos (note estas direcciones son para Eclipse 3.4 _ diferente Las versiones pueden tener mens ligeramente diferentes y opciones): 1. El eclipse de principio, y las Actualizaciones del > Software de Ayuda de primera calidad.... 2. D un clic sobre la etiqueta Disponible del Software si no es ya seleccionada. 3. D un clic sobre el Sitio Add ... el botn. 4. Entre en la posicin del sitio de actualizacin del Androide: Https://dl-ssl.google. / el androide /eclipse del com. Si usted tiene dificultad con esta direccin, intente Usando http en la posicin en lugar de https. Una vez que usted lo ha llenado, la ventana de dilogo debera parecerse a la Figura 1.1. D un clic sobre Oklahoma. 5. El sitio del Androide ahora debera aparecer en el Software Disponible La vista. Seleccione el checkbox al lado de eso, y luego d un clic sobre Install.... Si Usted obtiene un mensaje de error, luego usted no puede tener la versin correcta De Eclipse. Fuertemente recomiendo a usar ya sea el Eclipse preconstruido IDE para Java o el Eclipse IDE para paquetes de Desarrollo del ingeniero elctrico Java, La versin 3.4 o ms nuevo.

GARCIA JIM
Dice "error de Conexin," Tan Ahora Qu? Si usted obtiene un error de conexin, la causa ms probable es un poco amable De cortina de fuego erigida por sus administradores de sistema. Para salirse La cortina de fuego, usted necesitar configurar Eclipse con la direccin De su servidor del apoderado. ste es el mismo servidor del apoderado para el que usted usa Su navegador de Internet, pero desafortunadamente su Eclipse no es lo suficientemente listo Para recoger el trasfondo de all. Para contarle a Eclipse sobre el apoderado, seleccione > Red de Preferencias Las conexiones, la vuelta en la opcin para la configuracin Manual del apoderado, Introduzca el nombre del servidor y nmero portuario, y d un clic sobre Oklahoma. Si Usted no ve la opcin, usted puede estar corriendo una versin mayor De Eclipse. Pruebe mirar bajo las Preferencias

Si usted hace una costumbre instalar de Eclipse, luego a utilizar al Androide Los editores que usted tambin necesitar instalar las Herramientas de Web Standard (WST) El plug-in y todos sus prerrequisitos. Veo plataforma del theWeb Tools a casa page5 para ms detalles y hago un download Los enlaces. Estos son ya incorporados en los paquetes recomendables Mencionado anterior. 6. Haga clic Despus, aceptan los acuerdos de licencia, y luego dan un clic sobre Acabado Para iniciar la descarga e instalar proceso. 7. Una vez lo instala se hace, vuelve a arrancar Eclipse. 8. Cuando Eclipse regresa arriba, usted puede ver algunos mensajes de error Porque usted necesita decirle donde el Android SDK est ubicado. Seleccione > Androide de > Preferencias de la Ventana (> las Preferencias del Eclipse Adelante La Macintosh OS X), y entra en el SDK instala directorio que usted not ms temprano. D un clic sobre Oklahoma. Uf! Afortunadamente, usted tiene que hacer eso solo una vez (o al menos una vez cada Cronometre una nueva versin de ADT o el Eclipse sale afuera). Ahora que todo Es instalado, es hora de escribir su primer programa. 1.2 Creando Su Programa de Primera Parte ADT viene con un programa de ejemplo incorporado, o la plantilla, que somos Yendo para soler crear un programa de "hola" simple ", del Androide" en simplemente algunos Los segundos. Prepare su cronmetro. Alista? El set? Vaya! Seleccione > Proyecto del Archivo > New ... para abrir la ventana de dilogo Nueva de Proyecto. Luego Seleccione Proyecto del > Androide del Androide, y haga clic Despus. Entre en la siguiente informacin: El nombre de proyecto: HelloAndroid Construya Blanco: El androide 1.6 El nombre aplicativo: El hola, el Androide El nombre del paquete: Org.example.hello Cree Actividad: Hola Cuando usted termina, debera verse algo as como Figura 1.2, adelante lo Despus de pgina. El Final de Chasquido. El plug-in del Androide crear el proyecto y lo suplir Con algunos archivos predeterminados. El eclipse lo construir y lo empaquetar arriba as es que lo har Est listo a ejecutar. Si usted pone un error alrededor a perder carpetas de la fuente, Seleccione Proyecto > Por Completo para centrarlo.

GARCIA JIM
Est bien, eso se encarga de escribir el programa; Ahora todo lo que queda debe intentar Corrindolo. Primero lo correremos bajo el Emulador del Androide. 1.3 Corriendo en el Emulador Para correr su programa Android, vaya a la ventana del Explorador del Paquete, El clic derecho el proyecto HelloAndroid, y la Carrera de primera calidad Como la Aplicacin del > Androide. Si usted lleva el mismo paso en Eclipse usted puede ver un dilogo de error Guste el mismo en Figura 1.3, en pgina 22. Esto indica que no hemos dicho todo El Emulator la clase de telfono a emular. Creando a un AVD Para hacer esto, usted necesita crear un Dispositivo del Androide Virtual (AVD), acostumbrando Ya sea el Eclipse o el androide avd command.6 que es ms fcil de utilizar Eclipse, As es que haga una seleccin S en el dilogo AVD Error para abrir al AVD Manager. Usted Puede reabrirse al gerente ms tarde seleccionando a Window Android AVD El gerente.

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 ms a menudo que el Android SDK. La versin de la que usted hace un download Puede ser diferente al mismo que utilic cundo escribindole a esto Haga una reservacin, y puede contener uno pocos, lo har que decimos, idiosincrasias. yo Recomindele jaque el sitio con enchufe mensualmente para recoger a cualquier Los apuros y caractersticas nuevas.

Figura 1.3: Perdiendo Dispositivo del Androide Virtual (AVD) En el dilogo AVD Manager, llene los campos para el AVD nuevo como sigue: El nombre: El em16 El blanco: El androide 1.6 - API Derribe 4 El SDCard: El 128M La piel: Falle (HVGA) Esto le dice a Eclipse que se establece un dispositivo genrico llamase a "em16," lo cual lo ha hecho lo El androide 1.6 (la Dona) que firmware instal. Un 128MB Digital Seguro virtual (Dakota del Sur) la Tarjeta ser ubicada, junto con un despliegue de half-VGA (320480). Cuando usted termina usted debera ver algo as como Figura 1.4, en pgina 24. Debido a las actualizaciones en el plug-in desde esto estaba escrito su pantalla puede Vase ligeramente diferente. El chasquido Create AVD para crear el dispositivo virtual. Algunos segundos ms tarde usted Debera ver un mensaje que el dispositivo ha sido creado. D un clic sobre Oklahoma, y Luego seleccione al AVD y clic Principio ... para subirlo. Cierre al AVD La ventana del gerente cuando usted termina. La Dona Vs. Cupcake La versin de Androide corriendo en su emulador (o realmente el telfono) Debe ser compatible con el Blanco de la Constitucin de su programa. Por ejemplo, Si usted intenta correr a un Androide 1.6 (la Dona) programe adelante uno El androide 1.5 (Cupcake) el telfono, no surtir efecto porque Androide 1.5 telfonos slo pueden correr 1.5 o anteriores programas. El androide 1.6 Los telfonos, por otra parte, pueden correr programas construidos para 1.6, 1.5, Y ms temprano. Pero puede ser un rato antes de la mayora de telfonos tenga Sido mejorado. Tan por qu no simplemente el Androide del blanco 1.5? Desafortunadamente las aplicaciones Construidos pues 1.5 no siempre exhiben correctamente en lo ms grande y Las pantallas ms pequeas encontraron en 1.6 telfonos. Afortunadamente hay uno fcil La forma para hacer sus programas compatible con ambos 1.5 y 1.6. Vea a Section C.1, Construyendo para 1.5, 1.6, y Ms All, en pgina 228 Para las instrucciones.

GARCIA JIM
Probemos Eso Otra Vez Una vez que usted tiene a un AVD vlido, la ventana del emulador del Androide se iniciar Y la bota el Androide dirigiendo sistema. La primera vez que usted haga esto, a eso Pueden tomar un minuto o dos, as es que pueden tener paciencia. Usted puede necesitar para el clic derecho adelante El proyecto y la Carrera de primera calidad Como la Aplicacin del > Androide otra vez. Si usted ve Un mensaje de error diciendo que la aplicacin no responde, hace una seleccin La opcin para continuar esperando. El eclipse le enviar una copia de su programa al emulador ejecutar. La pantalla aplicativa sube, y su "hola, Androide" programa Est ahora corriendo (vea Figura 1.5, en pgina 25). No hay vuelta de hoja! Felicitaciones En su primer programa del Androide. 1.4 Funcionando con un Telfono Verdadero Corriendo un programa del Androide en un dispositivo fsico como lo mvil G1 durante el desarrollo es casi idntico para correrlo en el emulador. Todo lo que usted necesita hacer es conectar su telfono para la computadora con uno USB cablegrafe e instale un driver.7 especial del dispositivo

Figura 1.4: Creando a un AVD en proceso de desaparicin Cierre la ventana del emulador si est ya abierta. Con tal de que el telfono sea Bloqueado de adentro, las aplicaciones sern cargadas y corridas all en lugar de eso. Cuando usted est listo a publicar su aplicacin para otros para usar, all Son algunos pasos ms que usted necesitar tomar. La apndice C, en pgina 227 lo har

GARCIA JIM
Cubra eso de ms detalle. 1.5 Que Se Ayunan Adelante Gracias al plug-in del Eclipse, creando un programa esqueltico del Androide Toma slo algunos segundos. En el Captulo 3, Diseando la Interfaz del Usuario, Adelante Pgina 41, comenzaremos a rellenarnos de msculo fuera tan mnimo con una aplicacin verdadera _ uno Sudoku juegue. Esta prueba ser usada en varios captulos a demostrar API. del androide

Figura 1.5: Corriendo el "hola, Androide" programa Acortando la Vuelta en U Iniciar al emulador es caro. Piense acerca de eso as Cuando usted primero enciende su telfono, necesita por aadidura arriba algo as como Cualquier sistema de la computadora. Cerrar al emulador est algo as como irse El telfono o arrancando las bateras. As es que, no lo apague! Deje la ventana del emulador corriendo con tal de que Eclipse est corriendo. La prxima vez que usted inicie una voluntad del Androide de programa, del Eclipse Me fijo que el emulador est ya all y justamente le enviar lo nuevo Programe correr.

GARCIA JIM
Pero antes de ahondar en eso, usted deberan tardar algunos minutos en rezar Divida en captulos 2, Conceptos Cruciales, adelante lo en la otra pgina. Una vez que usted ase lo bsico Los conceptos como las actividades y los ciclos biolgicos, el resto sern mucho ms fciles Para entender. Aunque el uso de Eclipse para desarrollar programas del Androide es optativo, yo Altamente recomindelo. Si usted nunca ha usado Eclipse antes, usted puede querer Para invertir dinero en una referencia rpida como el Gua Eclipse IDE Pocket

GARCIA JIM
Captulo 2 Teclee Conceptos Ahora que usted tiene una idea de lo que Android es, echemleos un vistazo cmo eso Las obras. Algunas partes de Androide pueden ser familiares, como la semilla Linux, OpenGL, y la base de datos SQL. Los otros sern completamente extranjeros, Como la idea del ciclo biolgico aplicativo de Androide. Usted necesitar que una buena comprensin de estos conceptos cruciales para escriba Las aplicaciones del Androide bien portado, as que si usted lee slo un captulo adentro Este libro, lectura este. 2.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. En Figura 2.1, en la siguiente pgina, usted puede ver lo " 20,000 El pie " la vista de Androide. Estdielo estrechamente habr una prueba maana. Cada estrato usa los servicios provistos por los estratos debajo de l. Empezando Del fondo, las siguientes secciones resaltan los estratos siempre y cuando por ah El androide. Linux Kernel El androide es creado encima de una fundacin slida y a la que se result ser: El Linux La semilla. Creado por Linus Torvalds en 1991 mientras l fue un estudiante La Universidad de Helsinki, Linux puede ser encontrado hoy adentro todo de Los relojes de pulsera para supercomputadoras. Linux provee la abstraccin del hardware El estrato para Androide, dejando a Android ser puesto a babor para una variedad ancha De plataformas en el futuro.

Figura 2.1: La arquitectura de sistema del androide

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

GARCIA JIM
El Runtime del Androide Tambin la sentada encima de la semilla es el Android Runtime, incluyendo lo La mquina virtual Dalvik y las bibliotecas Java de fondo. El Dalvik VM es la implementacin de Google de Java, optimizada para mvil Los dispositivos. Todo el cdigo que usted escribe para Androide estar escrito en Java y Corra dentro del VM. Dalvik difiere de Java tradicional en dos formas importantes: " El Dalvik VM corre archivos del .dex, cules se convierten en compila cronometra De .class estndar y archivos del .dex de archivos. .jar es ms compacto y Eficiente que la clase archiva, una consideracin importante para lo limitado La memoria y los dispositivos energizados en batera que los blancos Android. " 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 mviles de la Edicin (Java Maine). Hay una cantidad sustancial De traslapo, sin embargo. En A de la Apndice, en pgina 213, usted encontrar una comparacin De Androide y bibliotecas estndar Java. El Armazn Aplicativo Sentndose por encima del runtime y bibliotecas natales, usted encontrar la Aplicacin El estrato del armazn. Este estrato provee los bloques constructivos de alto nivel Usted soler crear sus aplicaciones. El framework viene preinstalado Con Androide, pero usted tambin lo puede extender con sus componentes Segn se necesite. Las partes ms importantes del framework son como sigue: " El gerente de actividad: Esto controla el ciclo biolgico de aplicaciones (vea Seccin 2.2, est vivo!, En la siguiente pgina) y mantiene uno comn "Backstack" para la navegacin del usuario. " Contente a los proveedores: Estos objetos encapsulan datos que las necesidades para ser Compartido entre aplicaciones, como los contactos. Vea Seccin 2.3, Contente a los Proveedores, en pgina 37. " El gerente del recurso: Los recursos son cualquier cosa que va con su El programa que no es cdigo. Vea Seccin 2.4, Usando Recursos, Adelante Pgina 37. " El gerente de la posicin: Un telfono del Androide siempre sabe dnde l is. Vea Captulo 8, Localizando y Sintiendo, en pgina 155. " El gerente de notificacin: Los Eventos como mensajes que acaba de llegar, las citas, La proximidad alerta, invasiones ajenas, y ms pueden replantearse En una moda discreta para el usuario. Las Aplicaciones y los Dispositivos El estrato ms alto en el diagrama de arquitectura del Androide es los Applications Y el estrato de Dispositivos. Piense acerca de este como el consejo del iceberg del Androide. Los usuarios finales vern slo estos programas, dichosamente ignorante de todo el Ponga en marcha seguir debajo de la lnea de flotacin. Como un desarrollador del Androide, sin embargo, Usted tiene mejor criterio. Las aplicaciones son programas que pueden asumir el control de la pantalla entera y Interactele al usuario. Por otra parte, los Dispositivos (algunas veces designado Las cosas), slo funciona en un rectngulo pequeo de la aplicacin de la pantalla de la pgina principal del sitio Web. La mayor parte de este libro cubrir desarrollo aplicativo, porque Ese es lo que la mayor parte de ti escribir. El desarrollo del dispositivo es inconspicuo En Appendix B, en pgina 217. Cuando alguien compra un Androide llame por telfono, vendr preempacado

GARCIA JIM
Un nmero de aplicaciones estndar de sistema, incluyendo lo siguiente: " Llame por telfono marcador " El correo electrnico " Los contactos " El navegador de Internet " El Mercado del Androide Usando el Mercado del Androide, el usuario podr hacer un download de programas nuevos Para funcionar con su telfono. Es ah donde usted entra. En el momento Usted termina este libro, usted podr escribir sus aplicaciones del asesino Para Androide. Ahora tomemos una apariencia ms cercana en el ciclo biolgico de una aplicacin del Androide. Es un poco diferente lo que usted est acostumbrado a ver. 2.2 que es Vivo! En su Linux estndar o parte superior de un escritorio de Ventanas, usted puede tener muchas aplicaciones Corriendo y visible de inmediato en ventanas diferentes. Uno de lo Las ventanas tiene foco del teclado, pero de otra manera todos los programas son iguales. Usted fcilmente puede cambiar de decisin entre ellos, 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 ms ya. El androide no trabaja de ese modo. En Androide, hay una aplicacin del primer plano, lo cual tpicamente toma Sobre el despliegue entero excepto por la lnea de estatus. Cuando el usuario cambia de direccin En su telfono, la primera aplicacin que ven es la aplicacin de la pgina principal del sitio Web (Vea Figura 2.2, en la siguiente pgina). Este programa tpicamente sale a la vista Una imagen de fondo, una bsqueda o dispositivo del reloj, y una lista con barra de desplazamiento de Otras aplicaciones que el usuario puede conjurar. Cundo el usuario corre una aplicacin, el Androide la inicia y lo pone al pairo lo El primer plano. De esa aplicacin, el usuario podra invocar otra aplicacin, u otra pantalla en la misma aplicacin, y luego otro y Otro. Todos estos programas y pantallas se graban en la aplicacin La pila por el Gerente de Actividad del sistema. En cualquier momento, el usuario puede Presione el botn De Atrs para regresar a la pantalla previa en la pila. De punto de vista del usuario, surte efecto muchsimo como la historia en una trama El navegador. Parte trasera que presiona les devuelve a la pgina previa. Figura 2.2: La aplicacin de la pgina principal del sitio Web

GARCIA JIM

El proceso!= La aplicacin Internamente, cada pantalla de la interfaz del usuario es representada por una clase de Actividad (Vea Seccin 2.3, Actividades, en pgina 36). Cada actividad tiene su vida El ciclo. Una aplicacin es una o ms actividades y un proceso Linux para Tngalos. Eso suena bastante franco, no lo hace eso? Pero no haga Acomdese an; 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 biolgico de actividad no est atareado con el proceso El ciclo biolgico. Los procesos son simplemente envases desechables para actividades. Esto es

Probablemente desemejante del cada otro sistema usted est familiarizado, as deja Tome una apariencia ms cercana antes de seguir adelante. Los ciclos biolgicos de los ricos y Famous Durante su duracin 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 direccin de lo El sistema. Sin embargo, usted queda notificado cuando el estado est a punto de cambiar A travs del onXX () las llamadas de mtodo. Usted pasa sobre la disposicin de estos mtodos en su clase Activity, y el Androide llamar por telfono Ellos en el tiempo apropiado: " OnCreate (Bundle): Esto es designado cuando la primera parte de actividad se inicia. Usted lo puede usar realizar antigua inicializacin como crear La interfaz. del usuario onCreate () toma un parmetro que es ya sea Nulo o alguna informacin estatal previamente salvada por el onSaveInstanceState ( ) El mtodo.

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 msica. " 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 debera 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 sern necesarios por algn rato. Si la memoria es apremiante, OnStop (el sistema simplemente puede terminarse () nunca puede ser designado Su proceso). " OnRestart (): Si este mtodo 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 mtodo a permitirle La actividad para ahorrar por estado de instancia, como una posicin del cursor Dentro de un campo del texto. Usualmente usted no necesitar pasar sobre la disposicin de eso porque La implementacin predeterminada le ahorra al estado para toda su interfaz del usuario Controla automticamente. " OnRestoreInstanceState (el Manojo): Esto es designado cuando la actividad es Siendo reinicializado de un estado previamente salvado por el onSave El mtodo InstanceState (). La implementacin 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 comn, As es que es importante que su aplicacin sea diseada desde el principio Con esto en mente. En algunos casos, el mtodo onPause () puede ser lo ltimo El mtodo procedi al cobro inmediato de su actividad, tan es ah donde usted debera ahorrar cualquier datos Usted quiere mantener aproximadamente para la prxima vez. Adems de manejar el ciclo biolgico de su programa, el armazn del Androide Dispone que un nmero de bloques constructivos usted el uso a crear su Las aplicaciones. Echemleos un vistazo a esos despus. 2.3 Bloques Constructivos Algunos objetos estn definidos en el Android SDK que cada desarrollador necesita Para ser familiar. Los ms 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 gustara brevemente introducirlos ora. Las actividades Una actividad es una pantalla de la interfaz del usuario. Las aplicaciones pueden definir uno o Ms actividades para manejar fases diferentes del programa. Como discutido En la Seccin 2.2, est vivo!, En pgina 32, cada actividad es responsable para Salvo su estado a fin de que puede ser restaurada ms tarde como parte de lo El ciclo biolgico aplicativo. Vea Seccin 3.3, Creando la Pantalla Abridora, Adelante Pgina 43 para un ejemplo.

GARCIA JIM
Los intentos Un intento es un mecanismo para describir una accin especfica, tan " la eleccin Una foto, una casa telefnica, "o" un claro la vaina alla puertas ". En Androide, simplemente Acerca de todo experimenta intentos, as es que a usted le sobran las oportunidades Para reemplazar o reusar componentes. Vea Seccin 3.5, Implementando Uno Aproximadamente Caja, en pgina 54 para un ejemplo de un intento. Por ejemplo, hay un intento para "enva un correo electrnico". Si su aplicacin Necesita enviar correo, usted puede conjurar ese intento. O si usted escribe uno La aplicacin nueva del correo electrnico, usted puede registrar una actividad para manejar tan atento Y reemplaza el programa de correo estndar. La siguiente persona de influencia de tiempo intenta Para enviar un email, obtendrn la opcin para usar su programa en lugar de Lo estndar. Los servicios Un servicio es una tarea que corre en el trasfondo sin el usuario directo La interaccin, parecido a un demonio Unix. Por ejemplo, considere una msica El jugador. La msica puede comenzar por una actividad, pero usted la quiere para Mantngase jugando an cuando el usuario ha seguido adelante hacia un programa diferente. Entonces, el cdigo que hace el modo de tocar real debera estar en un servicio. Ms 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 informacin absorto en un API aduanero para leer Y lo escribe. sta es la mejor forma para compartir informacin global entre aplicaciones. Por ejemplo, Google provee a un proveedor contento para los contactos. Toda la informacin all _ le nombra, le dirige la palabra, enve por telfono nmeros, y bien En adelante _ puede ser compartido por cualquier aplicacin que quiere para usarlo. Vea Seccin 9.5, Destinando a un ContentProvider, en pgina 185 para un ejemplo. 2.4 Recursos Utilizadores Un recurso es una cuerda del texto localizada, bitmap, u otro pedacito de Poco codifique informacin que su programa necesita. En constitucin cronometre todo su Los recursos se compilan en su aplicacin. Usted crear y almacenar sus recursos en el directorio de res adentro su Proyctese. El compilador del recurso del Androide (aapt) 5 procesa recursos Segn cul subcarpeta estn dentro y el formato del archivo. Para El ejemplo, PNG y bitmaps del formato JPG deberan irse en el res/drawable El directorio, y los archivos XML que describe le oculta los layouts lo deberan 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 estndar Los recursos Java, cules son a los que se puso notas por cuerdas cruciales. Hacindolo as Deja a Android hacer seguro todas sus referencias es vlido y economiza No espacie por ah no teniendo que almacenar todas esas llaves del recurso. Eclipse usos uno El mtodo similar a almacenar y establecer referencias para los recursos en plug-ines del Eclipse. Veremos un ejemplo del cdigo para acceder a un recurso en el Captulo 3, Diseando la Interfaz del Usuario, en pgina 41.

GARCIA JIM
2.5 Seguro y Seguro Como mencionada anterior, cada aplicacin corre en su propio proceso Linux. El hardware prohbe un proceso de acceder a otro proceso La memoria. Adems, cada aplicacin es asignada una identificacin de usuario especfica. Cualquier archivos que crea no pueden ser ledos o escritos por otras aplicaciones. Adems, acceda a para ciertas operaciones crticas est restringido, y usted Especficamente debe pedir permiso para usarles en un archivo nombrado Androide Manifest.xml. Cuando la aplicacin es instalada, el Gerente del Paquete Uno u otro concede o no concede los permisos basados en certificados Y, si es necesario, el usuario apremia. Aqu hay una cierta cantidad de lo ms comn Los permisos que usted necesitar: " La INTERNET: Acceda A la Internet. " LEA _ LOS CONTACTOS: Lea (pero no escriba) los datos de contactos del usuario. " ESCRIBA _ CONTACTOS: Escriba (pero no lea) los datos de contactos del usuario. " RECIBA A _ SMS: Monitoree mensajes entrantes SMS (el texto). " ACCEDA A _ LA POSICIN _ GRUESA: Utilice un proveedor tosco de la posicin tan La celda se encumbra o wifi. " _ LA POSICIN DE _ MULTA DE ACCESO: Use un proveedor de la posicin ms preciso tan Como GPS. Por ejemplo, para monitorear mensajes entrantes SMS Usted especificara Esto en el archivo manifiesto:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.android.app.myapp" > <uses-permission android:name="android.permission.RECEIVE_SMS" /> </manifest>

El androide aun puede restringir acceso a partes enteras del sistema. Acostumbrando Las etiquetas XML en AndroidManifest.xml, usted puede restringir quin puede iniciar una actividad, El principio o tiene fuerza obligatoria para un servicio, intentos emitidos por radio para un aparato receptor, o el acceso Los datos en un proveedor contento. Esta clase de control trasciende el alcance De este libro, pero si usted quiere aprender que se repita, lea la ayuda en lnea para lo Model.6 de seguridad del androide 2.6 Fast-Forward >> El resto de este libro usar todos los conceptos introducidos en este captulo. En el Captulo 3, Diseando la Interfaz del Usuario, en pgina 41, acostumbraremos Las actividades y los mtodos de ciclo biolgico para definir una aplicacin de muestra. El captulo 4, Explorando Grficos del 2D, en pgina 70 usar una cierta cantidad de los grficos Las clases en las bibliotecas nativas Android. Los codecs de los medios de comunicacin sern explorados En el Captulo 5, Multimedia, adelante mande a llamar 101, y los proveedores contentos sern Cubierto de adentro Captulo 9, Dndole Ocupacin a SQL, en pgina 171.

GARCIA JIM

Parte II Los Fundamentos del Androide

GARCIA JIM

Captulo 3 Diseando la Interfaz del Usuario


En el Captulo 1, la Ayuda Rpida para Iniciar, en pgina 16, us el Eclipse del Androide El plug-in para atar cabos sobre un programa de "hola" simple ", del Androide" en pocos minutos. En Parte II, crearemos un ejemplo ms sustancial: Un Sudoku El juego. Por gradualmente aadirle las caractersticas al juego, usted aprender acerca de Muchos aspectos de Androide programando. Iniciaremos con la interfaz del usuario. Usted puede encontrar todo el cdigo de muestra usado en este libro en http://pragprog. El com / titula / eband2. Si usted lee la versin PDF de este libro, usted Puede dar un clic sobre el rectngulo gris pequeo antes de los listados de cdigo de los que hacer un download Eso archiva directamente. 3.1 Introduciendo Al Sudoku Example Sudoku hace un gran programa de muestra para Androide porque el juego S mismo es tan simple. Usted tiene una cuadrcula de ochenta y una tejas (nueve a travs y Nueve derriban), y usted intenta rellenarlos con nmeros tan tan cada columna, Cada uno rema, y cada uno del tres por tres cajas contiene los nmeros 1 a travs de 9 solo una vez. Cuando el juego empieza, algunos de los nmeros (Los givens) es ya rellenado. Todo lo que el jugador tiene que hacer es dar abasto lo El descanso. Un acertijo verdadero Sudoku tiene slo una solucin nica. Sudoku es usualmente jugado con lpiz y peridico, pero las versiones informatizadas Es muy popular tambin. Con la versin del peridico, es fcil de hacer Un error pronto, y cuando eso ocurre, usted tiene que regresar y Borre la mayor parte de su trabajo. En la versin del Androide, 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. El androide Sudoku (vea Figura 3.1, en la siguiente pgina) tambin ofrecer uno Pocos indicios a tomar algunos del gruido resultan de acertijo solucionando. A las un El extremo, justamente podra solucionar el acertijo para usted, pero eso no sera cualquier La diversin, lo hara ella? Entonces, tenemos que sopesar los indicios contra el reto Y no la marca eso demasiado fcil. 3.2 Diseando por Declaracin El usuario interacta puede ser diseado usando uno de dos mtodos: Procesal Y declarativo. Procesal simplemente la manera en cdigo secreto. Por ejemplo, cuando Usted programa una aplicacin Giratoria, usted escribe cdigo Java para crear Y manipula todos los objetos de la interfaz del usuario como JFrame y El JButton. As, el Columpio es procesal. El diseo declarativo, por otra parte, no requiere cualquier cdigo. Cuando Usted disea una pgina simple de trama, usted usa HTML, un lenguaje de sobreprecio Basado en XML que describe lo que usted quiere ver en la pgina, no cmo Usted quiere hacerlo. El HTML es declarativo. El androide intenta montar a horcajadas la abertura entre lo procesal y declarativo Los mundos dejndole crear interfaces del usuario en ya sea el estilo. Usted Puede casi enteramente permanecer en cdigo Java, o usted puede quedarse casi enteramente

GARCIA JIM
En los descriptores XML. Si usted busca en la documentacin para cualquier Androide El componente de la interfaz del usuario, usted ver ambos las Java APIs y lo correspondiente Los atributos declarativos XML que hacen lo mismo. Cul debera usar usted? Cualquier cara de la moneda es vlida, pero el consejo de Google es acostumbrar XML declarativo lo ms posible. El cdigo XML es a menudo ms corto Y ms fcil para entender que el cdigo correspondiente Java, y eso es Menos probablemente para cambiar en versiones futuras.

Figura 3.1: El programa de ejemplo Sudoku para Androide Ahora veamos cmo podemos usar esta informacin para crear al Sudoku Abriendo pantalla. 3.3 Creando Al Opening Filtran Iniciaremos con un programa del Androide mnimo creado por el plugin Eclipse. Tal como usted hizo en la Seccin 1.2, Creando Su Primer Programa, adelante Pgina 20, crea un proyecto de "hola" nuevo ", del Androide", pero esta vez acostumbra lo Despus de los valores:
Project name: Sudoku Build Target: Android 1.6 Application name: Sudoku Package name: org.example.sudoku Create Activity: Sudoku

En un programa verdadero, claro est, usted usara sus nombres aqu. Lo El nombre del paquete es en particular importante. Cada aplicacin en el sistema Debe tener un nombre nico del paquete. Una vez que usted escoge un nombre del paquete, Tiene un poco su truco a cambiarlo porque es usado en tantos lugares. Me gusta mantener la ventana del emulador del Androide arriba de todo el tiempo y correr lo Programe despus de cada cambio, desde que toma slo algunos segundos. Si usted Haga eso y corra el programa ahora, usted ver una pantalla en blanco que simplemente Contiene las palabras "mundo de hola, Sudoku". La primera orden de negocio es Para cambiar eso en una pantalla abridora para que el juego, con botones alquiler

GARCIA JIM
El principio del jugador un juego nuevo, contine a uno previo, infrmese Acerca del juego, o salida. Entonces, en qu tenemos que convertirnos hace eso? Como discutidos en el Captulo 2, los Conceptos Cruciales, adelante paginan 27, hojas de solicitud del Androide Es una coleccin suelta de actividades, cada uno del cual define a un usuario La pantalla de la interfaz. Cuando usted le crea al Sudoku proyecto, el Androide El plug-in hace una actividad sola para usted en Sudoku.java:
Download Sudokuv0/src/org/example/sudoku/Sudoku.java

package org.example.sudoku;

import android.app.Activity; import android.os.Bundle;

public class Sudoku extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }

El androide llama el mtodo onCreate () de su actividad a inicializarlo. Lo Llame a setContentView () rellena el contenido de la pantalla de la actividad con Un dispositivo de vista del Androide. Pudimos haber usado varias lneas de cdigo Java, y posiblemente otro La clase o dos, a definir al usuario interconectan procesalmente. Pero en lugar de eso, El plug-in escogi la ruta declarativa, y continuaremos a lo largo de esos Las lneas. En el cdigo previo, R.layout.main es un identificador del recurso que Se refiere al archivo del main.xml en el directorio del / layout de res (vea Figura 3.2, adelante lo Despus de pgina). Main.xml declara la interfaz del usuario en XML, as es que eso es El archivo que necesitamos modificar. En runtime, el Androide analiza gramaticalmente e instantiates (Infla) el recurso definido all y los sets eso como la vista para lo La actividad actual.

Figura 3.2: Los recursos iniciales en el Sudoku se proyectan

GARCIA JIM
Es importante para reparar en que la clase de la R es manejada automticamente por ah lo El plug-in del Eclipse del androide. Cuando usted pone un archivo en cualquier parte del directorio de res, El plug-in nota el cambio y suma IDs del recurso en R. java En el directorio del gen para usted. Si usted quita o cambia un archivo del recurso, R. java es guardada en sync. Si usted sube el archivo en el editor, mirar Algo as como esto:
/* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */ package org.example.sudoku; public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000; } }

Los nmeros del hex son simplemente enteros que el gerente del recurso del Androide Suele cargar los datos verdaderos, las cuerdas, y los otros activos que son Compilado en su paquete. Usted no necesita preocuparse por sus valores. Simplemente recuerde que son agarraderas que se refieren a los datos, no lo Los objetos que contienen los datos. Esos objetos no estarn soplados hasta ellos Es necesario. Note eso casi cada programa del Androide, incluyendo la base El framework del androide mismo, tiene una clase de la R. Vea la documentacin en lnea En android.R para todos los recursos incorporados usted enlata use.1 Entonces, ahora sabemos que tenemos que modificar main.xml. Estudiemos en sus partes el original La definicin para ver lo que tenemos que cambiar. D doble clic sobre main.xml adentro El eclipse para abrirlo. A merced de cmo tiene usted que el Eclipse estableci, usted puede Vea ya sea un editor visual del layout o un editor XML. En versiones actuales De ADT, el editor visual del layout no es tan til, tan main.xml de chasquido o La etiqueta de la fuente al fondo a ver al XML. La primera lnea de main.xml est como Entiende: ?La versin del xml "1.0" codificando a "utf-8"?> Todos los archivos Android XML inician con esta lnea. Justamente dice al compilador que El archivo es formato XML, en la codificacin UTF-8. UTF-8 es casi exactamente como El texto normal de ASCII, pero tenga cdigos de escapada para personajes ASCII Como glifos japoneses. Next we see a reference to <LinearLayout>:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-- ... -->

GARCIA JIM
Un layout es un envase en primer lugar o ms nio objeta y un comportamiento para Sitelos en la pantalla dentro del rectngulo del objeto del padre. Aqu hay una lista de los layouts ms comunes provistas por Androide: " FrameLayout: Los classArranges sus nios as es que todos ellos empiecen en lo Corone izquierda de la pantalla. Esto sirve para imagen y puntos de vista tabulados Los cambiadores. " LinearLayout: Arregla a sus nios en una fila o columna sola. Esto Es el layout ms comn que usted usar. " RelativeLayout: Arregla a sus nios en relacin a cada otro o para El padre. Esto es a menudo usado en formas. " TableLayout: Ordena en filas a sus nios y columnas, parecido a Una mesa de HTML. Algunos parmetros son comunes para todos los layouts: Los xmlns:El androide "http://schemas.android.com/apk/res/android" Define al XML namespace para Androide. Usted debera definir esto Una vez, en la primera etiqueta XML en el archivo. El androide:_ la anchura del layout "llena _ padre", androide:_ la altura del layout "llena _ padre" Toma la altura y anchura entera del padre (en este caso, La ventana). Los valores posibles son llenan _ contenido del _ padre y de la envoltura. Dentro de la > etiqueta < LinearLayout usted encontrar un dispositivo de nio:
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" />

Esto define una etiqueta del texto simple. Reemplacemos eso con una cierta cantidad diferente El texto y algunos botones. Aqu hay nuestro primer intento:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.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

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 gramtica (El esquema DTD o XML), simplemente los ignora. En lugar de ingls duro que codifica El texto en el archivo del layout, usamos la sintaxis del resid de la @ cuerda para referirnos a cuerdas En el archivo res/values strings.xml. Usted puede tener versiones diferentes de esto Y otros archivos del recurso basaron en la localidad u otros parmetros tan Como la resolucin de la pantalla y la orientacin. Abra ese archivo ahora, ese interruptor para lo La etiqueta del strings.xml al fondo si es necesario, y entra en esto:
<?xml version="1.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.3: La primera versin de la pantalla abridora

GARCIA JIM
Ahorre strings.xml as es que el Eclipse reconstruir el proyecto. Cuando usted corre lo Programe ahora, usted debera ver algo as como Figura 3.3. Es legible, Pero se pudo uso un poco de cambios cosmticos. Hagamos el ttulo texto ms grande y centrados, la marca los botones ms pequeo, Y el uso un color de fondo diferente. Aqu est la definicin de color, cul Usted debera echar res/values/colors.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="background">#3500ffff</color> </resources>

Y aqu est el layout nuevo:


Download Sudokuv1/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.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.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

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 versin, introducimos una sintaxis nueva, @ +id/resid. En lugar de referir Para un recurso Idaho defini cualquier otra parte, ste es cmo crea usted Un recurso nuevo Idaho para el cual los otros pueden referir. Por ejemplo, @ +id / aproximadamente El botn define el Idaho para lo Acerca de botn, cul acostumbraremos posteriormente a hacer Algo ocurre cuando el usuario presiona ese botn.

Figura 3.4: Abriendo la pantalla con el Layout nuevo

Al resultado le son mostrados en Figura 3.4. A esta pantalla nueva le queda bien el retrato El modo (cuando la pantalla es ms alta es ancha), excepto cmo aproximadamente El modo del paisaje (la pantalla ancha)? El usuario puede cambiar modos en cualquier momento, Por ejemplo, enloqueciendo expulse el teclado o encendiendo el telfono su Tome partido, as es que usted necesita manipular eso. 3.4 Recursos Alternos Utilizadores Como una prueba, pruebe cambiar al emulador para ajardinar modo (Ctrl +F11 o Lo 7 o 9 teclea en el teclado pequeo). Uy! El botn de la Salida se rebalsa lo El fondo de la pantalla (vea Figura 3.5, en pgina 53). Cmo arreglamos eso? Usted podra intentar ajustar el layout a fin de que surta efecto con todas las orientaciones. Desafortunadamente, eso no es a menudo posible o gua a de aspecto extrao Las pantallas. Cuando eso ocurre, usted necesitar crear un layout diferente para El modo del paisaje. Ese es el acercamiento que tomaremos aqu

GARCIA JIM

Figura 3.5: En el modo del paisaje, no podemos ver el botn de la Salida. Cree un archivo designado res / main.xml / terrestre en layout (la nota lo - el sufijo terrestre) que Contiene el siguiente layout:
Download Sudokuv1/res/layout-land/main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.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.5sp" /> <TableLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center" android:stretchColumns="*" > <TableRow>

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. Ahora corra lo Programe otra vez (vea Figura 3.6, en la siguiente pgina). Aun en paisaje El modo, todos los botones es visible. Usted puede usar sufijos del recurso para especificar versiones alternas de cualquier recursos, No simplemente el layout. Por ejemplo, usted los puede usar proveer El texto localizado forma una serie en los lenguajes diferentes. Cada archivo alterno del recurso Debe definir set exactamente igual de IDs. El androide soporta sufijos para la densidad de lenguaje actual, de la regin, pixel, Ocltele mtodo de tamao, de resolucin, de aporte, y ms. Vea Al Androide La documentacin de recursos para una lista actual de sufijos y la herencia Las reglas 3.5 Implementando Uno Acerca de Caja Cuando el usuario hace una seleccin lo Acerca de botn, 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 seleccin abotonan, queremos Para fortalecer una ventana con alguna informacin acerca de Sudoku.

Figura 3.6: Utilizar un layout Especfico en paisaje nos deja Ver todos los botones.

GARCIA JIM
Despus de enrollar a travs del texto, el usuario puede presionar el botn De Atrs para Descarte la ventana. Podemos lograr esto en diferentes formas: " Defina una Actividad nueva e inciela. " Use la clase AlertDialog y mustrela. " La clase de Dilogo del Androide de subclase, y la funcin que. Para este ejemplo, definamos una actividad nueva. Guste la actividad principal Sudoku, Lo Acerca de la actividad necesitar un archivo del layout. Le nombraremos / layout de res About.xml:
Download Sudokuv1/res/layout/about.xml

<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.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 slo una versin de este layout porque se ver fina en ambos Los modos de retrato y del paisaje. Ahora sume cuerdas para el ttulo de lo Acerca de ventana de dilogo y el texto eso Contiene para res/values strings.xml:
Download Sudokuv1/res/values/strings.xml

<string name="about_title">About Android Sudoku</string> <string name="about_text">\ Sudoku is a logic-based number placement puzzle. Starting with a partially completed 9x9 grid, the objective is to fill the grid so that each row, each column, and each of the 3x3 boxes (also called <i>blocks</i>) contains the digits 1 to 9 exactly once. </string>

Note cmo puede contener un recurso de la cuerda HTML simple formateando y Pueden extenderse a lo largo de lneas mltiples. En caso usted se pregunte, el carcter de la barra inversa (\ ) En cuestin de _ texto impide un espacio vaco adicional de aparecer antes La primera palabra. Lo Acerca de la actividad debera estar definido en About.java. Todo lo que necesita hacer es Pase sobre la disposicin de setContentView () onCreate () y de llamada:

GARCIA JIM
Download Sudokuv1/src/org/example/sudoku/About.java

package org.example.sudoku; import android.app.Activity; import android.os.Bundle; public class About extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.about); } }

Despus necesitamos alambrar todo este hasta lo Acerca de botn en la clase Sudoku. Comience por sumar algunas importaciones que necesitaremos para Sudoku.java:
Download Sudokuv1/src/org/example/sudoku/Sudoku.java

import android.content.Intent; import android.view.View; import android.view.View.OnClickListener;

En el mtodo onCreate (), sume cdigo para llamar a findViewById () a mirar hacia arriba uno La vista del androide dado su recurso Idaho y setOnClickListener () para decirle a Androide Cul desaprueba cosquilleo cuando el usuario toca o da un clic sobre la vista:
Download Sudokuv1/src/org/example/sudoku/Sudoku.java

/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Set up click listeners for all the buttons View continueButton = findViewById(R.id.continue_button); continueButton.setOnClickListener(this); View newButton = findViewById(R.id.new_button); newButton.setOnClickListener(this); View aboutButton = findViewById(R.id.about_button); aboutButton.setOnClickListener(this); View exitButton = findViewById(R.id.exit_button); exitButton.setOnClickListener(this); }

Mientras estamos aqu dentro, correspondemos para todos los botones. Recuerde eso A las constantes les gusta _ el botn R.id.about sea creado por el Eclipse con enchufe adentro R. java cuando vea @ +id / acerca de _ botn en / main.xml del / layout de res. El cdigo usa esto como el aparato receptor, as es que la clase Sudoku necesita implementar La interfaz OnClickListener y define un mtodo onClick designado
Download Sudokuv1/src/org/example/sudoku/Sudoku.java

public class Sudoku extends Activity implements OnClickListener { // ... public void onClick(View v) { switch (v.getId()) { case R.id.about_button: Intent i = new Intent(this, About.class);

GARCIA JIM
startActivity(i); break; // More buttons go here (if any) ... } } }

Para iniciar una actividad en Androide, primero necesitamos crear una instancia de La clase Atenta. Hay dos clases de intentos: Los intentos pblicos (denominado)

Figura 3.7: La vista de la montaa, nosotros tenemos un problema Eso est registrado con el sistema y puede ser designado de cualquier aplicacin Y los intentos privados (annimo) que son usados dentro de un soltero La aplicacin. Para este ejemplo, justamente necesitamos la clase ms reciente. Si usted corre El programa y selecto lo Acerca de botn ahora, que usted obtendr un error (vea Figura 3.7). Qu pas? Olvidamos un paso importante: Cada actividad necesita ser declarada adentro AndroidManifest.xml. Para hacer eso, dar doble clic sobre el archivo para abrir eso, interruptor Para el modo XML si es necesario seleccionando la etiqueta AndroidManifest.xml en lo Llegue al fondo, y sume una > etiqueta nueva de < actividad despus de la etiqueta de cierre de la primera parte Uno:
Download Sudokuv1/AndroidManifest.first.xml

<activity android:name=".About" android:label="@string/about_title" > </activity>

Ahora si usted salva el manifiesto, corra el programa otra vez, y haga una seleccin lo Acerca de botn, usted debera ver algo as como Figura 3.8, en lo siguiente La pgina. Presione el botn De Atrs (Esc en el emulador) cuando usted termina. Eso aspecto general Oklahoma, excepto no hara que sea simptico si podramos ver la pantalla inicial Atrs lo Acerca de texto? Figura 3.8: La primera versin de lo Acerca de pantalla

GARCIA JIM
3.6 Aplicndole Un Tema Un tema es una coleccin de estilos que pasan sobre la disposicin de la apariencia y sienten de Androide Los dispositivos. Los temas estaban inspirados por Hojas de Estilo Cascading (CSS) usadas Para pginas de trama _ separan el contenido de una pantalla y su presentacin O el estilo. El androide est empacado con varios temas que usted puede La referencia por el nombre, 4 o usted puede hacer su tema subclasificando Existiendo unos y pasando sobre la disposicin de sus valores predeterminados. Podramos definir nuestro tema aduanero en res/values/styles.xml, sino por Este ejemplo nos aprovecharemos justamente de uno predefinido. Para usarlo, Rebrase al editor AndroidManifest.xml, y cambie la definicin de Lo Acerca de la actividad as es que tenga una propiedad de tema.

Download Sudokuv1/AndroidManifest.xml

<activity android:name=".About" android:label="@string/about_title" android:theme="@android:style/Theme.Dialog" > </activity>

El @ androide: El prefijo delante del nombre de estilo quiere decir que sta es una referencia Para un recurso definido por Androide, no uno que se defini en su El programa. Corriendo el programa otra vez, lo Acerca de caja ahora se parece a la Figura 3.9. Muchos programas necesitan mens y opciones, as es que las siguientes dos secciones lo harn Mustrele cmo definirlos.

GARCIA JIM
3.7 Sumando Un Men El androide soporta dos clases de mens. Primer, all est el men que usted obtiene Cuando usted presiona el botn fsico del Men. En segundo lugar, 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 botn del centro de D-Pad). Hagmoslos a la primera clase tan tan cuando las prensas del usuario la llave del Men, Abrirn un men como el mismo en Figura 3.10, en la siguiente pgina. Primero necesitamos definir algunas cuerdas que usaremos ms tarde:
Download Sudokuv1/res/values/strings.xml

<string name="settings_label">Settings...</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.xml:


Download Sudokuv1/res/menu/menu.xml

<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/settings" android:title="@string/settings_label" android:alphabeticShortcut="@string/settings_shortcut" /> </menu>

Figura 3.10: Presione el botn del Men para abrir el men. Despus necesitamos modificar la clase Sudoku para subir el men simplemente Definido. Para hacer eso, necesitaremos algunas importaciones ms:
Download Sudokuv1/src/org/example/sudoku/Sudoku.java

import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem;

GARCIA JIM
Luego pasamos sobre la disposicin del mtodo Sudoku.onCreateOptionsMenu ():
Download Sudokuv1/src/org/example/sudoku/Sudoku.java

@Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; }

GetMenuInflater () devuelve una instancia de MenuInflater que solemos leer La definicin del men de XML y las vueltas eso en una vista verdadera. Cuando el usuario selecciona cualquier men tem, onOptionsItemSelected () ser Designado. Aqu est la definicin para ese mtodo:
Download Sudokuv1/src/org/example/sudoku/Sudoku.java

@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.settings: startActivity(new Intent(this, Prefs.class)); return true; // More items go here (if any) ... } return false; }

Prefs es una clase que vamos a definir eso exhibe todas nuestras preferencias Y deja al usuario cambiarlos. 3.8 Trasfondos de Adicin El androide provee una facilidad agradable para definir lo que todas sus preferencias de programa Es y cmo exhibirlos no usando casi cdigo. Usted define Las preferencias en un archivo del recurso llamaron a res/xml settings.xml:
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.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>

GARCIA JIM
El programa Sudoku tiene dos trasfondos: Uno para la msica de fondo y Uno para exhibir indicios. Las llaves son cuerdas constantes que sern usadas Bajo las coberteras en base de datos de preferencias del Androide. Despus defina la clase Prefs, y hgala extender a PreferenceActivity:

package org.example.sudoku; import android.os.Bundle; import android.preference.PreferenceActivity; public class Prefs extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); } }

El mtodo addPreferencesFromResource () lee la definicin de trasfondos De XML y lo infla en los puntos de vista en la actividad actual. Toda la persona de mucha importancia Las tomas elevadoras colocan en la clase PreferenceActivity.

Figura 3.11: Es poco mirar en, pero lo obtuvimos gratis.

GARCIA JIM
No olvide registrar la actividad Prefs en AndroidManifest.xml:
Download Sudokuv1/AndroidManifest.xml

<activity android:name=".Prefs" android:label="@string/settings_title" > </activity>

Sudoku ahora reestrenado, prensa la llave del Men, selecto los Trasfondos ... tem, Y la vigilia con asombro como la pgina de trasfondos Sudoku aparece (vea Figura 3.11). Pruebe cambiar los valores all y egresando el programa, Y luego entra de nuevo y se asegura de que todos ellos estn todava listos. El cdigo que lee los trasfondos y hace algo con ellos ser Discutido en un captulo diferente (el Captulo 6, Almacenando Datos Locales, adelante Pgina 116). Por ahora sigamos adelante hacia el botn Nuevo de Juego. 3.9 Iniciando Un Juego New Si usted ha jugado cualquier juegos Sudoku, usted sabe que algunos son fciles y Algunos son enloquecedoramente duras. As es que cuando el usuario selecciona Juego Nuevo, nosotros Quiera fortalecer una ventana de dilogo pidindoles a ellos que haga una seleccin entre tres dificultad Los niveles. Hacer una seleccin de una lista de cosas cuesta poco esfuerzo en Androide. La primera parte Necesitaremos algunas cuerdas ms en res/values strings.xml:
Download Sudokuv1/res/values/strings.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.xml:


Download Sudokuv1/res/values/arrays.xml

<?xml version="1.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 ms en la clase Sudoku:


Download Sudokuv1/src/org/example/sudoku/Sudoku.java

import android.app.AlertDialog; import android.content.DialogInterface; import android.util.Log;

GARCIA JIM
Sume cdigo en la declaracin del interruptor del mtodo onClick () para manipular hacer clic El botn Nuevo de Juego:
Download Sudokuv1/src/org/example/sudoku/Sudoku.java

case R.id.new_button: openNewGameDialog(); break;

Figura 3.12: La ventana de dilogo de seleccin de dificultad El mtodo openNewGameDialog () se encarga de crear la interfaz del usuario Para la lista de dificultad.
Download Sudokuv1/src/org/example/sudoku/Sudoku.java

private static final String TAG = "Sudoku" ; /** Ask the user what difficulty level they want */ private void openNewGameDialog() { new AlertDialog.Builder(this) .setTitle(R.string.new_game_title) .setItems(R.array.difficulty, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { startGame(i); } }) .show(); } /** Start a new game with the given difficulty level */ private void startGame(int i) { Log.d(TAG, "clicked on " + i); // Start game here... }

GARCIA JIM
El mtodo setItems () toma dos parmetros: El recurso Idaho del artculo La lista y un oyente que ser designado cuando uno de los artculos es seleccionado. Cuando usted corre el programa ahora y apresura a New Juegue, usted llegar lo La ventana de dilogo en Figura 3.12, en la pgina previa. No vamos realmente a iniciar el juego an, as en lugar de eso cuando usted Seleccione un nivel de dificultad, justamente escribimos en letras de imprenta uno depura mensaje utilizando al Log.d () El mtodo, pasndolos a eso una cuerda de la etiqueta y un mensaje a imprimir. 3.10 Depurando con Mensajes del Leo La clase del Leo provee varios mtodos estticos para imprimir mensajes de diversos La severidad nivela para el leo de sistema del Androide: " Log.e (): Los errores " Log.w (): Las advertencias " Log.i (): La informacin " Log.d (): Depurando " Log.v (): Verboso Los usuarios nunca vern este leo, pero como un desarrollador en quien usted lo puede mirar Unas formas de la pareja de casados. En Eclipse, abra al pblico la vista LogCat seleccionando Ventana > la funcin > el Otro View ... Android LogCat (vea Figura 3.13, adelante lo Despus de pgina). La vista puede ser filtrada por la severidad o por la etiqueta por usted Especificado en la llamada de mtodo. Si usted no est usando Eclipse, usted puede ver la misma salida corriendo El adb logcat command.5 que recomiendo usted lo inicia esta orden en uno Ponga aparte ventana y djela correr todo el tiempo que el emulador es Corriendo. No interferir con algunos otros monitores. No puedo enfatizar bastante cmo til el leo del Androide estar durante el desarrollo. Recuerde ese error que vimos ms temprano con lo Acerca de caja (la Figura 3.7, adelante mandan a llamar 58)? Si usted haba abierto al pblico la vista LogCat en ese momento, Usted habra visto este mensaje: " ActivityNotFoundException: Incapaz Para encontrar clase explcita de actividad ... tenga que usted declar esta actividad adentro Su AndroidManifest.xml "? No llega un poco ms simple que eso.

Figura 3.13: Depurando salida en la vista LogCat

GARCIA JIM
3.11 Depurando con el Debugger Adems de mensajes del leo, usted puede usar el debugger Eclipse para colocar Los puntos de ruptura, el soltero el paso, y la vista el estado de su programa. Primero, permita Su proyecto para depurar por sumar al androide:Debuggable "verdadero" La opcin en su archivo AndroidManifest.xml:6 Haga Un Download De Sudokuv1/AndroidManifest.xml < el androide aplicativo:El icono / "el icono @ dibujable" El androide:La etiqueta _ "el nombre de la @ cuerda /aplicacin" El androide:Debuggable "verdadero" Luego, el chasquido simplemente correcto el proyecto, y Debug selecto Como > Androide La aplicacin. 3.12 Egresando el Juego Este juego realmente no necesita un botn de la Salida, porque el usuario pueda simplemente Presione la llave De Atrs o la llave de la pgina principal del sitio Web para hacer algo si no. Pero quise Para agregar uno para mostrarle cmo terminar una actividad. Adale esto a la declaracin del interruptor en el mtodo onClick ():
Download Sudokuv1/src/org/example/sudoku/Sudoku.java

case R.id.exit_button: finish(); break;

Cuando el botn de la Salida es seleccionado, llamamos el mtodo de final (). Esto cierra Derribe la actividad y control de regresos para la siguiente actividad en el Androide La pila aplicativa (usualmente la pantalla de la pgina principal del sitio Web). Instruido cmo usar archivos del layout para organizar su usuario interconectan y cmo Para destinar a recursos del Androide para texto, colores, y ms. Usted sum controles Como botones y campos del texto, le aplicaron temas para cambiar el programa La apariencia, y aun los mens aadidos y las preferencias por aadidura. El androide es un sistema complicado, pero usted no tiene que saber todo eso para Comience. Cuando usted necesita socorro, lo centenares de manda a llamar de referencia El empuje en lnea material en ms profundidad en todas las clases y los mtodos usados Here.7 Another gran fuente para los consejos y los trucos son Planet Android.8 Y Por supuesto, si usted se pega usted siempre puede caer de visita por el foro de debate Para este book.9 Los otros lectores y yo estaremos encantados de echarle una mano. En el Captulo 4, Explorando Grficos del 2D, en la siguiente pgina, acostumbraremos Grfico API del androide para dibujar las tejas para el juego Sudoku.

Fast-Forward >>Uf, eso fue bastante para cubrir en un captulo! A partir de rayn, usted

GARCIA JIM
Captulo 4 Explorando Grficos del 2D Hasta ahora, hemos cubierto la filosofa y conceptos bsicos de Androide y Cmo crear una interfaz de usuario simple con algunos botones y un dilogo Boxee. Usted realmente comienza a agarrar la onda de esta cosa Android. Sino Algo falta ... qu es eso? No me digas, la diversin! Los buenos grficos le pueden aadir un poquito de diversin y excitacin a cualquier aplicacin. El androide se pone una de las bibliotecas de grficos ms energticas disponibles uno El dispositivo mvil en sus puntas del dedo. Realmente, pone dos de ellos all: Uno Para grficos de dos dimensiones y uno para graphics.1 tridimensional En este captulo, cubriremos grficos del 2D y le aplicaremos ese conocimiento Para implementar la parte de juego de nuestro ejemplo Sudoku. Captulo 10, 3D Los grficos en OpenGL, adelante mandan a llamar 191 cubrirn grficos del 3D acostumbrando lo La biblioteca OpenGL ES. 4.1 Aprendiendo los Fundamentos El androide le provee a un nativo cabal biblioteca de grficos de dos dimensiones En su paquete de android.graphics. Con una comprensin bsica de clases Como Color y Lona, usted estar levantado y dibujando inmediatamente. El color Los colores del androide son representados con cuatro nmeros, uno para cada quien para alfa, Comunista, verdee, y azule (ARGB). Cada componente puede tener 256 posibles Los valores, o 8 pedacitos, as es que un color estn tpicamente apiados en un entero de 32 pedacitos. Para La eficiencia, los usos de cdigo del Androide un entero en lugar de una instancia de lo Distorsione clase. Comunista, verdee, y azule es obvio, pero el alfa no lo podra ser. El alfa es una medida de diapositiva. El valor mnimo, 0, indican lo El color es completamente transparente. Realmente no tiene importancia lo que los valores Para RGB es, si Uno son 0. El valor ms alto, 255, indican el color Es completamente opaco. Los valores se destin para en la mitad translcido, o Los colores semitransparentes. Le dejan ver algunos de cul es El objeto trazndose en primer plano. Para crear un color, usted puede usar una de las constantes estticas en el Color Clase, guste esto:
int color = Color.BLUE; // solid blue

O si usted sabe el alfa, comunista, verdee, y azule nmeros, usted puede acostumbrar Uno de los mtodos estticos de la fbrica como lo siguiente:
// Translucent purple color = Color.argb(127, 255, 0, 255);

Si es posible, sin embargo, usted est usualmente mejor definiendo todos sus colores adentro Un archivo del recurso XML. Esto le deja cambiarlos con holgura en un lugar Ms tarde:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="mycolor">#7fff00ff</color> </resources>

GARCIA JIM
Usted puede establecer referencias para colores por el nombre en otros archivos XML, como lo hicimos en el Captulo 3, o usted los puede usar en cdigo Java como esto:
color = getResources().getColor(R.color.mycolor);

El mtodo getResources () devuelve la clase ResourceManager para lo La actividad actual, y los precios de venta getColor () el gerente para buscar un color Dado un recurso Idaho. PAINT Una de clases ms importantes de la biblioteca nativa Android de grficos es the Paint class. Mantiene el estilo, color, y otra informacin necesitado Para dibujar cualquier grficos incluyendo a bitmaps, del texto, y las formas geomtricas. Normalmente cuando usted pinta algo en la pantalla, usted quiere dibujarla En un color entero. Usted coloca ese color con el mtodo Paint.setColor (). Por ejemplo:
cPaint.setColor(Color.LTGRAY);

Esto destina el valor predefinido de color para gris ligero. Canvas La clase de Lona representa una superficie en la cual usted dibuja. Inicialmente las lonas Pngase en marcha falto de cualquier contenido, guste las diapositivas en blanco para uno El proyector areo. Los mtodos en la clase de Lona le dejan dibujar lneas, Los rectngulos, los crculos, u otros grficos arbitrarios en la superficie. En Androide, la pantalla de despliegue est ocupada por una Actividad, lo cual se desempea como maestro de ceremonias uno La vista, que a su vez patrocine una Lona. Usted obtiene una oportunidad para acercarse Esa lona pasando sobre la disposicin del mtodo View.onDraw (). El nico parmetro Para onDraw () est una lona en la cual usted puede dibujar. Aqu hay una actividad de ejemplo designada Graphics, lo cual contiene una vista llamada GraphicsView:
public class Graphics extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new GraphicsView(this)); } static public class GraphicsView extends View { public GraphicsView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { // Drawing commands go here } }

GARCIA JIM
Vamos a meter algunos comandos del dibujo en el mtodo onDraw () En la siguiente seccin. Path The Path class tiene aplicacin un set de rdenes que extraen vector como lneas, Los rectngulos, y las curvas. Aqu hay un ejemplo que define un camino circular:
circle = new Path(); circle.addCircle(150, 150, 100, Direction.CW);

Figura 4.1: Dibujando texto alrededor de un crculo Esto define un crculo en x de la posicin = 150, y = 150, con un radio de 100 Los pixeles. Ahora que hemos definido el PATH, usmoslo dibujar el crculo Esboce y algn 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." ; canvas.drawPath(circle, cPaint); canvas.drawTextOnPath(QUOTE, circle, 0, 20, tPaint);

Usted puede ver el resultado en Figura 4.1. Desde que el crculo fue aspirado lo La direccin que gira en sentido del reloj (Direction.CW), el texto se traza tambin de ese modo. Si usted quiere traer realmente selecto, el Androide provee un nmero de PathEffect Las clases que le dejan hacer cosas algo semejante como le aplica una permutacin aleatoria para uno El PATH, la causa toda la lnea se segmenta a lo largo de un PATH a ser alisada con Las curvas o quebradas levantadas en segmentos, y crean otros efectos. Drawable En Androide, una clase Drawable sirve para un elemento visual como un bitmap o El color entero que est dirigido al despliegue slo. Usted puede combinar drawables

GARCIA JIM
Con otros grficos, o usted les puede usar en dispositivos de la interfaz de usuario (para El ejemplo, como el trasfondo para un botn o la vista). Drawables puede tomar una coleccin variada de formas: " Bitmap: Un PNG o imagen de Grupo Unido de Expertos en Fotografa. " NinePatch: Una imagen estirable PNG, tan nombrada porque originalmente Dividi la imagen en nueve secciones. Se destin para estos lo El trasfondo de botones capaz de ajustares los tamaos del bitmap. " Shape rdenes que extraen vector, basado en el Camino. Esto es algo uno SVG del hombre pobre. " Layers: Un envase para drawables de nio que dibujan en parte superior de cada uno Otro en una cierta z-order. " States: Un envase que muestra uno de sus drawables de nio bas adelante Su estado (una mscara mordida). Un uso es establecer seleccin diversas y enfocar Los estados para botones. " Levels:: Un envase que muestra slo uno de sus drawables de nio Basado en su nivel (un rango de enteros). Se destin para esto uno La batera o el calibre de intensidad de seal. " Scale:: Un envase para un nio dibujable que modifica su tamao Basado en el nivel actual. Un uso podra ser un cuadro zumbable El espectador. Drawables est casi siempre definido en XML. Aqu hay un ejemplo comn Donde uno dibujable est definido para ser una gradiente de un color para Otro (en este caso, el blanco al gris). El ngulo especifica la direccin de La gradiente (manera de 270 grados llega al final para llegar al fondo). Se destin para esto El trasfondo de una vista:

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <gradient android:startColor="#FFFFFF" android:endColor="#808080" android:angle="270" /> </shape>

Para usarlo, nosotros o podramos referirnos a eso en XML con el androide:El trasfondo El atributo o la llamada el mtodo Canvas.setBackgroundResource en la vista El mtodo onCreate () como esto:
setBackgroundResource(R.drawable.background);

Esto le da a nuestro ejemplo GraphicsView un trasfondo agradable de la gradiente, como Mostrado de adentro Figura 4.2, adelante lo en la otra pgina.

Figura 4.2: Usando un trasfondo de la gradiente definido en XML

GARCIA JIM
4.2 Adicin Graphics para Sudoku Es hora de aplicarle lo que hemos aprendido a nuestro ejemplo Sudoku. Cuando nosotros La izquierda que eso al final del Captulo 3, el juego Sudoku tuvo una pantalla de la abertura, Uno Acerca del dilogo boxea, y una forma para iniciar un juego nuevo. Pero faltaba Una parte muy importante: El juego! Usaremos los grficos natales del 2D La biblioteca para implementar eso en parte. Iniciando el Juego Primero necesitamos rellenar el cdigo que echa a andar el juego. startGame () toma Un parmetro, el ndice del nombre de dificultad seleccionado de la lista. Aqu est la definicin nueva:
Download Sudokuv2/src/org/example/sudoku/Sudoku.java

/** Start a new game with the given difficulty level */ private void startGame(int i) { Log.d(TAG, "clicked on " + i); Intent intent = new Intent(Sudoku.this, Game.class); intent.putExtra(Game.KEY_DIFFICULTY, i); startActivity(intent); }

El juego en parte de Sudoku ser otra actividad el Juego designado, entonces nosotros Cree un intento nuevo para empezarlo. Metemos el nmero de dificultad uno El extrarea de datos previsto en el intento, y luego llamamos al startActivity () El mtodo para emprender la actividad nueva. El Extrarea de datos es un mapa de llave /valor hace pareja eso ser pasado de mano a mano Para el intento. Las llaves son cuerdas, y los valores pueden ser ms primitivos Mecanografe, forme en orden de hombres primitivos, el Manojo, o una subclase de Serializable o Empaquetable. Definiendo la Clase de Juego Aqu est el contorno de la actividad de Juego:
Download Sudokuv2/src/org/example/sudoku/Game.java

package org.example.sudoku; import android.app.Activity; import android.app.Dialog; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.widget.Toast; public class Game extends Activity { private static final String TAG = "Sudoku" ; public static final String KEY_DIFFICULTY = "org.example.sudoku.difficulty" ; public static final int DIFFICULTY_EASY = 0; public static final int DIFFICULTY_MEDIUM = 1; public static final int DIFFICULTY_HARD = 2; private int puzzle[] = new int[9 * 9]; private PuzzleView puzzleView;

GARCIA JIM
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate" ); int diff = getIntent().getIntExtra(KEY_DIFFICULTY, DIFFICULTY_EASY); puzzle = getPuzzle(diff); calculateUsedTiles(); puzzleView = new PuzzleView(this); setContentView(puzzleView); puzzleView.requestFocus(); } // ... }

El mtodo onCreate () va a traer el nmero de dificultad del intento Y selecciona un acertijo para jugar. Luego crea una instancia del PuzzleView La clase, colocando al PuzzleView como el contenido nuevo de la vista. Desde esto Es una vista con creces hecha a la medida, fue ms fcil de hacer esto en cdigo que en XML. El mtodo calculateUsedTiles (), cul est definido en la Seccin 4.4, Lo El descanso de la Historia, en pgina 90, usa las reglas de Sudoku para resolver fuera, para Cada teja en el nueve por nueve la cuadrcula, cules nmeros no es vlida para lo La teja porque aparezcan a otro sitio en la direccin horizontal o vertical O en el tres por tres subcuadriculado. sta es una actividad, as es que necesitamos registrarla en AndroidManifest.xml:
Download Sudokuv2/AndroidManifest.xml

<activity android:name=".Game" android:label="@string/game_title" />

We also need to add a few more string resources to res/values/strings.xml:


Download Sudokuv2/res/values/strings.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 Despus necesitamos definir la clase PuzzleView. En lugar de utilizar a un XML El layout, esta vez nos dej hacerlo enteramente en Java. Aqu est el contorno:
Download Sudokuv2/src/org/example/sudoku/PuzzleView.java

package org.example.sudoku; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Paint.FontMetrics; import android.graphics.Paint.Style; import android.util.Log; import android.view.KeyEvent;

GARCIA JIM
import android.view.MotionEvent; import android.view.View; import android.view.animation.AnimationUtils; public class PuzzleView extends View { private static final String TAG = "Sudoku" ; private final Game game; public PuzzleView(Context context) { super(context); this.game = (Game) context; setFocusable(true); setFocusableInTouchMode(true); } // ... }

En el constructor mantenemos una referencia para la clase de Juego y nos sedimentamos lo La opcin para permitir aporte del usuario en la vista. Dentro de PuzzleView, necesitamos Implemente el mtodo onSizeChanged (). Esto es dado el nombre por la vista es El creado y el Androide saben qu tan grande todo es. Download Sudokuv2/src/org/example/sudoku/PuzzleView.java private float width; // width of one tile private float height; // height of one tile private int selX; // X index of selection private int selY; // Y index of selection private final Rect selRect = new Rect(); @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { width = w / 9f; height = h / 9f; getRect(selX, selY, selRect); Log.d(TAG, "onSizeChanged: width " + width + ", height " + height); super.onSizeChanged(w, h, oldw, oldh); } private void getRect(int x, int y, Rect rect) { rect.set((int) (x * width), (int) (y * height), (int) (x * width + width), (int) (y * height + height)); }

GARCIA JIM
Utilizamos a onSizeChanged () para calcular el tamao de cada teja en la pantalla (1/9th de la anchura total de vista y la altura). Noto sta es una coma flotante El nmero, tan es posible que pudisemos sacar en limpio un nmero fraccionado De pixeles. el selRect est un rectngulo al que usaremos posteriormente a seguirle la pista lo El cursor de seleccin. En este punto hemos creado una vista para el acertijo, y sabemos cmo grande Es. El siguiente paso es dibujar las lneas cuadriculadas que ponen aparte las tejas adelante El pizarrn Drawing the Board El androide llama el mtodo onDraw de una vista () cada tiempo cualquier parte de la vista Necesita ponrsele al corriente. Para simplificar cosas, onDraw () pretende que usted es Recreando la pantalla entera de la nada. En realidad, usted puede dibujar Slo una porcin pequea de la vista tan definido por el clip de la lona El rectngulo. El androide se encarga de hacer el esquileo para usted. Comience por definir algunos colores nuevos con los que jugar en res values/colors.xml:
Download Sudokuv2/res/values/colors.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 bsico para onDraw ():


Download Sudokuv2/src/org/example/sudoku/PuzzleView.java

@Override protected void onDraw(Canvas canvas) { // Draw the background... Paint background = new Paint(); background.setColor(getResources().getColor( R.color.puzzle_background)); canvas.drawRect(0, 0, getWidth(), getHeight(), background); // Draw the board... // Draw the numbers... // Draw the hints... // Draw the selection... }

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

GARCIA JIM

El cdigo destina tres colores diferentes para las lneas cuadriculadas: Un color ligero Entre cada teja, un color moreno entre el tres por tres bloques, y Un color de punto de inters a cargo del borde de cada teja para hacerles a ellos verse Como tengan un poco de profundidad. La orden en la cual las lneas se trazan es Importante, desde lneas dibujadas ms tarde se trazar sobre la parte superior de ms temprano Las lneas. Usted puede ver lo que como ste se ver en Figura 4.3, en lo siguiente La pgina. Despus, necesitamos que algunos nmeros entren en esas lneas. Dibujando los Nmeros El siguiente cdigo dibuja los nmeros de acertijo encima de las tejas. Lo La parte tramposa aqu situa cada nmero y dimensionado as es que va En el centro exacto de su teja. Download Sudokuv2/src/org/example/sudoku/PuzzleView.java // Draw the numbers... // Define color and style for numbers Paint foreground = new Paint(Paint.ANTI_ALIAS_FLAG);

Figura 4.3: Dibujando las lneas cuadriculadas con tres colores para crear un efecto
foreground.setColor(getResources().getColor( R.color.puzzle_foreground)); foreground.setStyle(Style.FILL); foreground.setTextSize(height * 0.75f); foreground.setTextScaleX(width / height); foreground.setTextAlign(Paint.Align.CENTER); // Draw the number in the center of the tile FontMetrics fm = foreground.getFontMetrics();

GARCIA JIM
// Centering in X: use alignment (and X at midpoint) float x = width / 2; // Centering in Y: measure ascent/descent first float y = height / 2 - (fm.ascent + fm.descent) / 2; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { canvas.drawText(this.game.getTileString(i, j), i * width + x, j * height + y, foreground); } }

Figura 4.4: Centrando los nmeros dentro de las tejas Llamamos el mtodo getTileString (definidos en la Seccin 4.4, El Resto de () La historia, en pgina 90) para averiguar qu nmeros al despliegue. Para hacer clculos lo El tamao de los nmeros, establecemos la altura del carcter de imprenta para tres cuartos la altura De la teja, y establece la proporcin dimensional para equivaler al aspecto de la teja La proporcin. No podemos usar tamaos de pixel absoluto o del punto porque queremos lo Programe trabajar en cualquier resolucin. Para determinar la posicin de cada nmero, le centramos en ambos la x Y las dimensiones y. La direccin de la x es fcil _ simplemente divide la anchura de la teja A las 2. Sino por la direccin de la y, tenemos que ajustar la posicin de puesta en marcha Hacia abajo un a fin de que el punto medio de la teja ser el punto medio Del nmero en lugar de su lnea de fondo. Usamos la biblioteca de grficos La clase FontMetrics a decir cunto espacio vertical la carta tomar adentro El total, y luego dividimos eso por la mitad para obtener el ajuste. Usted puede ver Los resultados en Figura 4.4. Eso se encarga de exhibir los nmeros de puesta en marcha del acertijo (los givens). El siguiente paso es dejar al jugador entrar a sus suposiciones para todo el Los espacios en blanco.

GARCIA JIM
4.3 Manejando Aporte Una diferencia en Androide programando _ a distincin de, oye, iPhone La programacin _ es que los telfonos Android vienen en muchas formas y tamaos Y tiene una coleccin variada de mtodos de aporte. Podran tener un teclado, uno D-pad, una pantalla tctil, una bola rastreadora, o alguna combinacin de estos. Un buen programa del Androide, por consiguiente, necesita estar listo a soportar cualquier cosa El hardware de aporte est disponible, as como necesita estar listo a soportar Cualquier resolucin de la pantalla. Definiendo y Actualizar la Seleccin Primero vamos a implementar un cursor pequeo que muestra al jugador Cul teja est actualmente seleccionada. La teja seleccionada es lo nico que har Sea modificado cuando el jugador entra en un nmero. Este cdigo dibujar lo La seleccin en onDraw (): Download Sudokuv2/src/org/example/sudoku/PuzzleView.java // Draw the selection... Log.d(TAG, "selRect=" + selRect); Paint selected = new Paint(); selected.setColor(getResources().getColor( R.color.puzzle_selected)); canvas.drawRect(selRect, selected); Usamos el rectngulo de seleccin calculado ms temprano en onSizeChanged () para Dibuje un color mezclado en alfa encima de la teja seleccionada. Despus proveemos una forma para conmover la seleccin pasando sobre la disposicin del onKey Abajo de () el mtodo: Download Sudokuv2/src/org/example/sudoku/PuzzleView.java @Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.d(TAG, "onKeyDown: keycode=" + keyCode + ", event=" + event); switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: select(selX, selY - 1); break; case KeyEvent.KEYCODE_DPAD_DOWN: select(selX, selY + 1); break;

GARCIA JIM

Figura 4.5: Dibujando y conmoviendo la seleccin case KeyEvent.KEYCODE_DPAD_LEFT: select(selX - 1, selY); break; case KeyEvent.KEYCODE_DPAD_RIGHT: select(selX + 1, selY); break; default: return super.onKeyDown(keyCode, event); } return true; } Si el usuario tiene un cojincillo direccional (D-Pad) y ellos presionan lo levantado, abajo de El botn izquierdo, o correcto, nosotros la llamada selecta () para mover el cursor de seleccin en eso La direccin. Cmo acerca de una bola rastreadora? Podramos pasar sobre la disposicin del mtodo onTrackballEvent () Pero resulta que si usted no maneja Eventos de la bola rastreadora, voluntad del Androide Tradzcalos a Eventos de D-Pad automticamente. Por consiguiente, podemos salir Eso fuera para este ejemplo. Dentro del mtodo de primera calidad (), calculamos la y y x nueva coordinadas La seleccin y luego vuelva a usar a getRect () a calcular la seleccin nueva El rectngulo. Download Sudokuv2/src/org/example/sudoku/PuzzleView.java private void select(int x, int y) { invalidate(selRect); selX = Math.min(Math.max(x, 0), 8); selY = Math.min(Math.max(y, 0), 8); getRect(selX, selY, selRect); invalidate(selRect);

GARCIA JIM
Me fijo las llamadas de dos a invalidar (). El primero le dice a Android que lo El rea al amparo del rectngulo viejo de seleccin (en izquierda de Figura 4.5, En la pgina precedente) las necesidades a ser vueltas a dibujar. El segundo invalida () llamada Dice que el rea nuevo (en la derecha de la figura) de seleccin necesita ser Vuelto a dibujar tambin. Realmente no dibujamos nada aqu. ste es un punto importante: Nunca llame cualquier dibujo en el que las funciones deducen excepcin El mtodo onDraw (). En lugar de eso, usted acostumbra lo invalida () mtodo para marcar Los rectngulos tan sucio. El gerente de la ventana combinar todos los rectngulos sucios En algn punto en el futuro y la llamada onDraw otra vez para usted (). Lo Los rectngulos sucios se convierten en la regin del clip, as es que la pantalla actualiza es optimizado Para slo esas reas que cambian. Ahora proveamos una forma que el jugador debe entrar en un nmero nuevo en lo La teja seleccionada. Entrando en Nmeros Para manejar aporte del teclado, justamente le aadimos algunos casos ms al onKey Abajo de (0 o la manera del espacio se borran () el mtodo para los nmeros 0 a travs de 9 El nmero). Download Sudokuv2/src/org/example/sudoku/PuzzleView.java case KeyEvent.KEYCODE_0: case KeyEvent.KEYCODE_SPACE: setSelectedTile(0); break; case KeyEvent.KEYCODE_1: setSelectedTile(1); break; case KeyEvent.KEYCODE_2: setSelectedTile(2); break; case KeyEvent.KEYCODE_3: setSelectedTile(3); break; case KeyEvent.KEYCODE_4: setSelectedTile(4); break; case KeyEvent.KEYCODE_5: setSelectedTile(5); break; case KeyEvent.KEYCODE_6: setSelectedTile(6); break; case KeyEvent.KEYCODE_7: setSelectedTile(7); break; case KeyEvent.KEYCODE_8: setSelectedTile(8); break; case KeyEvent.KEYCODE_9: setSelectedTile(9); break; case KeyEvent.KEYCODE_ENTER: case KeyEvent.KEYCODE_DPAD_CENTER: game.showKeypadOrError(selX, selY); break;

Para soportar la D-Pad, revisamos en busca de la Interlineacin o botn central de D-Pad En onKeyDown () y hgale fortalecer un teclado pequeo que deja al usuario hacer una seleccin Cul numera para colocar. Para el toque, pasamos sobre la disposicin del mtodo onTouchEvent () y mostramos lo mismo El teclado pequeo, cul estar definido ms tarde: Download Sudokuv2/src/org/example/sudoku/PuzzleView.java @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() != MotionEvent.ACTION_DOWN) return super.onTouchEvent(event); select((int) (event.getX() / width), (int) (event.getY() / height)); game.showKeypadOrError(selX, selY); Log.d(TAG, "onTouchEvent: x " + selX + ", y " + selY); return true; }

GARCIA JIM
Finalmente, todas las carreteras llevarn de regreso a una llamada para setSelectedTile () para el cambio El nmero en una teja: Download Sudokuv2/src/org/example/sudoku/PuzzleView.java public void setSelectedTile(int tile) { if (game.setTileIfValid(selX, selY, tile)) { invalidate();// may change hints } else { // Number is not valid for this tile Log.d(TAG, "setSelectedTile: invalid: " + tile); } } Los mtodos showKeypadOrError () y setTileIfValid () estarn definidos adentro Seccin 4.4, El Resto de Historia, en pgina 90. Note la llamada para invalidar () sin parmetros. Eso marca el todo Filtre tan sucio, lo cual viola mi consejo ms temprano! Sin embargo, en esto El caso, es menester porque cualquier nmeros nuevos sumados o removieron fuerza Cambie los indicios que estamos a punto de implementar en la siguiente seccin. Sumando Indicios Cmo la lata que ayudamos el jugador a expulsar un poco fuera solucionando el acertijo entero Para ellos? Cmo acerca de si dibujamos el trasfondo de cada teja diferentemente A merced de cuntas maniobras posibles tiene. Adale esto a onDraw () Antes de provocar la seleccin:
Download Sudokuv2/src/org/example/sudoku/PuzzleView.java // Draw the hints... // Pick a hint color based on #moves left Paint hint = new Paint(); int c[] = { getResources().getColor(R.color.puzzle_hint_0), getResources().getColor(R.color.puzzle_hint_1), getResources().getColor(R.color.puzzle_hint_2), }; Rect r = new Rect(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { int movesleft = 9 - game.getUsedTiles(i, j).length; if (movesleft < c.length) { getRect(i, j, r); hint.setColor(c[movesleft]); canvas.drawRect(r, hint); } } }

GARCIA JIM
Destinamos a tres estados para el cero, un, y dos maniobras posibles. Si all Son maniobras de cero, eso quiere decir que el jugador ha hecho algo incorrectamente y Necesita volver hacia atrs. El resultado se parecer a la Figura 4.6, en la siguiente pgina. 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 nmero obviamente invlido, tan uno Numere eso ya aparece en el tres por tres bloque? Simplemente por diversin, Hagamos la pantalla contonearnos de ac para all cuando hacen eso. Primero nosotros Adale una llamada al caso invlido de nmero en setSelectedTile ().

Figura 4.6: Las Tiles son resaltado basado de adelante cuntas los valores posibles La teja puede tener. Download Sudokuv2/src/org/example/sudoku/PuzzleView.java // Number is not valid for this tile Log.d(TAG, "setSelectedTile: invalid: " + tile); startAnimation(AnimationUtils.loadAnimation(game, R.anim.shake)); Esto carga y corre un recurso designado R.anim.shake, definido en res anim/ Shake.xml, eso sacude la pantalla para 1,000 milisegundos (1 segundo) por ah 10 pixeles de un lado para otro.
Download Sudokuv2/res/anim/shake.xml

<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="10" android:duration="1000" android:interpolator="@anim/cycle_7" />

GARCIA JIM
El nmero de por para correr la animacin y la velocidad y la aceleracin De la animacin es controlado por un interpolador de animacin Definido en XML.
Download Sudokuv2/res/anim/cycle_7.xml <?xml version="1.0" encoding="utf-8"?> <cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:cycles="7" />

Esto particular causar que la animacin ser repetido siete veces. 4.4 El Resto de Historia Ahora regresemos y la corbata arriba de algunos cabos sueltos, comenzando con el Teclado Pequeo La clase. Estas pedazos son necesarias que el programa compile y Opere pero no tenga nada que ver con grficos. Sintase en libertad para saltarse delante para Seccin 4.5, Haciendo Ms Mejoras, en pgina 99 si Ud. quiere. Creando el Teclado Pequeo El teclado pequeo es conveniente para telfonos que no tienen teclados. Exhibe Una cuadrcula de los nmeros 1 a travs de 9 en una actividad encima de los que aparece El acertijo. El propsito entero de la ventana de dilogo del teclado pequeo es regresar uno El nmero seleccionado por el jugador. Aqu est el layout de la interfaz de usuario de / keypad.xml del / layout de res:

Download Sudokuv2/res/layout/keypad.xml

<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.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" >

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>

Despus definamos la clase del Teclado Pequeo. Aqu est el contorno:


Download Sudokuv2/src/org/example/sudoku/Keypad.java

package org.example.sudoku; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; public class Keypad extends Dialog { protected static final String TAG = "Sudoku" ; private final View keys[] = new View[9]; private View keypad; private final int useds[]; private final PuzzleView puzzleView; public Keypad(Context context, int useds[], PuzzleView puzzleView) { super(context); this.useds = useds; this.puzzleView = puzzleView; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle(R.string.keypad_title); setContentView(R.layout.keypad); findViews();

GARCIA JIM
for (int element : useds) { if (element != 0) keys[element - 1].setVisibility(View.INVISIBLE); } setListeners(); } // ... }

Si un nmero particular no es vlido (por ejemplo, el mismo nmero Ya aparece en esa fila), luego hace el nmero invisible adentro La cuadrcula as es que el jugador no lo pueda seleccionar (vea Figura 4.7, en lo siguiente La pgina). El mtodo findViews () va a traer y ahorra las vistas para todo el El teclado pequeo teclea y la ventana principal del teclado pequeo:
Download Sudokuv2/src/org/example/sudoku/Keypad.java private void findViews() { keypad = findViewById(R.id.keypad); keys[0] = findViewById(R.id.keypad_1); keys[1] = findViewById(R.id.keypad_2); keys[2] = findViewById(R.id.keypad_3); keys[3] = findViewById(R.id.keypad_4); keys[4] = findViewById(R.id.keypad_5); keys[5] = findViewById(R.id.keypad_6); keys[6] = findViewById(R.id.keypad_7); keys[7] = findViewById(R.id.keypad_8); keys[8] = findViewById(R.id.keypad_9); }

Los lazos setListeners () a travs de todas las llaves del teclado pequeo y los sets un oyente para Cada uno. Tambin coloca a un oyente para la ventana principal del teclado pequeo:
Download Sudokuv2/src/org/example/sudoku/Keypad.java private void setListeners() { for (int i = 0; i < keys.length; i++) { final int t = i + 1; keys[i].setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { returnResult(t); }}); }

Figura 4.7: Los valores invlidos estn escondidos en la vista del teclado pequeo.
keypad.setOnClickListener(new View. OnClickListener(){ public void onClick(View v) { returnResult(0); }}); }

GARCIA JIM
Cuando el jugador selecciona uno de los botones en el teclado pequeo, llama por telfono El mtodo returnResult () con el nmero para ese botn. Si el jugador Selecciona un lugar que no tiene un botn, luego returnResult () es designado Con un cero, indicando la teja debera ser borrado. OnKeyDown () es designado cuando el jugador usa el teclado para entrar uno El nmero:
Download Sudokuv2/src/org/example/sudoku/Keypad.java

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { int tile = 0; switch (keyCode) { case KeyEvent.KEYCODE_0: case KeyEvent.KEYCODE_SPACE: tile = 0; break; case KeyEvent.KEYCODE_1: tile = 1; break; case KeyEvent.KEYCODE_2: tile = 2; break; case KeyEvent.KEYCODE_3: tile = 3; break; case KeyEvent.KEYCODE_4: tile = 4; break; case KeyEvent.KEYCODE_5: tile = 5; break; case KeyEvent.KEYCODE_6: tile = 6; break; case KeyEvent.KEYCODE_7: tile = 7; break; case KeyEvent.KEYCODE_8: tile = 8; break; case KeyEvent.KEYCODE_9: tile = 9; break; default: return super.onKeyDown(keyCode, event); } if (isValid(tile)) { returnResult(tile); } return true; }

Si el nmero vale para la teja actual, luego llama a returnResult (); De otra manera, el teclazo est ignorado. El mtodo isValid () hace una consulta para ver si el nmero dado es vlido para La posicin actual:
Download Sudokuv2/src/org/example/sudoku/Keypad.java

private boolean isValid(int tile) { for (int t : useds) { if (tile == t) return false; } return true; }

GARCIA JIM
Si aparece en el conjunto imponente usado, luego no es vlido porque lo mismo El nmero est ya usado en la fila actual, columna, o bloque. El mtodo returnResult () se siente llamado a devolver el nmero seleccionado para lo Llamando actividad
Download Sudokuv2/src/org/example/sudoku/Keypad.java

/** Return the chosen tile to the caller */ private void returnResult(int tile) { puzzleView.setSelectedTile(tile); dismiss(); }

Llamamos el mtodo PuzzleView.setSelectedTile () a cambiar la corriente del acertijo La teja. Lo descarta llamada termina la ventana de dilogo del Teclado Pequeo. Ahora que tenemos la actividad, llammoslo en la clase de Juego y recuperemos El resultado:
Download Sudokuv2/src/org/example/sudoku/Game.java /** Open the keypad if there are any valid moves */ protected void showKeypadOrError(int x, int y) { int tiles[] = getUsedTiles(x, y); if (tiles.length == 9) { Toast toast = Toast.makeText(this, R.string.no_moves_label, Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } else { Log.d(TAG, "showKeypad: used=" + toPuzzleString(tiles)); Dialog v = new Keypad(this, tiles, puzzleView); v.show(); } }

Para decidir cules nmeros son posibles, pasamos el Teclado Pequeo una cuerda adentro El Extrarea de datos conteniendo todos los nmeros que ya han sido Usado. Implementando la Lgica de Juego El resto de cdigo en Game.java se preocupa por la lgica de lo El juego, en particular con determinar cules es y no es maniobras vlidas De acuerdo con las reglas. El mtodo setTileIfValid () es una parte crucial de eso. Dadas una x y y sitan y el valor nuevo de una teja, cambia la teja Slo si el valor previsto es vlido.
Download Sudokuv2/src/org/example/sudoku/Game.java

/** Change the tile only if it's a valid move */ protected boolean setTileIfValid(int x, int y, int value) { int tiles[] = getUsedTiles(x, y); if (value != 0) { for (int tile : tiles) {

GARCIA JIM
if (tile == value) return false; } } setTile(x, y, value); calculateUsedTiles(); return true; }

Para detectar maniobras vlidas, creamos un conjunto imponente para cada teja en la cuadrcula. Para Cada posicin, mantiene una lista de lleno en tejas que son actualmente visibles De esa posicin. Si un nmero aparece en la lista, luego no ser Vlido para la teja actual. El mtodo getUsedTiles () recupera esa lista para Una posicin dada de la tiles
Download Sudokuv2/src/org/example/sudoku/Game.java

/** Cache of used tiles */ private final int used[][][] = new int[9][9][]; /** Return cached used tiles visible from the given coords */ protected int[] getUsedTiles(int x, int y) { return used[x][y]; }:

El conjunto imponente de tejas usadas est algo caro para computar, as es que escondemos en reserva El conjunto imponente y lo calcula de nuevo slo cuando necesario llamando por telfono haga clculos UsedTiles ():
Download Sudokuv2/src/org/example/sudoku/Game.java /** Compute the two dimensional array of used tiles */ private void calculateUsedTiles() { for (int x = 0; x < 9; x++) { for (int y = 0; y < 9; y++) { used[x][y] = calculateUsedTiles(x, y); // Log.d(TAG, "used[" + x + "][" + y + "] = " // + toPuzzleString(used[x][y])); } } }

CalculateUsedTiles () simplemente llamada calculateUsedTiles (la x, y) en cada posicin En el nueve por nueve cuadriculado:
Download Sudokuv2/src/org/example/sudoku/Game.java Line 1 /** - private - int - //

Compute the used tiles visible from this position */ int[] calculateUsedTiles(int x, int y) {

c[] = new int[9];

horizontal (int i = 0; i < 9; i++) {

5 for - if

(i == y)

GARCIA JIM
- continue; - int - if

t = getTile(x, i);

(t != 0) - 1] = t;

10 c[t -} - //

vertical (int i = 0; i < 9; i++) {

- for - if

(i == x)

15 continue;

- int - if

t = getTile(i, y);

(t != 0) - 1] = t;

- c[t -} 20 // - int - int - for - for 25 if

same cell block startx = (x / 3) * 3; starty = (y / 3) * 3; (int i = startx; i < startx + 3; i++) { (int j = starty; j < starty + 3; j++) { (i == x && j == y)

- continue; - int - if

t = getTile(i, j);

(t != 0) - 1] = t;

- c[t 30 } -} - //

compress nused = 0; (int t : c) { (t != 0)

- int - for 35 if

- nused++; -} - int

c1[] = new int[nused]; = 0;

- nused 40 for - if

(int t : c) {

(t != 0) = t;

- c1[nused++] -} - return 45 }

c1;

Comenzamos con un montn de nueve ceros. En lnea 5, comprobamos todas las tejas adelante La misma fila horizontal como la teja actual, y si una teja son ocupadas, nosotros Rellene su nmero en el conjunto imponente: En lnea 13, hacemos lo propio para todas las tejas en la misma vertical La columna, y en lnea 21, correspondemos para tejas en el tres a las tres Bloquese. El ltimo paso, iniciando en lnea 33, es condensar los ceros fuera de lo

GARCIA JIM
El conjunto imponente antes de nosotros el regreso eso. Hacemos as de as que array.length puede ser usado para Rpidamente diga todo cuntas tejas usadas son visibles de la posicin actual. Miscelneo Aqu hay algunas otras funciones de utilidad y otras variables tan redondas fuera de lo La implementacin. easyPuzzle, mediumPuzzle, y hardPuzzle son nuestro hardcoded Sudoku se intriga para niveles fciles, medianos de dificultad, y duros,
Download Sudokuv2/src/org/example/sudoku/Game.java

private final String easyPuzzle = "360000000004230800000004200" + "070460003820000014500013020" + "001900000007048300000000045" ; private final String mediumPuzzle = "650000070000506000014000005" + "007009000002314700000700800" + "500000630000201000030000097" ; private final String hardPuzzle = "009000000080605020501078000" + "000000700706040102004000000" + "000720903090301080000000600" ;

GetPuzzle () simplemente toma un nivel de dificultad y devuelve un acertijo:


Download Sudokuv2/src/org/example/sudoku/Game.java

/** Given a difficulty level, come up with a new puzzle */ private int[] getPuzzle(int diff) { String puz; // TODO: Continue last game switch (diff) { case DIFFICULTY_HARD: puz = hardPuzzle; break; case DIFFICULTY_MEDIUM: puz = mediumPuzzle; break; case DIFFICULTY_EASY: default: puz = easyPuzzle; break; } return fromPuzzleString(puz); }

Ms tarde cambiaremos a getPuzzle () para implementar uno contina funcin. ToPuzzleString () convierte un acertijo de un montn de enteros a una cuerda. FromPuzzleString () hace lo contrario.
Download Sudokuv2/src/org/example/sudoku/Game.java

/** Convert an array into a puzzle string */ static private String toPuzzleString(int[] puz) {

GARCIA JIM
StringBuilder buf = new StringBuilder(); for (int element : puz) { buf.append(element); } return buf.toString(); } /** Convert a puzzle string into an array */ static protected int[] fromPuzzleString(String string) { int[] puz = new int[string.length()]; for (int i = 0; i < puz.length; i++) { puz[i] = string.charAt(i) - '0' ; } return puz; }

El mtodo getTile () toma posiciones de la x y y y devuelve el nmero Actualmente ocupando esa teja. Si es cero, eso quiere decir que la teja est en blanco. Download Sudokuv2/src/org/example/sudoku/Game.java /** Return the tile at the given coordinates */ private int getTile(int x, int y) { return puzzle[y * 9 + x]; } /** Change the tile at the given coordinates */ private void setTile(int x, int y, int value) { puzzle[y * 9 + x] = value; } GetTileString () es usado al exhibir una teja. Devolver ya sea una cuerda Con el valor de la teja o una cadena vaca si la teja estuviera en blanco.
Download Sudokuv2/src/org/example/sudoku/Game.java

/** Return a string for the tile at the given coordinates */ protected String getTileString(int x, int y) { int v = getTile(x, y); if (v == 0) return "" ; else return String.valueOf(v); }

Una vez todas estas pedazos estn en el lugar, usted debera tener a un Sudoku tocable El juego. Haga la prueba que para asegurarse surte efecto. Al igual que con cualquier cdigo, sin embargo, hay Aljese para la mejora.

GARCIA JIM
4.5 Haciendo Ms Mejoras Aunque el cdigo presentado en este captulo funciona aceptablemente para Un juego Sudoku, programas ms complicados probablemente necesitar ser ms Cuidadosamente escrito para apretar la ltima gota de funcin fuera Del dispositivo. En particular, el mtodo onDraw () es un mismo performancecritical El pedazo de cdigo, as es que es mejor hacer lo menos posible all. Aqu hay algunas ideas para apresurar la marcha de este mtodo: " Si es posible, evite hacer cualquier dotaciones del objeto en el mtodo OnDraw (). " Las cosas Prefetch como las constantes de color a otro sitio (por ejemplo, adentro El constructor de la vista). " Cree sus objetos Paint arriba de parte delantera, y justamente use instancias existentes En onDraw (). " Pues los valores acostumbraron las veces mltiples, como la anchura regres por ah GetWidth (), recupere el valor al principio del mtodo y Luego acceda a eso de su copia local. Como un ms ejercicio para el lector, le aliento a pensar cmo Usted podra hacer el juego Sudoku grficamente ms rico. Por ejemplo, usted Podran sumar algunos fuegos artificiales cuando el jugador soluciona el acertijo o marca lo Las tejas dan vueltas como Vanna White. Un trasfondo en movimiento atrs El acertijo podra ser interesante. Deje su imaginacin salirse de control. Si usted Quiera hacer un producto de primera clase, los toques como ste pueden sumar espritu vigoroso para Uno de otra manera oferta comn. En el Captulo 5, Multimedia, en la siguiente pgina, realzaremos el programa Con una msica pequea de estado de nimo, y en el Captulo 6, Almacenando Datos Locales, En pgina 116, veremos cmo recordar el estado de acertijo y finalmente Implemente ese botn Continue. 4.6 de Avances Rpidos En este captulo, justamente rascamos la superficie de los grficos de Androide Las capacidades. La biblioteca natal del 2D es muy grande, para usted es realmente Escribir sus programas, vaya de seguro a aprovecharse de los tooltips, autoterminacin, Y Javadoc provey por el plug-in del Eclipse del Androide. Lo La documentacin en lnea para el paquete del android.graphics3 entra mucho Ms detalle si usted lo necesitara. Si su programa necesita grficos ms adelantados, usted puede querer mirar Delante un Captulo mordido y ledo 10, 3D Graphics en OpenGL, en pgina 191. All usted encontrar informacin en relacin a la forma de usar grficos 3D del Androide La biblioteca, que se basa en el estndar OpenGL ES. De otra manera, recurra a El siguiente captulo para una introduccin para el mundo maravilloso de Androide El audio y el video.

GARCIA JIM

Captulo 5 Multimedia
Recuerdo esos anuncios de la televisin Apple con las personas de la silueta bailando Salvajemente para la pulsacin de sus iPods? Esa es el tipo de excitacin Usted quiere sus productos para generate.1 Music, los efectos de sonido, y el video Pueden hacer sus programas ms immersive y cautivador que texto y Los grficos a solas. Este captulo le mostrar cmo aadirle multimedios a su Android La aplicacin. Usted no puede tener a sus usuarios haciendo cabriolas en los pasillos, pero si Usted lo hace correctamente, usted al menos puede poner sonrisas en sus caras. 5.1 Jugando con Audio Fue una noche oscura y tempestuosa.... All se vuelve el disparo que empieza, y Partieron.... El populacho se sale de control como el Estado hunde un tres puntero con Un segundo quedando.... Las pistas audias permean el ambiente y establecen el tiempo para nuestras emociones. Piense acerca de sonido tan otra forma de meterse en la cabeza de su usuario. Simplemente Como usted use grficos en el despliegue para transportar alguna informacin para lo El usuario, usted puede acostumbrar audio para respaldarlo eso y reforzarlo. El androide soporta salida del sonido y de msica a travs del MediaPlayer La clase en el android.media package.2 Nos Dej probarlo con un ejemplo simple Eso juega sonidos cuando usted pulsa una tecla en el teclado o D-Pad.

GARCIA JIM

Figura 5.1: guardando efectos de sonido en un formato comprimido que Android puede La obra teatral. Comenzaremos por crear un "hola, Androide" proyecto, usar lo siguiente Los parmetros en el dilogo Nuevo de Proyecto del Androide boxean: Project name: Audio Build Target: Android 1.6 Application name: Audio Package name: org.example.audio Create Activity: Audio Despus necesitaremos que algunos sonidos jueguen. Para este ejemplo, 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. Despus de entender bien los niveles cuerdos, registr a cada uno Suene, File seleccionado > Salvo Tan ... del men, dio un clic sobre el Vuelto ... Abotone, y seleccionado un Androide del formato puede reconocer (vea Figura 5.1). Usted puede encontrar todos los archivos en buen estado y cdigo de la fuente para estos ejemplos adelante El sitio Web del libro.

GARCIA JIM

Figura 5.2: Copie archivos audios en los res directorio / directorio de su proyecto. Copie los archivos en buen estado en los res rawdirectory de su proyecto. Como usted Recuerde de Seccin 2.4, Usando Recursos, en pgina 37, simplemente copindose uno El archivo en el directorio de res causa el Eclipse del Androide con enchufe para definir Un smbolo Java para usted en la clase de la R. Cuando usted termina, el proyecto Debera parecerse a la Figura 5.2. Ahora es hora de complementar la actividad Audia. Primero declaramos a un MediaPlayer nuevo La instancia para cada sonido e inicializa las instancias en el onCreate ( ) El mtodo.

GARCIA JIM

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

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

GARCIA JIM
La primera parte del mtodo selecciona un Transmisor de Medios basado en el cual la llave Usted presion. Entonces en lnea 36, llamamos el mtodo seekTo al que darle cuerda () El sonido y el mtodo de principio () para comenzar a jugarlos. El mtodo de principio () Es asincrnico, as es que regresa inmediatamente a pesar de cunto tiempo lo Sondee hormas. Si Ud. quiere, usted puede utilizar a setOnCompletionListener () para estar notificado Cuando el clip est acabado. Si usted corre el programa ahora y luego presiona una de las llaves (por ejemplo, La tecla ENTER o la D-Pad central teclea), usted debera or un sonido. Si usted No oiga nada, compruebe su control del volumen (no se ra), o mire en Los mensajes de correccin de errores en el LogCat View.3 Para nuestro siguiente truco, jugaremos una pelcula usando slo una lnea de cdigo. 5.2 Jugando Video El video es ms que simplemente un montn de cuadros mostrado justo despus Otro. Es cuerdo igualmente, y el sonido tiene que estar estrechamente sincronizado Con las imgenes. Qu Clase de Video Puede Observar Usted en Androide? Aqu hay cul es oficialmente soportado: " MP4 (el punto bajo MPEG-4 mordi tasa) " H.263 (3GP) " H.264 (AVC) A partir de Androide 1.5, H.263 es el formato de vdeo recomendable Porque cada plataforma del hardware lo soporta y eso es relativamente Eficiente para codificar y descifrar. Es tambin compatible Otros dispositivos como el iPhone. Usted puede usar un programa como QuickTime Profesional para convertir video de un formato a otro. Use la resolucin mnima y la tasa en bits para la que usted usa Ahorre espacio, pero no le establezca as es que muja que usted sacrifica calidad. MediaPlayer del androide que la clase trabaja con video en la misma forma que hace Francamente audio. La nica diferencia es que usted necesita crear una Superficie para El jugador a soler provocar las imgenes. Usted puede usar el principio () y puede detenerse () Los mtodos para controlar sonido pregrabado. No voy a mostrarle otro ejemplo MediaPlayer, sin embargo, porque Hay una forma ms simple para incrustar videos en su aplicacin: Lo La clase VideoView. Para demostrar eso, cree un proyecto del Androide nuevo llamado El video usando estos parmetros:
Project name: Video Build Target: Android 1.6 Application name: Video Package name: org.example.video Create Activity: Video

GARCIA JIM
Cambie el layout (/ el layout res / main.xml) para esto:
Download Videov1/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.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.java, y cambie el mtodo onCreate () como sigue:


Download Videov1/src/org/example/video/Video.java

package org.example.video; import android.app.Activity; import android.os.Bundle; import android.widget.VideoView; public class Video extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Fill view from resource setContentView(R.layout.main); VideoView video = (VideoView) findViewById(R.id.video); // Load and start the movie video.setVideoPath("/data/samplevideo.3gp" ); video.start(); } }

El mtodo setVideoPath () abre el archivo, lo dimensiona a su envase mientras Conservando la proporcin dimensional, y comienza a jugarlo. Ahora usted necesita tele-enviar algo para jugar. Para hacer eso, correr lo siguiente La orden:
C:\> adb push c:\code\samplevideo.3gp /data/samplevideo.3gp 1649 KB/s (369870 bytes in 0.219s)

Usted puede encontrar samplevideo.3gp en el paquete de descarga para este libro, o Usted puede crear uno suyo. El directorio usado aqu (/ los datos) es justo Para los propsitos ilustrativos y realmente no debera servir para archivos de los medios de comunicacin. Slo surtir efecto en el emulador porque ese directorio est protegido adelante Los dispositivos verdaderos. Reparo en que Android no parece importarle qu extensin usted da lo El archivo. Usted tambin puede tele-enviar y puede hacer un download de archivos en proceso de desaparicin con el Archivo La vista del explorador en la perspectiva del Androide, pero yo encuentra la lnea de comando Para costar menos esfuerzo pues a cosas simples le gusta esto.

GARCIA JIM

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

GARCIA JIM
Por qu Eso Vuelve a Arrancar el Video Cundo Rotate el Despliegue? El androide supone en rebelda que su programa no sabe nada Acerca de rotaciones de la pantalla. Adquirir recurso posible cambia, El androide desbarata y recrea su actividad de la nada. Eso Quiero decir que onCreate () volvi a llamar, que quiere decir que el video es Iniciado otra vez (como este ejemplo est actualmente escrito). Este comportamiento estar bien para 90 por ciento de todas las aplicaciones, Tan la mayora de desarrolladores no tendrn que preocuparse por eso. Est parejo Una forma til para probar su ciclo biolgico aplicativo y statesaving/ Restaurando cdigo (vea Seccin 2.2, es Viva!, En pgina 32). Sin embargo, hay un par de formas para ser ms listos y optimizar La transicin. La forma ms simple es implementar a onRetainNonConfigurationInstance ( ) En su actividad para guardar un poco de datos que sern conservados A travs de las llamadas para onDestroy () y onCreate (). Cuando usted Regrese, usted utiliza a getLastNonConfigurationInstance () en lo La instancia nueva de su actividad para recobrar esa informacin. Usted Puede conservar cualquier cosa, aun referencias para su intento actual y Correr ensarta. La forma ms complicada es utilizar al androide:Los configChanges La propiedad en AndroidManifest.xml para dar a saber a Android que Los cambios que usted puede manejar. Por ejemplo, si usted lo colocara para | la orientacin del keyboardHidden, luego el Androide no destruir y Recree su actividad cuando el usuario lanza el teclado. En lugar de eso, llamar a onConfigurationChanged (la Configuracin) y Asumo que usted sabe lo que usted est desempendose. Una vez tan se hace, cundo usted corre el programa, usted debera ver y Oiga el clip de la pelcula (vea Figura 5.3, en la pgina precedente). Pruebe girar La exhibicin a verificarle trabaja en ambos retrato y los modos del paisaje. Voila! La bondad de vdeo instantnea. Ahora demleos brillo a la prueba Sudoku con un poco de msica de estado de nimo. 5.3 Adicin Sounds para Sudoku En este pasaje, vamos a tomar lo que hemos aprendido y sumamos trasfondo La msica para el juego Sudoku que hemos estado construyendo. Una voluntad de cancin Juegue durante la pantalla abridora, y otro jugar durante lo real El juego. ste demostrar no slo cmo jugar msica pero tambin algunos Las consideraciones de ciclos biolgicos importantes. Para aadirle la msica a la pantalla principal, justamente necesitamos pasar sobre la disposicin de estos dos Los mtodos en la clase Sudoku: Download Sudokuv3/src/org/example/sudoku/Sudoku.java @Override protected void onResume() { super.onResume(); Music.play(this, R.raw.main); } @Override protected void onPause() { super.onPause(); Music.stop(this); }

GARCIA JIM
Si usted recuerda de Seccin 2.2, est vivo!, En pgina 32, el onResume () El mtodo es designado cuando la actividad est lista a comenzar a interactuar con lo El usuario. ste es un buen lugar para poner en marcha la msica, as es que ponemos a un Music.start () Llame por telfono all. La clase de Msica estar definida en poco tiempo. R.raw.main se refiere a los res / el main.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. El mtodo onPause () es el sujetalibros arreglado en pares para onResume (). El androide Las pausas la actividad actual antes de reanudar a una nuevo, as en Sudoku, No deberamos destinar un Servicio del Trasfondo para Msica? No hemos dicho mucho acerca de la clase de Servicio del Androide, pero usted Lo pude haber visto usado en algunos ejemplos que juegan msica en lo La Web. Bsicamente, un Servicio es una forma para iniciar un proceso de fondo Eso puede correr aun despus de que su actividad actual se termina. Los servicios Es parecido a, pero no completamente as como, los demonios Linux. Si usted le escribe a un jugador de msica multiusa y quiere lo La msica a continuar mientras usted lee el correo o hacer una lectura ligera lo La Web, luego, s, un Servicio sera apropiado. En la mayora de los casos, Sin embargo, usted quiere que la msica fenezca cuando su programa llega al final, As es que usted no necesita usar la clase de Servicio. Cuando usted inicia un juego nuevo, la actividad Sudoku ser hecha una pausa, y luego La actividad de Juego comenzar. onPause () tambin ser designado cuando lo El usuario presiona la Parte Trasera o la llave de la pgina principal del sitio Web. stas son todas las posiciones sociales donde queremos Nuestra msica del ttulo a detener, as es que llamamos a Music.stop () en onPause (). Ahora hagamos algo semejante para la msica en la actividad de Juego: Download Sudokuv3/src/org/example/sudoku/Game.java @Override protected void onResume() { super.onResume(); Music.play(this, R.raw.game); } @Override protected void onPause() { super.onPause(); Music.stop(this); } Si usted se asemeja esto para lo que hizo para la clase Sudoku, usted se fijar Que le pongamos notas a un recurso en buen estado diferente, R.raw.game (res / toscos Game.mp3). La pieza final del acertijo musical es la clase de Msica, lo cual se ingeniar La clase MediaPlayer soli jugar la msica actual:

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

GARCIA JIM
5.4 de Avances Rpidos En este captulo, encubrimos jugar clips audios y de vdeo acostumbrando lo El androide SDK. No discutimos registrar porque la mayora de programas legan No la necesidad para hacer eso, pero si usted acierta a ser la excepcin, luego mire hacia arriba La clase MediaRecorder en el documentation.4 en lnea En el Captulo 6, Almacenando Datos Locales, en la siguiente pgina, usted aprender acerca de Algunos programas simples del Androide de formas pueden almacenar datos entre invocaciones. Si usted no necesita hacer eso, luego a usted puede pasrsele delante para Chapter 7, El Mundo Conectado, adelante mandan a llamar 126 y se enteran de red El acceso.

Captulo 6 Almacenando Datos Locales


Hasta ahora, nos hemos concentrado en escribir aplicaciones que no necesitan para Conserve datos de aproximadamente cundo egresan. Se inician, corren, y se van, No dejando huella que estaban alguna vez all. Sin embargo, la mayora de programas verdaderos Necesito estado persistente, ya sea es un tamao simple del carcter de imprenta sedimentndose, uno bochornoso La foto de su ltima fiesta de la oficina, o el plan de la comida de la semana entrante. Cualquier cosa que sea, el Androide le deja permanentemente almacenarlo en su mvil El dispositivo para uso ms adelante y lo protege de acceso accidental o malicioso Por otros programas. Su aplicacin puede almacenar datos usando varias tcnicas diferentes dependiendo En el tamao de los datos, su estructura, su duracin de una vida, y si eso Ser compartido con otros programas. En este captulo, echaremos un vistazo en Tres mtodos simples para conservar datos locales: La API de preferencias, instancia Indican manojos, y archivos de memoria del destello. En el Captulo 9, Poniendo lenguaje normalizado de consulta a Trabaje, en pgina 171, ahondaremos en tcnicas ms adelantadas acostumbrando El motor de la base de datos del SQLite incorporado. 6.1 Adicin Options para Sudoku En la Seccin 3.7, Sumando un Men, en pgina 60, utilizamos al onCreateOptionsMenu ( ) El mtodo para sumar un men conteniendo un artculo para el Sudoku principal La pantalla. Cuando el usuario presiona el Men llave y selecciona los Trasfondos ... tem, el cdigo inicia la actividad Prefs, lo cual deja el cambio del usuario lo Las opciones para el juego. Porque Prefs extiende a PreferenceActivity, los valores Pues los trasfondos se guardan en el rea de preferencias del programa, pero originalmente No hicimos nada con ellos. Ahora vamos al implemento Ellos.

GARCIA JIM
Primero modifiquemos la clase Prefs para sumar un par de mtodos de la persona emprendedora que Recupere los valores corrientes de nuestras dos opciones. Aqu est la definicin 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 opcin (la msica 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 msica: 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 () tambin 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 pgina 89. De otra manera, justamente nos saltamos eso en parte. Despus le mostrar cmo 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 telefnica o una notificacin de una cita importante. Cualquier cosa lo La razn, nosotros el faltante para dejar al jugador regresar ms tarde y continuar Donde dejaron de. Primero necesitamos ahorrar al estado actual del acertijo a alguna parte. Lo La API de preferencias puede servir ms que simplemente opciones; Puede almacenar Cualquier pedacitos autnomos pequeos de informacin 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; Despus necesitamos salvar el acertijo actual cada vez que la pieza de caza es hecho una pausa. Vea Seccin 2.2, es Viva!, En pgina 32 para una descripcin de onPause () y Los otros mtodos de ciclos biolgicos. 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 cmo leemos los datos salvados? Recuerde Que cuando el juego comienza, el mtodo getPuzzle () es designado, y lo La dificultad el nivel est aprobada adentro. Acostumbraremos eso pues permanente igualmente. difficulty level is passed in. Well 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. Despus, necesitamos hacer el botn Continue en la pantalla de la caera maestra (vea Resuelven 3.4, en pgina 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 botn es presionado, pasajero l DIFFICULTY_CONTINUE. startGame () Pasa por alto la dificultad para la actividad de Juego, y Game.onCreate () llama por telfono Intent.getIntExtra () para ley la dificultad y le pasa eso a getPuzzle () (Usted puede ver el cdigo para eso en la Seccin 4.2, Iniciando el Juego, adelante Pgina 75). Hay una cosa ms 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 modificacin para el mtodo 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. Despus miremos economizar El estado de instancia.

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

GARCIA JIM
). Normalmente, este Idaho vendra de XML, pero desde el Acertijo La vista fue creada en cdigo, necesitamos proponrnosla. Nos reconciliamos uno El nmero arbitrario en lnea 8 (cualquier valor har con tal de que sea positivo) Y luego usa el mtodo setId () para asignarle en lnea 12. El mtodo onSaveInstanceState () est definido en lnea 16. Llamamos por telfono lo La superclase para obtener a su estado, y luego salvamos lo nuestro y la de ellos en un Manojo. A falta de para llamar la superclase dar como resultado un error del runtime. Ms tarde, onRestoreInstanceState () (lnea 26) se sentir llamado a bromear fuera lo La informacin que ahorramos. Obtenemos nuestra x y posiciones y del Manojo, Y luego llamamos la superclase a dejarla obtener cualquier cosa que necesite. Despus Haciendo estos cambios, el cursor ser recordado por PuzzleView, Algo as como alguna otra vista Android. Despus miremos guardar datos en archivos francamente viejos. 6.4 Accediendo al Internal Archivan Sistema El androide corre a Linux bajo las coberteras, tan hay un sistema de archivo verdadero Montado all dentro con un directorio raz y todo. Los archivos son Almacenado en destello no voltil que la memoria incorpor en el dispositivo, as es que son No perdido cuando el telfono est apagado. Todo el archivo usual Java que Yo las rutinas de la / O del paquete del java.io estoy disponible Para que su programa use, con la salvedad que su proceso tiene Los permisos limitados as es que no puede ensuciar los datos de alguna otra aplicacin. Adentro El hecho, la cosa ms importante a la que puede acceder es un directorio del soldado raso del paquete creado En instala el tiempo (/ datos /datos / packagename). Algunos mtodos 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. Aqu estn los nicos que usted tiene ms probabilidad de necesitar: DeleteFile () Suprima un archivo privado. Los regresos verdaderos si surtiese efecto, falso De otra manera. FileList () Devuelva una lista de todos los archivos en el soldado raso de la aplicacin El rea en un conjunto imponente de la Cuerda. OpenFileInput () Abra un archivo privado para leer. Los regresos uno Java.io.FileInputStream. OpenFileOutput () Abra un archivo privado para escribir. Los regresos uno Java.io.FileOutputStream. Sin embargo, desde que esta memoria interna est limitada, le recomiendo mantenimiento El tamao de cualquier datos que usted pone all punto bajo, diga un milln de caracteres o dos en lo Ms, y cuidadosamente la agarradera Yo los errores de la / O al escribir en el caso el espacio Sale corriendo. Afortunadamente, la memoria interna no es el nico almacenamiento que usted tiene que trabajar Con. 6.5 Accessing SD Cards Algunos artificios Android incluirn una ranura para la memoria adicional del destello a Sea taponado adentro, tpicamente una tarjeta Digital Segura SD Cards Estos naipes de memoria, Si presente, es muy mayor que la memoria incorporada, y as lo es El ideal para la msica de multimilln de caracteres de almacenaje y archivos de vdeo. No pueden ser Usado para cdigo, y cada aplicacin puede leer y puede escribir archivos all. En la Seccin 5.2, Jugando Video, en pgina 107, tele-enviamos un video de muestra El archivo para el directorio de / datos del dispositivo emulado. ste es el agravio El lugar para eso, desde que no estamos supuestos a poner archivos grandes en lo interno

GARCIA JIM
El sistema de archivo. Entonces, ahora voy a mostrarle una mejor forma. El primer paso es crear y formatear una tarjeta virtual SD Cards que formateamos " el tapn Adentro " para el emulador. Afortunadamente ya hemos hecho esto si usted recuerda, adentro Seccin 1.3, Creando a un AVD, en pgina 20 cuando creamos el "em15" El dispositivo virtual, le dimos a un 128MB tarjeta virtual SD Cards igualmente. Usted puede Hgale cualquier tamao que a usted le gusta, sino si usted lo hace demasiado pequeo, que puede causar El emulador a chocar; Si usted lo hace demasiado gordo, que usted har simplemente desaprovecha espacio adelante La unidad de disco de su computadora. Despus, copiemos el video de muestra para la tarjeta SD Cards: C:\> adb push c:\code\samplevideo.3gp /sdcard/samplevideo.3gp 1468 KB/s (369870 bytes in 0.246s) Luego necesitamos modificar el mtodo onCreate () de la clase De Vdeo para jugar La pelcula de la tarjeta SD Cards en lugar del directorio de / datos: Download Videov2/src/org/example/video/Video.java // Load and start the movie video.setVideoPath("/sdcard/samplevideo.3gp" ); video.start(); Ahora intente correr el programa. El video debera jugar normalmente. Nota: Iniciando con Androide 1.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 aplicacin. La lectura de la tarjeta no hace Requiera cualquier permisos especiales. 6.6 Avances Rpidos En este captulo, cubrimos un par de formas bsicas para almacenar datos locales adelante La plataforma del Androide. Eso debera ser suficiente iniciar usted, sino por Los datos estructurados como las listas telefnicas y las recetas, usted necesitarn algo Ms avanzaron. Vea Captulo 9, Dndole Ocupacin a SQL, en pgina 171 para Las direcciones en relacin a la forma de usar base de datos del SQLite incorporado del Androide y cmo para Comparta informacin entre proveedores contentos que consumen aplicaciones. Esto nos trae al fin de Parte II. Con la Ayuda del ejemplo Sudoku, Usted ha aprendido todos los fundamentos de Androide programando, incluyendo Las interfaces de usuario, los grficos 2D, el almacenamiento de datos audio, de vdeo, y simple. Ahora es hora de dejar atrs a Sudoku y mover ms all de las cosas necesarias.

GARCIA JIM

La parte III Ms All De los Fundamentos

GARCIA JIM

Captulo 7 El Mundo Conectado


Sobre los siguiente pocos captulos, cubriremos temas ms adelantados tan El acceso de la red y los servicios basados en posiciones. Usted puede escribir muchos tiles Las aplicaciones sin estas caractersticas, excepto ir ms all de las caractersticas bsicas De Androide realmente ayudar que usted le aade el valor a sus programas, dando Ellos mucha ms funcionabilidad con un mnimo de esfuerzo. Para qu destina usted su telfono mvil? Adems de hacer llama, ms Y ms personas estn usando sus telfonos como dispositivos de la Internet mviles. Los analistas predicen que en pocos aos los telfonos mviles sobrepasarn parte superior de un escritorio Las computadoras como la forma de nmero uno para conectarse al Internet.1 Esto El punto ya ha sido alcanzado en algunas partes del world.2 Los telfonos del androide estn bien acondicionados para el mundo conectado nuevo de lo La Internet mvil. La primera parte, el Androide provee un navegador de Internet de amplio espectro Basado en el project.3 abierto WebKit de la fuente ste est el mismo motor usted Encontrar en Cromo Google, el Apple IPhone, y la parte superior de un escritorio de Safari El navegador pero con una torsin. El androide le deja usar el navegador como un componente Directamente el interior su aplicacin. En segundo lugar, el Androide le da su acceso de programas a servicios estndar de la red Guste los conectores de / protocolo entre redes de protocolo de control de transmisin. Esto le deja consumir servicios de trama de bsquedas en la Internet usando Google, Yahoo, Amazon, y muchas otras fuentes en la Internet.

Figura 7.1: Abriendo un navegador usando un intento del Androide En este captulo, usted aprender a aprovecharse de todas estas caractersticas Y ms a travs de cuatro programas de ejemplo: " BrowserIntent: Demuestra abrir un navegador de Internet externo Usando un intento del Androide " BrowserView: Le muestra cmo incrustar un navegador en seguida en Su aplicacin " LocalBrowser: Explica cmo JavaScript en un WebView incrustado Y el cdigo Java en su programa Android puede hablar el uno para el otro " Translate: Usa datos teniendo fuerza obligatoria, trenzndose, y los servicios de trama para uno Divirtiendo propsito

GARCIA JIM
7.1 Haciendo Una Lectura Ligera por el Intento La cosa ms simple que usted puede hacer con API de sistema de redes del Androide es abrirse Un navegador en una pgina de trama de su eleccin. Usted podra querer hacer esto para Provale un enlace a su pgina principal del sitio Web de su programa o lograr acceso a una cierta cantidad La aplicacin basada en servidores como un sistema ordenador. En Androide todo eso Toma son tres lneas de cdigo. Para demostrar, escribamleos a un ejemplo nuevo designado BrowserIntent, cul Tendr un campo de edicin donde usted puede introducir un URL y un botn de Empuje Usted presiona para abrir el navegador en ese URL (vea Figura 7.1). Comience por Creando un proyecto de "hola" nuevo ", del Androide" con los siguientes valores adentro lo El mago nuevo de Proyecto Project name: BrowserIntent Build Target: Android 1.6 Application name: BrowserIntent Package name: org.example.browserintent Create Activity: BrowserIntent Una vez que usted tiene uno el programa bsico, cambie el archivo del layout (res/layout/ main.xml ) as es que se parece a esto: Download BrowserIntent/res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.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.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, un control EditText y un Botn. En EditText, colocamos al androide:_ el peso del layout "1.0" para hacer el rea del texto llenar Arriba de todo el espacio horizontal a la izquierda del botn, y tambin se sedimenta El androide:Le aplica delineador a "1" limitar la altura del control a una lnea vertical. Reparo en que esto no tiene efecto en la cantidad de texto en la que el usuario puede entrar Aqu, simplemente la forma que es exhibido.

GARCIA JIM
El androide 1.5 introdujo soporte para teclados blandos y otro alterne Introduzca en la computadora mtodos. Las opciones para androide:InputType "textUri" y El androide:ImeOptions "actionGo" son indicios para cmo debera el teclado blando Aparezca. Le dicen a Android que reemplace el teclado estndar con uno Eso tiene botones convenientes para que ".com" y entre en direcciones de trama Y un " Go " botn que abre el page.4 de trama Como siempre, el texto legible en humano debera ser metido en un archivo del recurso res/ values/strings.xml: Download BrowserIntent/res/values/strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">BrowserIntent</string> <string name="go_button">Go</string> </resources> Despus necesitamos suplir el mtodo onCreate () en la clase BrowserIntent. Esto est donde construiremos la interfaz de usuario y engancharemos todo el comportamiento. Si usted no siente guste introducir completamente esto, el cdigo completo de la fuente para lo Los ejemplos estn disponibles en lnea.
Download BrowserIntent/src/org/example/browserintent/BrowserIntent.java Line 1 package org.example.browserintent; - import android.app.Activity; - import

android.content.Intent; android.net.Uri; - import android.os.Bundle; - import android.view.KeyEvent; - import android.view.View; - import android.view.View.OnClickListener; 10 import android.view.View.OnKeyListener; - import android.widget.Button; - import android.widget.EditText;
5 import - public

class BrowserIntent extends Activity { EditText urlText; - private Button goButton;


15 private - @Override - public

void onCreate(Bundle savedInstanceState) {

20 super.onCreate(savedInstanceState); - setContentView(R.layout.main); - // Get a handle to all user interface - urlText - //

elements = (EditText) findViewById(R.id.url_field); 25 goButton = (Button) findViewById(R.id.go_button); Setup event handlers


- goButton.setOnClickListener(new - public

OnClickListener() { void onClick(View view) { 30 openBrowser(); -} - }); - urlText.setOnKeyListener(new OnKeyListener() { - public boolean onKey(View view, int keyCode, KeyEvent event) { 35 if (keyCode == KeyEvent.KEYCODE_ENTER) { - openBrowser(); - return true; -} - return false; 40 } - }); -} -}

GARCIA JIM
Dentro de onCreate (), le llamamos a setContentView () en lnea 21 a cargar la vista De su definicin en el recurso del layout, y luego llama a findViewById () En lnea 24 para llevarle una agarradera a nuestros dos controles de la interfaz de usuario. Lnea 28 le dice a Android que corra algn cdigo cuando el usuario selecciona el Empuje Abotone, ya sea tocndolo o navegando para eso y presionando lo Centre botn de D-Pad. Cuando eso ocurre, llamamos al openBrowser () El mtodo, cul estar definido en un momento. Como una conveniencia, si el usuario escribe una direccin y le pega a la tecla ENTER (Si su telfono tiene uno), queremos que el navegador abra algo as como ellos Haba dado un clic sobre Va. Para hacer esto, definimos un oyente iniciando en lnea 33 que Ser designado cada vez que el usuario escribe un teclazo en el campo de edicin. Si es la tecla ENTER, luego llamamos el mtodo openBrowser () a abrir lo El navegador; De otra manera, regresamos falsos para dejar el control del texto maniobrar la llave Normalmente. Ahora viene la parte que usted ha estado esperando: El mtodo openBrowser (). Como prometido, tiene tres especialidades de largo: Download BrowserIntent/src/org/example/browserintent/BrowserIntent.java /** Open a browser on the URL specified in the text box */ private void openBrowser() { Uri uri = Uri.parse(urlText.getText().toString()); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } La primera lnea recupera la direccin de la pgina de trama como una cuerda (por ejemplo, "Http://www.android.com") y los conversos eso para un recurso uniforme El identificador (URI). La siguiente lnea crea una clase Atenta nueva con una accin De ACTION_VIEW, pasando eso que la clase de Uros justamente cre como el objeto nosotros Quiera mirar. Finalmente, llamamos el mtodo startActivity () a pedir eso Esta accin sea realizada.

Figura 7.2: Mirando una pgina de trama con el navegador predeterminado

GARCIA JIM
Cuando el Navegador que la actividad echa a andar, crear su vista (vea Figura 7.2), y su programa ser hecho una pausa. Si el usuario presiona la Parte Trasera Teclee en ese momento, la ventana del navegador se ir, y su aplicacin Continuar. Pero qu ocurre si usted quiere ver a algunos de su usuario La interfaz y una pgina de trama al mismo tiempo? El androide le deja hacer Tan por ah utilizador la clase WebView. 7.2 Tejen con una Vista En su computador de escritorio, un navegador de Internet es uno grande, complicado, Programa que engulle memoria con toda clase de caractersticas como seales de lectura, Los plug-ines, las animaciones del Destello, las etiquetas, las barras de desplazamiento, el estampado, y as sucesivamente. Cuando estaba trabajando en el Eclipse el proyecto y alguien sugiri Reemplazando algunos puntos de vista del texto comunes con navegadores de Internet incrustados, yo Pens que estaban chiflados. No lo hara eso hace ms sentido, discut, para Simplemente realce al espectador del texto para hacer letras itlicas o mesas o cualquier cosa que fue Eso faltaba? Resulta no estaban chiflados porque: " Un navegador de Internet puede ser (relativamente) parco y trmino medio si usted se desnuda fuera Todos menos el motor bsico de interpretacin. " Si usted realza una vista del texto para sumar ms y ms cosas que uno El navegador que el motor puede restaurar, usted el fin con ya sea uno excesivamente complicado, El espectador del texto hinchado o un navegador poco accionado. 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. Aunque el 1MB es todava significativo en uno incrustado El dispositivo, hay muchos casos dnde utilizando a un WebView es apropiado. A las obras WebView bastante les gusta alguna otra vista Android excepto que ella Tiene algunos mtodos adicionales especficos para el navegador. Voy a mostrarle Cmo trabaja haciendo una versin incrustada del ejemplo previo. ste ser llamado BrowserView en lugar de BrowserIntent, desde eso Usa una Vista incrustada en lugar de un Intento. Comience por crear un "hola" nuevo "," un proyecto del "androide" usando estos trasfondos: Project name: BrowserView Build Target: Android 1.6 Application name: BrowserView Package name: org.example.browserview Create Activity: BrowserView El archivo del layout para BrowserView es similar al mismo en BrowserIntent, Pero hayamos agregado a un WebView en la parte inferior: Download BrowserView/res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.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
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.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.0" /> </LinearLayout> Usamos dos controles LinearLayout para hacer todo aparecer del lado de la razn El lugar. El control extremo divide la pantalla en parte superior y fondo Las regiones; La parte superior tiene el botn y rea del texto, y el fondo tiene lo WebView. El LinearLayout ntimo es as como antes; Justamente hace El empuje del texto del rea en izquierda y el botn a la derecha. El mtodo onCreate () para BrowserView es exactamente igual como antes Deduzca excepcin eso ora hay una vista adicional para buscar: Download BrowserView/src/org/example/browserview/BrowserView.java import android.webkit.WebView; // ... public class BrowserView extends Activity { private WebView webView; // ... @Override public void onCreate(Bundle savedInstanceState) { // ... webView = (WebView) findViewById(R.id.web_view); // ... } } El mtodo openBrowser (), sin embargo, es diferente: Download BrowserView/src/org/example/browserview/BrowserView.java /** Open a browser on the URL specified in the text box */ private void openBrowser() { webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl(urlText.getText().toString()); }

GARCIA JIM
El mtodo loadUrl () causa que el motor del navegador comience a carga y Exhibiendo una pgina de trama en la direccin dada. Regresa inmediatamente aun Aunque la carga real puede tomar bastante tiempo (si se termina en absoluto). No olvide actualizar los recursos de la cuerda: Download BrowserView/res/values/strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">BrowserView</string> <string name="go_button">Go</string> </resources> Necesitamos hacer un cambio ms para el programa. Sume esta lnea para AndroidManifest.xml antes de la > etiqueta < aplicativa: Download BrowserView/AndroidManifest.xml <uses-permission android:name="android.permission.INTERNET" /> Si usted omite esto, el Androide no dar su acceso aplicativo para La Internet, y usted obtendrn una "pgina de Web" error "no disponible". Pruebe correr el programa ahora, y entre en una direccin vlida de trama empezando Con "http:"; Cuando usted presiona Interlineacin o selecciona el botn de Empuje, Internet La pgina debera aparecer (vea Figura 7.3, en la siguiente pgina). WebView tiene docenas de otros mtodos que usted puede usar para controlar lo que es Siendo exhibido o coloca notificaciones en los cambios estatales. Usted puede encontrar una lista completa en la documentacin en lnea para WebView, Pero aqu es los mtodos que usted tiene ms probabilidad de necesitar: " AddJavascriptInterface (): Deja un objeto Java ser a lo que se accedi JavaScript (ms en este en la siguiente seccin) " CreateSnapshot (): Crea un screenshot de la pgina 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 pgina de trama del URL dado " SetDownloadListener (): Las tcnicas de venta de recuperacin de registros para hacen un download de Eventos, Como cuando el usuario hace un download de un .zip o un archivo .apk " SetWebChromeClient (): Registra tcnicas de venta de recuperacin para los Eventos que necesitan para Hgase fuera del rectngulo WebView, tan modernizante el ttulo O la barra de progreso o abrir un dilogo JavaScript box Figura 7.3: Incrustando un navegador utilizando a WebView

GARCIA JIM
Por qu No Hizo BrowserIntent Need permiso de usos? El ejemplo previo, BrowserIntent, simplemente despedido anticuado un intento para Pida eso alguna otra vista aplicativa la pgina de trama. Eso Otra aplicacin (el navegador) es la que necesita preguntar pues Los permisos de la Internet en su propio AndroidManifest.xml. " SetWebViewClient (): Alquileres el set de aplicacin engancha el navegador para Intercepte Eventos como cargas del recurso, afine prensas, y autorizacin Las peticiones " StopLoading (): Detiene la pgina actual de cargar Una de las cosas ms poderosas que usted puede hacer con el control WebView Debe hablar de ac para all entre eso y la aplicacin del Androide que Lo contiene. Tomemos una apariencia ms cercana en esta caracterstica ahora. 7.3 From JavaScript para Java y la Parte Trasera Su dispositivo Android puede hacer un nmero de cosas frescas como provisin local Los datos, los grficos levadizos, la msica de obra teatral, las llamadas de la marca, y determinan su posicin. No lo hara que sea simptico si usted podra acceder a esa funcionabilidad de una trama La pgina? Con un control incrustado WebView, usted puede. La llave es el mtodo addJavascriptInterface () en la clase WebView. 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 cdigo JavaScript El acceso. Cuando el cdigo JavaScript conjura mtodos en ese objeto, eso Realmente conjurar mtodos en su programa Android. Usted puede llamar mtodos JavaScript de su programa Android tambin. Todo Usted tiene que hacer es llamada el mtodo loadUrl (), pasndole por alto a ella un URL de la forma El javascript:El cdigo a ejecutar. En lugar de ir a una pgina nueva, el navegador Ajusticiar la expresin dada JavaScript dentro del paje actual. Usted puede llamar un mtodo, puede cambiar variables JavaScript, puede modificar el navegador Documente cualquier cosa que usted necesita. Para demostrar llamadas entre JavaScript en el WebView y Java adentro El programa del Androide, alquiler nosotros ahora construya un programa que es medio HTML JavaScript y medio Androide (vea Figura 7.4, en pgina 138). La cabeza De la ventana de la aplicacin est un control WebView, y la parte inferior es Un TextView y Botn del usuario del Androide interactan. Cuando usted hace clic Los botones y los enlaces, eso las llamadas de marcas entre los dos ambientes. Comience por crear un "hola," un programa del "androide" usando estos parmetros:
Project name: LocalBrowser Build Target: Android 1.6 Application name: LocalBrowser Package name: org.example.localbrowser Create Activity: LocalBrowser

GARCIA JIM
Le permite JavaScript para Call Java Dangerous? Cada vez que usted deja una pgina de trama acceder a los recursos locales o Llame funciones fuera de la caja de arena del navegador, usted necesita considerar Las implicaciones prendarias muy cuidadosamente. Por ejemplo, usted No querra crear un mtodo 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 mtodo y sus nombres de archivo. Aqu hay algunas cosas para recordar. Primero, no confe adelante La seguridad por oscuridad. Implemente topes en las pginas que pueden acostumbrar Sus mtodos y en las cosas que esos mtodos pueden hacer. Y Recuerde la regla dorada de seguridad: No descarte cosas; Rjalos adentro. En otras palabras, no intente revisar en busca de todo el Las malas cosas que alguien le puede pedir a usted que haga (por ejemplo, Deje invlidos a los personajes en una averiguacin). Usted debe perder algo. En lugar de eso, prohba todo, y pase slo las buenas cosas usted Sepa est segura. La interfaz de usuario para este programa ser dividida en dos partes. La primera parte La parte est definida en el archivo del layout del Androide, / res/layout/main.xml: Download LocalBrowser/res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.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" /> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:padding="5sp" > <TextView android:layout_width="fill_parent" Figura 7.4: Comunicndose 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" />

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.html que estar cargado en Internet La vista. Este archivo se va en el directorio de activos, no el directorio de res, porque No es un recurso compilado. Cualquier cosa en el directorio de activos se copia Literalmente encima del almacenamiento local cuando su programa es instalado. El directorio Est dirigido a servir para copias locales de HTML, imgenes, y letras Que el navegador puede mirar sin estar conectado para la red. Download LocalBrowser/assets/index.html Line 1 <html> - <head> - <script language="JavaScript"> - function callJS(arg) { 5 document.getElementById('replaceme').innerHTML = arg; -} - </script> - </head> - <body> 10 <h1>WebView</h1> - <p> - <a href="#" onclick="window.alert('Alert from JavaScript')"> - Display JavaScript alert</a> - </p> 15 <p> - <a href="#" onclick="window.android.callAndroid('Hello from Browser')"> - Call Android from JavaScript</a> - </p> - <p id="replaceme"> 20 </p> - </body> - </html> Aplquele delineador a 4 de index.html definen la funcin callJS () que nuestro programa Android Llamar por telfono ms tarde. Toma una discusin de la cuerda y la intercala en La etiqueta del replaceme, que est en lnea 19. En Figura 7.4, en la pgina previa, usted ve dos enlaces de HTML que son La puesta en marcha definida en lnea 12. Lo primer justamente llama una ventana estndar. Ponga en alerta que () funcin abra una ventana exhibiendo un mensaje pequeo. Lo El segundo enlace, en lnea 16, llama el mtodo callAndroid () en el window.android El objeto. Si usted cargase esta pgina en un navegador de Internet normal, la ventana. El androide estara indefinido. Excepto desde que incrustamos un navegador En una aplicacin del Androide, podemos definir el objeto por nosotros mismos as lo La pgina lo puede usar.

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

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

GARCIA JIM
El chrome de trmino aqu se refiere a todos los adornos alrededor de un navegador La ventana. Si ste fuera un cliente del navegador en toda la extensin de la palabra, necesitaramos manipular La navegacin, las seales de lectura, los mens, y as sucesivamente. En este caso, todo lo que queremos Hacer es cambiar lo que oc urre con cdigo JavaScript cuando el navegador Intenta abrir al pblico una alerta JavaScript (utilizando a window.alert ()). Dentro de onJsAlert () Usamos la clase Toast del Androide para crear una ventana de mensaje que har Aparezca para una pequea cantidad de tiempo (en este caso, 3000 milisegundos, o 3 Los segundos). Una vez que terminamos de configurar al WebView, podemos utilizar a loadUrl () para cargar La pgina local: Download LocalBrowser/src/org/example/localbrowser/LocalBrowser.java // Load the web page from a local asset webView.loadUrl("file:///android_asset/index.html" ); 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. Como Usted podra haber adivinado, se refieren a los archivos en el directorio de activos. En esto El caso, nosotros cargamos el archivo del index.html definido ms temprano. Aqu est el archivo del / strings.xml de / valores de res para el ejemplo LocalBrowser: Download LocalBrowser/res/values/strings.xml <?xml version="1.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 botn al pie de lo La pantalla as es que har una llamada JavaScript (una llamada de Java para JavaScript). Download LocalBrowser/src/org/example/localbrowser/LocalBrowser.java // This function will be called when the user presses the // button on the Android side button.setOnClickListener(new OnClickListener() { public void onClick(View view) { Log.d(TAG, "onClick(" + view + ")" ); webView.loadUrl("javascript:callJS('Hello from Android')" ); } }); Para hacer eso, colocamos a un oyente para los chasquidos del botn utilizando a setOnClickListener (). Cuando el botn se aprieta, onClick () es designado, lo cual da la vuelta y Llama a WebView.loadUrl (), pasndolo por alto una expresin JavaScript para evaluar adentro El navegador. La expresin es una llamada para la funcin callJS () definida adentro Index.html. Corra el programa ahora, y prubelo. Cuando usted hace clic " el Despliegue JavaScript Ojo avizor, " una ventana de mensaje del Androide aparecer. Cuando usted hace clic " la Llamada El androide de JavaScript, "la cuerda" Hola de Navegador " ser exhibido En un control del texto Android. Y finalmente, cuando usted presiona lo " la Llamada JavaScript de Androide "botn, la cuerda" Hola de Androide " es enviado

GARCIA JIM
Para el navegador e inserto en el HTML donde ser exhibido El fin de la pgina de trama. Algunas veces usted no necesita exhibir una pgina de trama, pero usted justamente necesita Acceda a alguna clase de servicio de trama u otro recurso lateral en servidor. Adentro lo Despus seccione, le mostrar cmo hacer esto. 7.4 Web Utilizadora Services El androide provee un set lleno de APIs estndar a Java que enlaza en red, tan El paquete de java.net.HttpURLConneccin, que usted pueda acostumbrar en sus programas. La parte tramposa debe hacer las llamadas asincrnicamente tan tan su La interfaz de usuario del programa ser receptiva en todo momento. Considere qu pasara si usted justamente hace una llamada bloqueadora de la red En su hilo principal (la Interfaz Grfica del Usuario). Hasta que esa llamada regrese (y lo puede hacer nunca El regreso), su aplicacin no puede responder para cualquier Eventos de la interfaz del usuario Como los teclazos o prensas del botn. Dar la apariencia de estar colgado para el usuario. Obviamente, eso es algo que usted tendr que evitar. El paquete del java.util.concurrent es perfecto para esta clase de trabajo. La primera parte creada Por Doug Lea como una biblioteca autnoma y ms tarde incorporado en Java 5, este paquete soporta programacin concurrente en uno ms alto Ras con ras que la clase normal Java Thread. La clase ExecutorService se ingenia Uno o ms hilos para usted, y todo lo que usted tiene que hacer es someterse Las tareas (las instancias de Runnable o las Acciones de Fcil Salida) para el albacea para tenerlos Corra. Una instancia de la clase Futura es devuelta, lo cual es una referencia para Una cierta cantidad como an el valor desconocido de futuro que ser devuelto por su tarea (Si cualquier). Usted puede limitar el nmero de hilos que son creados, y usted Pueden interrumpir tareas corredoras si es necesario. Ilustrar estos conceptos, nos dej crear una diversin programa pequeo que llama por telfono El API.5 Google Translation Le Tiene alguna vez redo en traducciones extraas Hacia y desde las lenguas extranjeras, especialmente generado por computadora

Figura 7.5: La traduccin por mquina es todava un trabajo en curso.

GARCIA JIM
Las traducciones? Este programa dejar al usuario introducir una locucin en un lenguaje, Pdale a Google que traduzca para un segundo idioma, y luego le pregunte Haga bsquedas en la Internet usando Google para retraducirlo en la lengua materna. Idealmente, usted fenecera Arriba con las mismas palabras con las que usted comenz, pero esto no es siempre lo El caso, como usted pueda ver en Figura 7.5. Para usar este programa, simplemente selecto la puesta en marcha y las lenguas deseadas, Y luego comience a escribir una locucin. Como usted mecanografa, el programa acostumbrar lo Haga Bsquedas En La Internet Usando Google servicio de trama Translation para traducir su texto en y de La lengua deseada. Para crear esta aplicacin, comience con un "hola, Androide" aplicacin Usando estos parmetros:
Project name: Translate Build Target: Android 1.6 Application name: Translate Package name: org.example.translate Create Activity: Translate

Perdido en Traduccin Cuando primero pens acerca de este ejemplo, me imagin que lo sera Fcil para obtener algunos resultados hilarantes. Desafortunadamente (o afortunadamente, A merced de su punto de vista), el servicio Google hace Un trabajo bastante bueno con la mayora de lenguajes. Si usted encuentra a cualquier especialmente Los casos chistosos donde el traductor realmente flubs arriba, por favor chelos al correo en el foro de debate en el sitio Web del libro (http:// Pragprog.com/titles/eband2) para otros gustar. Desde que este ejemplo acceder a la Internet para hacer una trama reparar peticin de fondos, Necesitaremos ordenarle a Android a concedernos permiso. Sume esta lnea para AndroidManifest.xml before the <application> XML tag: Download Translate/AndroidManifest.xml <uses-permission android:name="android.permission.INTERNET" /> El layout para este ejemplo est algo ms complicado usual, as Usaremos la vista TableLayout. TableLayout le deja arreglar sus puntos de vista En filas y columnas, encargndose de alineacin y desperezndose lo Las columnas para equipar el contenido. Es similar a usar > etiquetas de la < mesa > y < tr En el HTML. Download Translate/res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.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

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, le tenemos cinco filas, cada uno fila conteniendo a unos pocos Las columnas. Note que si hay slo una vista en fila, usted no tiene Para utilizar a un TableRow para contenerlo. Tambin, resulta de ms para utilizar al androide: layout_width= and android:layout_height= on en cada vista como usted tenga que Con LinearLayout. La clase de la Mquina 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. El usuario selecciona la mquina de hilar (Por ejemplo, tocndola), y una lista de valores posibles aparece Para que ellos escojan. En este ejemplo, vamos a usar este control para Haciendo una seleccin de una lista de lenguajes. La lista real se guarda como un recurso del Androide en el archivo res/values/ arrays.xml: Download Translate/res/values/arrays.xml <?xml version="1.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>

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 ms de los lenguajes Reconocido por el API. Google Translation Note que cada valor tiene uno El largo nombre (por ejemplo, espaol) y un nombre breve (por ejemplo, es). Usaremos el nombre breve al pasar por alto el lenguaje para el software de traduccin de textos. Ahora comencemos a modificar la clase Translate. Aqu est el contorno bsico: Download Translate/src/org/example/translate/Translate.java Line 1 package org.example.translate; - import java.util.concurrent.ExecutorService; - import java.util.concurrent.Executors; 5 import java.util.concurrent.Future; - import java.util.concurrent.RejectedExecutionException; - import android.app.Activity; - import android.os.Bundle; 10 import android.os.Handler; - import android.text.Editable; - import android.text.TextWatcher; - import android.view.View; - import android.widget.AdapterView; 15 import android.widget.ArrayAdapter; - import android.widget.EditText; - import android.widget.Spinner; - import android.widget.TextView; - import android.widget.AdapterView.OnItemSelectedListener; - public class Translate extends Activity { - private Spinner fromSpinner; - private Spinner toSpinner; - private EditText origText; 25 private TextView transText; - private TextView retransText; - private TextWatcher textWatcher; - private OnItemSelectedListener itemListener; 30 - private Handler guiThread; - private ExecutorService transThread; - private Runnable updateTask;

GARCIA JIM
- private Future transPending; 35 - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); 40 setContentView(R.layout.main); - initThreading(); - findViews(); - setAdapters(); - setListeners(); 45 } -} Despus de declarar algunas variables, definimos el mtodo onCreate () empezando En lnea 37 para darle un reset a la rosca y la interfaz de usuario. No se preocupe, Creceremos en msculo y tamao todos esos otros mtodos que llama por telfono como vamos. El mtodo findViews (), designado de lnea 42, 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.java /** Get a handle to all user interface elements */ private void findViews() { fromSpinner = (Spinner) findViewById(R.id.from_language); toSpinner = (Spinner) findViewById(R.id.to_language); origText = (EditText) findViewById(R.id.original_text); transText = (TextView) findViewById(R.id.translated_text); retransText = (TextView) findViewById(R.id.retranslated_text); } El mtodo setAdapters (), designados de onCreate () en lnea 43, definen uno La fuente de datos para las mquinas de hilar: Download Translate/src/org/example/translate/Translate.java /** Define data source for the spinners */ private void setAdapters() { // Spinner list comes from a resource, // Spinner user interface uses standard layouts ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource( this, R.array.languages, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); fromSpinner.setAdapter(adapter); toSpinner.setAdapter(adapter); // Automatically select two spinner items fromSpinner.setSelection(8); // English (en) toSpinner.setSelection(11); // French (fr) }

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

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

GARCIA JIM
- getLang(fromSpinner), // from language 35 getLang(toSpinner) // to language - ); - transPending = transThread.submit(translateTask); - } catch (RejectedExecutionException e) { - // Unable to start new task 40 transText.setText(R.string.translation_error); - retransText.setText(R.string.translation_error); -} -} -} 45 }; -} Tenemos dos hilos: El hilo del Androide principal destinado para la interfaz de usuario Y uno traduce flujo de ejecucin que crearemos para correr lo real El trabajo de traduccin. Representamos al primero con un Manipulador del Androide y El segundo con el ExecutorService de Java. Lnea 11 define la tarea de actualizacin, lo cual ser programado por la cola Actualice () mtodo. Cuando consigue correr, primero va a traer el texto actual para Traduzca y luego se dispone a enviar un trabajo de traduccin a lo traduzca El hilo. Le cancela cualquier traduccin que est ya en el progreso (en lnea 18), las tomas les importa del caso donde no hay texto para traducir (la lnea 22) Y suple los dos controles del texto donde el texto traducido aparecer La cuerda " la Traduccin..." (Lnea 26). Ese texto ser reemplazado ms tarde por ah El texto traducido real. Finalmente, en lnea 31, creamos una instancia de TranslateTask, dndola uno La referencia para la actividad Translate as es que pueda llamar de regreso a cambiar el texto, Una cuerda conteniendo el texto original, y los nombres breves de lo dos Los lenguajes seleccionados en las mquinas de hilar. Lnea 37 propone la tarea nueva para lo El hilo de traduccin, devolvindole una referencia al valor Futuro de regreso. Adentro Este caso, nosotros realmente no tenemos un valor de regreso desde los cambios TranslateTask La Interfaz Grfica del Usuario en seguida, pero usamos la referencia Futura de regreso en lnea 18 para Canclele la traduccin si es necesario. Concluir la clase Translate, 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.getSelectedItem().toString(); int lparen = result.indexOf('(' ); int rparen = result.indexOf(')' ); result = result.substring(lparen + 1, rparen); return result; } /** Request an update to start after a short delay */ private void queueUpdate(long delayMillis) { // Cancel previous update if it hasn't started yet guiThread.removeCallbacks(updateTask); // Start an update if nothing happens after a few milliseconds guiThread.postDelayed(updateTask, delayMillis); }

GARCIA JIM

/** Modify text on the screen (called from another thread) */ public void setTranslated(String text) { guiSetText(transText, text); } /** Modify text on the screen (called from another thread) */ public void setRetranslated(String text) { guiSetText(retransText, text); } /** All changes to the GUI must be done in the GUI thread */ private void guiSetText(final TextView view, final String text) { guiThread.post(new Runnable() { public void run() { view.setText(text); } }); } El mtodo getLang () resuelve cul tem es actualmente seleccionado en uno La mquina de hilar, compra la cuerda para que tem, y analiza gramaticalmente fuera del lenguaje breve El cdigo necesitado por el API. Translation QueueUpdate () pone una peticin de actualizacin en la peticin del hilo principal La cola pero lo dice para esperar un poco de tiempo antes de realmente corrindolo. Si all Estaba ya una peticin en la cola, es distante. El setTranslated () y setRetranslated () que los mtodos sern usados por TranslateTask Para actualizar la interfaz de usuario cuando los resultados traducidos regresan Del servicio de trama. Ambos llaman una funcin privada designada guiSet El Texto (). GuiSetText () usa el mtodo Handler.post () para preguntar el flujo de ejecucin principal de la Interfaz Grfica del Usuario Para actualizar el texto en un control TextView. Este paso adicional es menester Porque usted no puede llamar por telfono la interfaz de usuario funciona de interfaz de falta de uso Los hilos, y guiSetText () sern designados por ah lo traduce flujo de ejecucin. Aqu est el archivo del / strings.xml de / valores de res para el ejemplo Translate: Download Translate/res/values/strings.xml <?xml version="1.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...</string> <string name="translation_error">(Translation error)</string> <string name="translation_interrupted">(Translation interrupted)</string> </resources>

GARCIA JIM
No voy a incluir la fuente a la clase TranslateTask aqu porque Es ms bien largo y contiene al Androide insignificante especfico excepto por unos cuantos Depurando mensajes. Si a usted le gustara ver un ejemplo agradable de llamar por telfono uno El servicio descansado de trama utilizando HttpURLConnection, el anlisis gramatical resulta en Java El formato de Notacin del Objeto de la letra (JSON), y maniobrando toda clase de red Los errores y las peticiones para interrupciones, luego usted puede hacer un download lo La fuente del sitio Web del libro. 7.5 de Avances Rpidos En este captulo, cubrimos mucho terreno, de abrir al pblico una trama simple La pgina para usar un servicio asincrnico de trama. HTML / JavaScript programando Trasciende el alcance de este libro, pero hay varios bien Las referencias disponibles. Si usted va a hacer mucha programacin concurrente Con clases como ExecutorService, recomiendo a Java Concurrency En Practice Goe06 por Brian Goetz. El siguiente captulo explorar un nivel nuevo de interactividad a travs de posicin Y los servicios del sensor. Si usted est ansioso por aprender ms acerca de datos A las fuentes y los datos teniendo fuerza obligatoria, a usted puede pasrseles delante para Chapter 9, Golpeando la Pelota de Golf El lenguaje normalizado de consulta para Trabajar, en pgina 171.

GARCIA JIM

Captulo 8 Localizando y la Sensacin


La plataforma del Androide usa muchas tecnologas diferentes. Algunos de ellos Es nuevo, y algunos se han visto antes de adentro otros trasfondos. Cul es nico acerca de Androide es cmo surten efecto estas tecnologas juntos. En esto Subsidiaria, consideraremos lo siguiente: " La conciencia de la posicin, a travs de dispositivos baratos de SPG " Los acelermetros de mano, como esos encontraron en el Nintendo Wii remoto " Mashups, a menudo combinndose hace mapas con otra informacin Varios programas populares del Androide usan estos conceptos para crear uno ms Compeliendo y la experiencia pertinente para el usuario. Por ejemplo, la Localidad El application1 puede adaptar los trasfondos en su telfono basado en donde usted Es. Es a usted siempre olvidar colocar su botn 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 posicin descrita aqu. 8.1 la Posicin, la Posicin, la Posicin Ahora mismo hay 31 satlites cerrando con zper alrededor del mundo con nada Mejore para hacer que la ayuda a la que usted encuentra su camino la tienda de comestibles. El sistema de posicin global (el SPG), originalmente desarrollado por las fuerzas armadas Pero luego convirti para el uso del civil, las vigas las seales horarias altamente precisas Para aparatos receptores basados en tierras como el mismo en su telfono Android. Con La buena recepcin y un poco de matemticas, el chip de SPG pueden resolver su posicin Para dentro de 50 feet.2 Le deja el Gps Alguien el Entrometido saber Mi Location? No. Los aparatos receptores de Gps son simplemente que _ los aparatos receptores. El chip de Gps, y As de cualquier programa corriendo en su dispositivo Android, sabe dnde Es. Pero a menos que uno de esos programas deliberadamente transmita eso La informacin, nadie lo puede usar encontrarle. Adems del Gps, el Androide tambin le da apoyo a calcular su posicin La informacin utilizadora de telfono celular cercano se encumbra, y si usted est conectado Para un wifi hotspot, puede usar eso tambin. Mantenga en mente que todos estos Los proveedores de la posicin son poco confiables hasta cierto punto. Cuando usted camina adentro Un edificio, por ejemplo, las seales de Gps no le pueden alcanzar. Demostrar los servicios de la posicin de Androide, nos dej escribir un programa de prueba Eso simplemente exhibe su posicin actual y se mantiene actualizndola adelante lo La pantalla como usted la maniobra aproximadamente. Usted puede ver el programa en Figura 8.1, adelante

GARCIA JIM
La siguiente pgina. Dnde Estoy Yo? Comience por crear un "hola," una aplicacin del "androide" usando estos parmetros En el mago Nuevo de Proyecto: Project name: LocationTest Build Target: Android 1.6 Application name: LocationTest Package name: org.example.locationtest Create Activity: LocationTest El acceso para la informacin de la posicin est protegido por permisos del Androide. Para Logre entrar, usted necesitar echar estas lneas lo AndroidManifest.xml file before the <application> tag: Download LocationTest/AndroidManifest.xml <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> En este ejemplo, ambos proveedores de la posicin de grano fino como el SPG y Los proveedores veteados en curso de la posicin como la triangulacin de la torre de la clula lo harn Sea soportado.

Figura 8.1: Examinando Al LocationManager

GARCIA JIM
Para la interfaz de usuario, vamos a imprimir todos los datos de la posicin en uno TextView grande que enrolla, cul est definido en res/layout/main.xml: Download LocationTest/res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.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, podemos iniciar codificacin. Aqu est lo El contorno de la clase LocationTest y el mtodo onCreate (). (Ignore Lo La referencia para LocationListener en lnea 15 por ahora; Le regresaremos Ms tarde.)
Download LocationTest/src/org/example/locationtest/LocationTest.java Line 1 package org.example.locationtest; - import java.util.List; 5 import android.app.Activity; - import - import

android.location.Criteria; android.location.Location; - import android.location.LocationListener; - import android.location.LocationManager; 10 import android.location.LocationProvider; - import android.os.Bundle; - import android.widget.TextView;
- public

class LocationTest extends Activity implements { - private LocationManager mgr; - private TextView output; - private String best;
15 LocationListener 20 @Override - public

void onCreate(Bundle savedInstanceState) {

- super.onCreate(savedInstanceState); - setContentView(R.layout.main); 25 mgr = (LocationManager) getSystemService(LOCATION_SERVICE); - output = (TextView) findViewById(R.id.output); - log("Location providers:" ); - dumpProviders(); 30 - Criteria criteria = new - best

Criteria(); = mgr.getBestProvider(criteria, true); - log("\nBest provider is: " + best);


35 log("\nLocations - Location

(starting with last known):" ); location = mgr.getLastKnownLocation(best); - dumpLocation(location); -} -}

GARCIA JIM
El punto de puesta en marcha para los servicios de la posicin del Androide es el getSystemService () Llame en lnea 25. Devuelve una clase LocationManager que economizamos en uno El campo para uso ms adelante. En lnea 29, llamamos nuestro mtodo dumpProviders () a imprimir una lista de todo el Los proveedores de la posicin en el sistema. Despus necesitamos escoger uno de los proveedores posibles para usar. He visto Algunos ejemplos que simplemente escogen lo primer disponible, excepto recomiendan a usar el mtodo getBestProvider (), como mostrado aqu. La voluntad del androide Escoja al mejor proveedor segn una Criteria que usted provee (vea lnea 31). Si usted tiene cualquier restricciones en el costo, poder, la exactitud, etctera, Esto est donde usted los pone. En este ejemplo, no hay restricciones. A merced del proveedor, puede tomar bastante tiempo para el dispositivo para Resuelva su posicin actual. ste podran ser algunos segundos, un minuto, O ms. Sin embargo, el Androide recuerda la ltima posicin que devolvi, as Podemos poner en duda y podemos imprimir eso inmediatamente en lnea 36. Esta posicin podra Est atrasado de noticias _ por ejemplo, si el dispositivo estuviese apagado y emocionado Pero es usualmente mejor que nada. Saber dnde fuimos es slo la mitad de diversin. Dnde vamos nosotros despus? Actualizando la Posicin Tener al Androide le notifica acerca de posicin cambie, llama a los requestLocationUpdates () El mtodo en el objeto LocationManager. Para ahorrar batera El poder, nosotros que las actualizaciones de faltante slo cuando el programa estn en primer plano. Por consiguiente, necesitamos engarzarnos en los mtodos de ciclo biolgico de actividad del Androide Pasando sobre la disposicin de onResume () y onPause (): Download LocationTest/src/org/example/locationtest/LocationTest.java @Override protected void onResume() { super.onResume(); // Start updates (doc recommends delay >= 60000 ms) mgr.requestLocationUpdates(best, 15000, 1, this); } @Override protected void onPause() { super.onPause(); // Stop updates to save power while app paused mgr.removeUpdates(this); } Cuando la aplicacin vuelve a la carga, llamamos a requestLocationUpdates () a empezar El proceso de actualizacin. Toma cuatro parmetros: El nombre del proveedor, uno El retraso (los cambios (as es que usted no obtiene actualizaciones demasiadas veces), una distancia mnima Menos de esto est ignorado), y un objeto LocationListener. Cuando la hoja de solicitud toma una pausa, llamamos a removeUpdates () a dejar de llegar Actualiza. La proveedora de la posicin ser pelusa accionada si no es necesaria Por algn rato. Ahora usted sabe por qu implementa LocationTest LocationListener, 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. Eso nos salvar acerca de 1KB de memoria en runtime. Aqu est la definicin de los cuatro mtodos requeridos por esa interfaz:

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 mtodo ms importante en el racimo es onLocationChanged (). Como el nombre sugiere, es designado cada vez que el proveedor nota eso La posicin del dispositivo ha cambiado. El onProviderDisabled ((), onProviderEnabled ), y onStatusChanged () que los mtodos pueden usarse para cambiar para otro Los proveedores en caso su primera eleccin se vuelve agotada. El cdigo para los dems mtodos de leo LocationTest ((), dumpProviders ), y la dumpLocacin () 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 Emulacin Si usted corre el ejemplo LocationTest en un dispositivo verdadero, saldr a la vista su La posicin actual como usted el paseo aproximadamente. En el emulador, usa una estafa El proveedor de SPG que siempre devuelve la misma posicin a menos que usted cambia Eso. Hagamos eso ahora. En Eclipse usted puede cambiar su posicin 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 botn Send, El eclipse enviar la posicin nueva al dispositivo emulado, y usted ver Exhibi en cualquier programas que lo esperan. Usted tambin puede correr el programa DDMS fuera de Eclipse y puede enviar estafa La posicin cambia de esa manera. Adems de manual, la posicin en un tiempo Actualiza, usted puede usar una lectura grabada del camino de un archivo externo. Vea La documentacin DDMS para ms information.3 Con proveedores de la posicin del Androide, usted puede averiguar donde usted est dentro uno El sentido amplio, global. Si usted quiere ms informacin local como inclinacin y La temperatura, usted tiene que usar un API. diferente Que es el tema de lo La siguiente seccin. 8.2 Colocan A Sensors para Maximum Digmosle 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 sera 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 botn 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, inclnese hacia adelante cuando La aceleracin, y el tirn echan para atrs al adoptar las suspensiones. No lo hara que sea Enfrese si esos movimientos realmente tuvieron algn 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 aceleracin en la x, y, y hachas z " TYPE_LIGHT Le dice qu tan brillante su rea circundante es " TYPE_MAGNETIC_FIELD: Devuelve atraccin magntica en la x, y, y Las hachas de la z " TYPE_ORIENTATION: Mide la guiada, el tono, y rollo de lo El dispositivo " TYPE_PRESSURE: Siente la presin atmosfrica actual " TYPE_PROXIMITY: Provee la distancia entre el sensor y Algn objeto " TYPE_TEMPERATURE: Mide la temperatura de lo circundante El rea No todos los dispositivos ofrecern 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 originarn bastante ms rpidamente, quiz Los centenares por segundo. Para ganar acceso a los sensores, usted primero llama por telfono lo El mtodo 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 mtodo onResume () a empezar Metiendo actualizaciones y unregisterListener () en su mtodo onPause () alto Obtenindolos. Interpretando Lecturas del Sensor El servicio del sensor llamar su mtodo onSensorChanged () todo el tiempo Un valor cambia. Debera 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 montn de valores en coma flotante. El tamao de lo El conjunto imponente depende del sensor particular; Por ejemplo, TYPE_ TEMPERATURE devuelve slo un valor, la temperatura en centgrado de grados. Usted aun no puede necesitar usar todos los nmeros devueltos. Para La instancia, si usted justamente necesita un rumbo proa brjula, usted puede usar la primera parte El nmero regres del sensor TYPE_ORIENTATION.

GARCIA JIM
Revolviendo las inscripciones del sensor (especialmente del acelermetro) en La informacin significativa es algo de un arte negra. Aqu hay algunos consejos Para mantener en mente: " Las lecturas del acelermetro son sumamente nerviosas. Usted necesitar alisar Expulse los datos usando alguna clase de premediacin oprimida, pero usted lo ha hecho Cuidarse de no alisarle demasiado, o su interfaz sentir El laggy y suave. " Los nmeros del sensor vendrn al azar por. Usted puede ponerse varios En fila, luego tenga un comps de espera, y luego reciba un racimo ms. No asuma una tasa constante agradable. " Intente aventajar al usuario prediciendo lo que van a hacer Despus. 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 algn grado de exactitud lo que la siguiente lectura vaya a ser Y el reaccionar principios bas en su prediccin. El uso ms desafiante de sensores es un juego de accin que requiere Una conexin individual de en medio cmo 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 Emulacin Segn Google, no cabe probar los sensores acostumbrando lo El emulador en absoluto. La mayora de computadoras no tienen un sensor ligero, un chip de SPG, O una brjula 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 propsitos. La forma que surte efecto es que usted asocia al emulador para otra aplicacin Funcionar con su computador de escritorio llam el Simulador del Sensor. El simulador muestra un cuadro de un telfono virtual y le deja moverlo Alrededor de adelante la pantalla con el ratn (vea Figura 8.2, en la siguiente pgina) 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 informacin La fuente.

GARCIA JIM

Figura 8.2: La falsificacin fuera de los sensores con el Simulador del Sensor Lo negativo es que usted tiene que modificar su cdigo de la fuente para hacerlo El trabajo. Vea el sitio Web OpenIntents para ms informacin si se desea Para probarlo. Mi recomendacin es olvidarme de emulacin del sensor y Atrape un dispositivo verdadero. Mantngase pellizcando sus algoritmos hasta eso Parece estar bien. Ahora que usted sabe las llamadas de bajo nivel para obtener su posicin y averiguacin Los sensores para nmeros como su brjula dirigiendo, con toda seguridad Las aplicaciones que usted puede olvidar tan y justamente puede usar el API. Google Maps 8.3 la Vista Panormica Una de las primeras "aplicaciones homicidas(killer apps )" para Ajax fue Google Maps.6 Using Java La letra y el XmlHttpRequest objetan, ingenieros Google crearon a un draggable, El espectador zumbable del mapa de alisado, sedoso que corri en cualquier trama moderna El navegador sin un plug-in. La idea fue rpidamente emulada por otros vendedores Como Corporacin Microsoft y Provinciano, pero la versin Google es discutiblemente Aquiete lo mejor.

GARCIA JIM

Figura 8.3: El mapa incrustado mostrando su posicin actual Usted puede usar estos mapas basados en la Web en Androide, quiz con uno incrustado El control WebView tan discutido en la Seccin 7.2, Web con una Vista, adelante Pgina 131. Pero la arquitectura de su aplicacin estara excesivamente con muchas curvas. Eso es por qu Google cre el control MapView. Incrustando A Un MapView Un MapView puede estar incrustado directamente en su aplicacin Android con Simplemente algunas lneas de cdigo. La mayor parte de la funcionabilidad de Google Hace Mapas, y Se engarza para sumar sus toques, es provisto (vea Figura 8.3). La clase MapView tambin puede relacionarse con su posicin y proveedores del sensor. Puede mostrar su posicin actual en el mapa y aun el despliegue una brjula Mostrando qu direccin usted se dirige. Creemos un programa de muestra Para demostrar unos cuantos de sus capacidades. Primero cree un "hola," una aplicacin del "androide" usando estos valores en lo El mago: Project name: MyMap Build Target: Google APIs (Platform: 1.6) Application name: MyMap Package name: org.example.mymap Create Activity: MyMap

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

GARCIA JIM
Si usted omite la > etiqueta de la biblioteca de usos, usted traer a un ClassNotFoundException En runtime. Adems de los proveedores de la posicin buena y de grano grueso, 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. Estos sern escondidos en reserva en su aplicacin El directorio automticamente. Aqu est el contorno de la clase MyMap: Download MyMap/src/org/example/mymap/MyMap.java package org.example.mymap; import android.os.Bundle; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; import com.google.android.maps.MyLocationOverlay; public class MyMap extends MapActivity { private MapView map; private MapController controller; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initMapView(); initMyLocation(); } @Override protected boolean isRouteDisplayed() { // Required by MapActivity return false; } } La parte ms importante es que su actividad tiene que extender a MapActivity. El MapActivity que la clase hace girar arriba del trasfondo avanza con pies de plomo, est conectado para La Internet para datos de la tile, manipula esconder en reserva, hace animaciones, cautela de tomas de El ciclo biolgico, y bastante ms. Todo lo que usted necesita hacer es correctamente determinado eso arriba Y el alquiler eso el empuje. Alistndose La primera cosa que necesitamos hacer es llamada findViewById () al que ganar acceso lo MapView y su envase. Podemos hacer eso en el mtodo initMapView (): Download MyMap/src/org/example/mymap/MyMap.java /** Find and initialize the map view. */ private void initMapView() { map = (MapView) findViewById(R.id.map); controller = map.getController(); map.setSatellite(true); map.setBuiltInZoomControls(true); }

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

GARCIA JIM
Las Notas de Emulacin La primera vez que usted corra el programa MyMap en el emulador usted puede llegar Un Android AVD Error. Siga las direcciones en la Seccin 1.3, Creating uno AVD, adelante mande a llamar 20 para crear a un AVD nuevo para lo "hacen bsquedas en la Internet usando Google que APIs" construyen blanco "Em15google" designado. En el emulador, usted inicialmente ver un zoomed expulsar mapa del mundo y Ningn punto para su posicin actual. Como antes, use el Control del Emulador La vista en proceso de desaparicin (o en el programa DDMS autnomo) para alimentar GPS falso Los datos para la aplicacin de muestra. Al correr en el emulador, el encarte de la brjula no ser mostrado Porque el sensor de la brjula no es emulado. 8.4 Avances Rpidos Este captulo le inici en el Nuevo Mundo excitante de posicin y La computacin mvil consciente medioambiental. Estas tecnologas, en combinacin Con tendencias como la adopcin de Internet del mvil de banda ancha Y el crecimiento exponencial de computar poder y almacenamiento, es Yendo para revolucionar la forma le interactuamos computadoras y Cada quien. Otra forma de percibir el mundo es mirando y escuchando. El androide Provee el class9 Camera para fotografiar usando lo incorporado La cmara (si hay uno), pero usted tambin lo puede usar hacer otras cosas como Haga una lectora de cdigo de barras. El MediaRecorder Class10 le deja registro Y los clips audios de la tienda. Estos trascienden el alcance de este libro, pero si Usted los necesita para su programa, consltele la documentacin en lnea. Hablando de almacenamiento, el siguiente captulo le mostrar cmo usar lenguaje normalizado de consulta Almacenar estructur informacin (por ejemplo, un leo de viaje de posiciones, Las fotos, y las notas) localmente en su telfono mvil. Si eso no es su El rea de inters, a usted puede pasrsele delante para Chapter 10, 3D Graphics adentro OpenGL, adelante mande a llamar 191 y aprenda a desenllavar el 3D escondido de Android El potencial de grficos.

GARCIA JIM

En Captulo 6, Almacenando Datos Locales, en pgina 116, explor mantenerse los datos alrededor en las Preferencias y en archivos simples. Que las obras multan cuando lo la cantidad de datos es pequea o cuando los datos es todo un tipo (tan uno la foto o un archivo de audio). Sin embargo, hay una mejor forma para almacenar grande las cantidades de datos estructurados: una base de datos relacional. Por los pasados 30 aos, las bases de datos han sido una grapa de aplicacin de la empresa El desarrollo, pero hasta hace poco fueron muy caras y dificultoso para el uso de escala ms pequea. Eso es cambiante con en trozos pequeos incorporado los motores como el incluido con la plataforma del Androide. Este captulo le mostrar cmo usar incorporada base de datos del Androide Motor, SQLite. Usted tambin aprender a usar los datos de Androide teniendo fuerza obligatoria para conecte sus fuentes de datos para su interfaz de usuario. Finalmente, usted mirar en la clase ContentProvider, que deja dos aplicaciones compartir lo mismos datos. 9.1 Introduciendo SQLite El SQLite1 es un motor de la base de datos diminuto pero energtico creado por Dr. Richard Hipp en 2000. Es discutiblemente la mayor parte de base de datos de lenguaje normalizado de consulta ampliamente utilizada el motor en el mundo. Adems de Androide, SQLite puede ser encontrado en la Apple IPhone, Symbian llama por telfono, Mozilla Firefox, Skype, PHP, AIRE Adobino, computadora Mac La x del sistema operativo, Solaris, y muchos otros lugares. El SQLite License El cdigo de la fuente del SQLite no contiene licencia porque est de moda lo Dominio pblico. En lugar de una licencia, la fuente le ofrece esto Bendicin: Que usted pueda obrar bien y no maldad. Que usted pueda encontrar perdn para usted mismo y puede perdonar a los otros. Que usted pueda compartir libremente, nunca tomando ms de lo que usted da. Hay tres razones por qu es tan popular: "Es gratis. Los autores lo han colocado en el dominio pblico y no hacen haga un cargo por su uso. "Es pequeo. La versin actual se trata de 150KB, bien dentro lo el presupuesto de memoria de un telfono del Androide. "No requiere plan o administracin. No hay servidor, ningn config El archivo, y ninguna necesidad para un administrador de la base de datos.

Captulo 9 Poniendo a trabajar lenguaje normalizado de consulta

GARCIA JIM
Una base de datos del SQLite es simplemente un archivo. Usted puede tomar ese archivo, lo puede mover de un lado para otro, e incluso lo copia para otro sistema (por ejemplo, de su telfono para su estacin de trabajo), y eso surtir efecto muy bien. El androide almacena el archivo en lo / el directorio de /packagename/databases de datos /datos (vea Figura 9.1, en lo siguiente La pgina). Usted puede usar la orden del adb o la vista del Explorador del Archivo En Eclipse (> el Otro de Vista de > Espectculo de la Ventana ... el Explorador del > Archivo del > Androide) para La vista, la maniobra, o lo borra. En lugar de llamar Java Yo las rutinas de la /O para ganar acceso a este archivo de su programa, usted maneja (el lenguaje normalizado de consulta) declaraciones Estructuradas de Lenguaje de Consulta. A travs su ayudante clasifica y mtodos de conveniencia, cueros del Androide una cierta cantidad de lo la sintaxis de usted, pero usted todava necesita saber un poquito de lenguaje normalizado de consulta para usarlo. 9.2 SQL 101 Si usted ha utilizado a la Oracle, el Servidor de lenguaje normalizado de consulta, MySQL, DB2, u otra base de datos Motores, en ese entonces el lenguaje normalizado de consulta debera estar pasado de moda para usted. Usted puede saltarse esta seccin y el empuje para la Seccin 9.3, Al, la Base de Datos, en pgina 174. Por lo dems de usted, aqu un refresco rpido.

Figura 9.1: El SQLite almacena una entera base de datos en un archivo. Para usar una base de datos de lenguaje normalizado de consulta, usted propone declaraciones de lenguaje normalizado de consulta y regresa Resultados. Hay tres tipos principales de declaraciones de lenguaje normalizado de consulta: Lenguaje de descripcin de datos, Modificacin,Y la Averiguacin.

GARCIA JIM
Las declaraciones de lenguaje de descripcin de datos DDL Statements Un archivo de la base de datos puede tener cualquier nmero de mesas. Una mesa consiste en filas, y cada fila tiene un cierto nmero de columnas. Cada columna de lo la mesa hace un nombre y unos datos determinar el tipo sanguneo (avise por escrito cuerda, nmero, y as sucesivamente). Usted define estas mesas y la columna nombra por primero Definicin corredora de Datos Las declaraciones de lenguaje (el lenguaje de descripcin de datos). Aqu hay una declaracin 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 nmero 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 Convencin, la primera columna es siempre llamado _ id. La columna de _ id no es estrictamente requeridos para SQLite, pero ms tarde cuando queremos utilizar a un Androide ContentProvider, lo necesitaremos. para poner en marcha la simple y constitucin 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 cdigo 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 ttulo. _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 Despus 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 creacin de la base de datos y versiones. Todo lo que usted necesita hacer es proveer un constructor y sobresueldo dos mtodos.
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 lnea 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 nmero que hacemos. Si esto fuera un verdadero programa, usted aumentara el nmero de versin cada vez que usted tuvo para hacer cambios significativos el diseo 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 mtodo onCreate () para crearlo. En lnea 21, pasamos sobre la disposicin de eso y corremos uno CREA declaracin 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 nmero de versin), llamar al mtodo onUpgrade (la lnea 28) (). Adentro este ejemplo, slo borramos la vieja mesa, pero usted podra hacer algo ms listo aqu si Ud. quiere. Por ejemplo, usted podra manejar un lenguaje normalizado de consulta ALTER TABLE SQL capitanee aadirle 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 mostrarn 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 slo 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 Interacte, usted ver al Androide que los programadores utilizaron lo mismo truco. Comenzando con Java 5, sin embargo, hay una mejor forma: La esttica Importaciones. Ese es el mtodo que usar en EventsData y otro las clases en este captulo. Desde las Constantes est una interfaz, usted lo puede hacer sele la vieja forma o el nuevo mtodo como usted escoge. Desafortunadamente, a partir de esta escritura, el soporte del Eclipse para la esttica las importaciones es un poco lleno de manchas, as que si usted usa importaciones estticas en la suya Programas, Eclipse no pueden insertar las declaraciones del artculo importado para usted Automticamente. Aqu hay un truco pequeo para usuarios del Eclipse: escriba un comodn el artculo importado esttico despus de la declaracin del paquete (por ejemplo, org.example.events.Constants de esttica del artculo importado.*;) para hacer cosas compile. Ms tarde, usted puede usar Importaciones Originarias > Organize para expandir el comodn y tipo las declaraciones del artculo importado. Esperemos que esta voluntad sea ms intuitivo en versiones futuras de Eclipse.

GARCIA JIM
Defina el archivo del layout (el layout/main.xml) como sigue:
Download Eventsv1/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.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.id.text en cdigo secreto) y lo envuelve con un ScrollView en caso que hay demasiados Eventos para calzar bien en la pantalla. Usted puede ver cmo mira en Figura 9.2, en lo siguiente La pgina.

Figura 9.2: La primera versin exhibe registros de la base de datos en un TextView. El programa principal es el mtodo onCreate () en la actividad de Eventos. Aqu hay el contorno
Download Eventsv1/src/org/example/events/Events.java Line 1 package - import - import 5 import - import - import - import - import

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.app.Activity; android.content.ContentValues; android.database.Cursor; android.database.sqlite.SQLiteDatabase;

10 import - import - import -

android.os.Bundle; android.widget.TextView;

GARCIA JIM
- public

class Events extends Activity { EventsData events;

15 private -

- @Override - public

void onCreate(Bundle savedInstanceState) {

- super.onCreate(savedInstanceState); 20 setContentView(R.layout.main); -

events = new EventsData(this); {

- try -

addEvent("Hello, Android!" ); cursor = getEvents();

- Cursor

25 showEvents(cursor); -} -

finally {

events.close();

-} -} 30 }

En lnea 20 de onCreate (), colocamos el layout para esta vista. En ese entonces creamos una instancia de la clase EventsData en lnea 21 y de inicio un intento se bloquean. Si usted mira adelante para aplicarle delineador a 27, usted puede ver que cerramos la base de datos adentro lo finalmente bloquese. As es que aunque un error ocurra en el medio, la base de datos lo har todava est cerrado. Table evento no sera muy interesante si no hubiera ningn evento tan en lnea 23 llamamos al mtodo addEvent () para aadirle un acontecimiento a l. Cada el tiempo que usted maneja este programa, usted recibir un nuevo acontecimiento. Usted podra sumar menes o los gestos o los teclazos para generar otros Eventos si Ud. quiere, pero lo har salga que como un ejercicio para el lector. En lnea 24, llamamos al mtodo getEvents () para conseguir la lista de Eventos, y finalmente en lnea 25, llamamos al mtodo showEvents () para exhibir la lista para el usuario. Bastante fcil, eh? Ahora definamos esos nuevos mtodos que acabamos de usar. Sumando Una Fila El mtodo addEvent () corta un nuevo registro en la base de datos acostumbrando lo la cuerda provista como el ttulo de acontecimiento.
Download Eventsv1/src/org/example/events/Events.java

private void addEvent(String string) { // Insert a new record into the Events data source. // You would do something similar for delete and update. SQLiteDatabase db = events.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(TIME, System.currentTimeMillis()); values.put(TITLE, string); db.insertOrThrow(TABLE_NAME, null, values); }

GARCIA JIM
Desde que necesitamos modificar los datos, llamamos a getWritableDatabase () a llegar una lectura/escribe agarradera para la base de datos de Eventos. La agarradera de la base de datos es Escondido en reserva, as es que usted puede llamar a este mtodo cuantas veces a usted le guste. Despus rellenamos un objeto ContentValues con el tiempo actual y el acontecimiento el ttulo y el paso que para el mtodo insertOrThrow () para hacer el INSERTO real La declaracin de lenguaje normalizado de consulta. Usted no necesita pasar en el Idaho discogrfico porque el SQLite har se mantiene un paso adelante y regresa eso de la llamada de mtodo. Como el nombre entraa, insertOrThrow (de tipo () puede tirar algo nico en su gnero La SQLExcepcin) si fracasa. No tiene que ser declarado con una palabra clave de lanzamientos porque es un RuntimeException y no una excepcin revisada. Sin embargo, si usted quiere, usted todava puede maniobrar eso en un bloque de intento /cogida como cualquier otra excepcin. Si usted no lo maniobra y hay un error, el programa Terminar la relacin, y un traceback ser echado para el leo del Androide. Por defecto, tan pronto como usted haga el inserto, la base de datos est actualizada. Si usted la necesidad para cantidad de cosas arriba o las modificaciones de retraso por alguna razn, la consulta lo El sitio Web del SQLite para ms detalles. Manejando a Query El mtodo getEvents () hace el Query de la base de datos para conseguir una lista de Eventos:
Download Eventsv1/src/org/example/events/Events.java

private static String[] FROM = { _ID, TIME, TITLE, }; private static String ORDER_BY = TIME + " DESC" ; private Cursor getEvents() { // Perform a managed query. The Activity will handle closing // and re-querying the cursor when needed. SQLiteDatabase db = events.getReadableDatabase(); Cursor cursor = db.query(TABLE_NAME, FROM, null, null, null, null, ORDER_BY); startManagingCursor(cursor); return cursor; }

No necesitamos modificar la base de datos para una Query, as es que llamamos a getReadableDatabase ( ) para conseguir una agarradera de slo lectura. En ese entonces llamamos a la Query () para actuar la declaracin SELECT sql real de lenguaje normalizado de consulta. DE es un montn de las columnas queremos, y ORDER_BY distingue SQLite para devolver los resultados en orden de ms nuevo para ms viejo. Aunque no los usemos en este ejemplo, el mtodo de Query () lo ha hecho los parmetros para especificar una clusula WHERE, un GROUP BY clusula, y uno HAVING Clusula. En verdad, la Query () es simplemente una conveniencia para el programador. Si usted escoge, usted podra acumular la declaracin SELECTA por usted mismo en una cuerda y el uso el mtodo rawQuery () para ejecutarlo. De una u otra manera, el regreso el valor es un objeto del Cursor que representa el set de resultado.

GARCIA JIM
Un Cursor es similar a una Java Iterator o un JDBC ResultSet. Usted llama a los mtodos en eso para informarse acerca de la fila actual, y en ese entonces usted llama a otro mtodo a mudarse a la siguiente fila. Veremos cmo usarlo cuando exhibimos los resultados en un momento. El paso final es llamar a startManagingCursor (), que dice la actividad a encrguese de manejar el ciclo biolgico del cursor basado en la vida de la actividad Ciclo. Por ejemplo, cuando la actividad es hecha una pausa, lo har automticamente desactive el cursor y entonces repngalo en duda cuando la actividad es vuelta a arrancar. Cuando la actividad se termina, todos los cursores administrados estarn cerrados. Exhibiendo los Resultados de Query El ltimo mtodo que necesitamos definir es showEvents (). Esta funcin toma uno El cursor como el aporte y los formatos la salida as es que el usuario lo puede leer.
Download Eventsv1/src/org/example/events/Events.java Line 1 private - //

void showEvents(Cursor cursor) {

Stuff them all into a big string builder = new StringBuilder(

- StringBuilder - "Saved 5 while - //

events:\n" );

(cursor.moveToNext()) {

Could use getColumnIndexOrThrow() to get indexes id = cursor.getLong(0); time = cursor.getLong(1); title = cursor.getString(2); " ); " ); );

- long - long

- String

10 builder.append(id).append(":

- builder.append(time).append(":

- builder.append(title).append("\n" -} - //

Display on the screen text = (TextView) findViewById(R.id.text);

15 TextView

- text.setText(builder); -}

En esta versin de Eventos, vamos justamente a crear una cuerda grande (vea lnea 3) para sujetar todos los artculos de Eventos, separados por newlines. Esto no es lo la forma recomendada para hacer cosas, sino surtir efecto por ahora. Aplquele delineador a 5 llamadas el mtodo Cursor.moveToNext () para avanzar a la siguiente fila en el conjunto de datos. Cuando usted primero consigue un Cursor, es colocado antes lo primero registre, as llamar Cursor.moveToNext( ) le lleva al primer registro. Nos mantenemos girar hasta moveToNext () devuelve falaz, que indica all es no ms filas. Dentro del lazo (lnea 7), llamamos a getLong () y getString () a ir a traer datos de las columnas de inters, y en ese entonces anexa los valores para lo Cuerda (lnea 10). Hay otro mtodo en Cursor, getColumnIndex OrThrow (), que pudimos haber solido recibir los nmeros ndice de la columna (los valores 0, 1, y 2 pasaron para getLong () y getString ()). Sin embargo, es un poco lento, as que si usted lo necesita, usted le debera llamar fuera del lazo y recuerde los ndices por usted mismo.

GARCIA JIM
Una vez todas las filas han sido procesadas, vamos a visitar al TextView de / main.xml del layout y cosas la cuerda grande en eso (lnea 15). Si usted maneja el ejemplo ahora, usted debera ver algo as como Figura 9.2, en pgina 178. Las felicitaciones en su primera base de datos del Androide programan! Hay mucho campo para la mejora, sin embargo. Qu pasara si hubiera miles o millones de Eventos adentro La lista? El programa sera muy lento y podra quedarse sin memoria intentando construir una cuerda para sujetarlos a todos ellos. Qu ocurre si usted quisiera dejar a lo El usuario selecciona un acontecimiento y hace algo con l? Si todo est dentro uno Cuerda, usted no puede hacer eso. Afortunadamente, el Androide provee una mejor forma: Datos Obligatorio. Atadura de 9.4 Datos El atar datos le deja asociar su modelo (los datos) para su vista con simplemente algunas lneas de cdigo. Para demostrar datos teniendo fuerza obligatoria, modificaremos lo El ejemplo de Eventos para utilizar a un ListView que est obligado con el resultado de una base de datos Query. Primero, necesitamos hacer la clase de Eventos extender a ListActivity en lugar de eso De Actividad:
Download Eventsv2/src/org/example/events/Events.java

import android.app.ListActivity; // ... public class Events extends ListActivity { // ... }

Despus, necesitamos cambiar cmo son los Eventos exhibidos en los Eventos. el mtodo showEvents ():
Download Eventsv2/src/org/example/events/Events.java

import android.widget.SimpleCursorAdapter; // ... private static int[] TO = { R.id.rowid, R.id.time, R.id.title, }; private void showEvents(Cursor cursor) { // Set up data binding SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.item, cursor, FROM, TO); setListAdapter(adapter); }

GARCIA JIM
Note que este cdigo es muy ms pequeo que antes (dos lneas vs. diez). Lo la primera lnea crea a un SimpleCursorAdapter para el Cursor, y el segundo el verso le dice al ListActivity que use el nuevo adaptador. El adaptador acta como uno El mediador, asociando la vista con su fuente de datos. Si usted recuerda, primero usamos un adaptador en el programa de muestra Translate (vea a Translate.setAdapters () en la Seccin 7.4, Usando Web Repara, adelante Pgina 143). En ese ejemplo, utilizamos a un ArrayAdapter porque los datos la fuente fue un personal del jurado definido en XML. Para este, utilizamos a un SimpleCursorAdapter porque la fuente de datos es un Cursor objeto que vino de un Query de la base de datos. El constructor para SimpleCursorAdapter toma cinco parmetros: "El context: : Una referencia para la Actividad actual "El layout : Un recurso que define los puntos de vista para un solo artculo 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 artculo de la lista est definido en/item.xml del layout. Note las definiciones para el fila Idaho, el tiempo, y los puntos de vista del ttulo que se estableci referencias para en el conjunto imponente the TO array
Download Eventsv2/res/layout/item.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.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=": "

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>.

Esto se ve ms complicado que eso. Todo lo que estamos haciendo est poniendo el Idaho, El tiempo, y el ttulo en una lnea con dos puntos en medio de los campos. Sum uno poco relleno y formateando para hacerles lucir bien. Finalmente, necesitamos cambiar el layout por la actividad misma en layout Main.xml. Aqu est la nueva versin:
Download Eventsv2/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-- 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, el Androide busca dos especial Los ides en el archivo del layout. Si la lista tiene artculos en ella, el androide:la vista de id /lista ser exhibido; De otra manera, el androide:el id la vista/hueca ser exhibido. As que si no hay artculos, en lugar de una pantalla en blanco que el usuario ver lo Mensaje " Ninguno de los Eventos! Aqu estn los recursos de la cuerda que necesitamos:

GARCIA JIM
Download Eventsv2/res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Events</string> <string name="empty">No events!</string> </resources>

Para el resultado final, vea Figura 9.3, adelante lo en la otra pgina. Como un ejercicio para el lector, idea de aproximadamente cmo podra realzar usted esta aplicacin ahora que usted tiene una lista real con la que jugar. Por ejemplo, cuando el usuario hace una seleccin un Eventos, usted podra abrir a un espectador de detalle, podra enviar por correo el Eventos para tcnico Soporte, o quiz borre el Eventos seleccionado y todo el que est debajo de l de la base de datos.

Figura 9.3: Esta versin utiliza a un ListActivity y datos teniendo fuerza obligatoria. Hay todava un problema pequeo con este ejemplo. Ninguna otra aplicacin Le pueden aadir las cosas a la base de datos de acontecimientos o incluso mirada en ellas! Para Eso, necesitaremos utilizar a un Android ContentProvider.

GARCIA JIM

9.5 Utilizando A Un ContentProvider En el modelo de medidas de seguridad del Androide (vea la discusin arriba de en la Seccin 2.5, La caja fuerte y Secure, adelante mandan a llamar 38), los archivos escritos por una aplicacin no pueden ser lea de o escrito para por alguna otra aplicacin. Cada programa tiene su Posea identificacin de usuario Linux y gua de datos (/datos/packagename) y el suyo protegi espacio de memoria. 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 Definicin de la Interface del Androide (AIDL) y la interfaz del IBinder. Los parmetros son colocados sin ningn dao y eficazmente entre los procesos cuando la API es llamada. Esto avanz la tcnica 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. Cuando esa informacin es pedida, son llamados por Androide a travs de una API fija para poner en duda o modifica el contenido de cualquier modo que vean ataque. Esto es lo la tcnica que vamos a destinar para los Eventos la muestra. Cualquier trozo de informacin administrado por un ContentProvider es tratado a travs de un URI que se parece a esto: Content://authority/path/id Dnde: "content:// es el prefijo requerido estndar. "authority es el nombre del proveedor. Acostumbrando su completamente capacitado el nombre del paquete se recomienda prevenir colisiones de nombre. "path es un directorio virtual dentro del proveedor que identifica lo la clase de ser datos pidi. "id es la llave primaria de un registro especfico siendo pedido. Para pida todos los registros de un tipo particular, omita esto y el arrastramiento La cuchillada. El androide viene con varios proveedores ya construido adentro, incluyendo lo Siguiente content://browser content://contacts content://media content://settings Demostrar utilizar a un ContentProvider, nos dej convertir el ejemplo de Eventos para utilizar uno. Para nuestro proveedor de Eventos, stos sern URIs vigentes:
content://org.example.events/events/3 -- single event with _id=3 content://org.example.events/events -- all events

GARCIA JIM
Primero necesitamos aadirle unas dos constantes ms a Constants.java: Download Eventsv3/src/org/example/events/Constants.java import android.net.Uri; // ... public static final String AUTHORITY = "org.example.events" ; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME); Los archivos del layout (main.xml e item.xml) no necesitan variarse, as lo el siguiente paso es hacer algunos cambios menores para la clase de Eventos Cambiando el Programa Principal El mtodo principal de programa (el Events.onCreate ()) en verdad consigue un poco ms simple porque no hay base de datos objeto al que seguirle la pista:
Download Eventsv3/src/org/example/events/Events.java

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); addEvent("Hello, Android!" ); Cursor cursor = getEvents(); showEvents(cursor); }

No necesitamos el intento/finalmente bloque, y podemos eliminar referencias para EventData. Sumando Una Fila Adding a Row Dos lneas cambian en addEvent (). Aqu est la nueva versin:
Download Eventsv3/src/org/example/events/Events.java

import static org.example.events.Constants.CONTENT_URI; private void addEvent(String string) { // Insert a new record into the Events data source. // You would do something similar for delete and update. ContentValues values = new ContentValues(); values.put(TIME, System.currentTimeMillis()); values.put(TITLE, string); getContentResolver().insert(CONTENT_URI, values); }

GARCIA JIM

La llamada para getWritableDatabase () se va, y la llamada para insertOrThrow () es reemplazado por getContentResolver () .insert (). En lugar de una agarradera de la base de datos, usamos un content URI. Manejando Una Query El mtodo getEvents () es tambin simplificado al utilizar a un ContentProvider:
Download Eventsv3/src/org/example/events/Events.java

private Cursor getEvents() { // Perform a managed query. The Activity will handle closing // and re-querying the cursor when needed. return managedQuery(CONTENT_URI, FROM, null, null, ORDER_BY); }

Aqu usamos el mtodo Activity.managedQuery (), pasndole el contenido URI, la lista de columnas en la que estamos interesados, y la orden que deberan sea ordenado adentro. Eliminando todas las cartas de recomendacin para la base de datos, tienen, desacopl los Acontecimientos el cliente del proveedor de datos de Acontecimientos. El cliente es ms simplista, pero ahora nosotros tenga que implementar una nueva pieza que no tuvimos antes. 9.6 Implementando A Un ContentProvider Un ContentProvider es un objeto de alto nivel como una Actividad que necesita serlo declarado para el sistema. Entonces, el primer paso al hacer a uno es sumar eso para su archivo AndroidManifest.xml delante de la > etiqueta de <activity> (como un nio de < la aplicacin > ): Download Eventsv3/AndroidManifest.xml <provider android:name="EventsProvider" android:authorities="org.example.events" /> Androide:el nombre es el nombre de clase, y androide:las autoridades es string usada en el content URI. Despus creamos la clase EventsProvider, que debemos extender Contenido Proveedor. Aqu est el contorno bsico:
Download Eventsv3/src/org/example/events/EventsProvider.java

package org.example.events; import static android.provider.BaseColumns._ID; import static org.example.events.Constants.AUTHORITY; import static org.example.events.Constants.CONTENT_URI; import static org.example.events.Constants.TABLE_NAME; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor;

GARCIA JIM
import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.text.TextUtils; public class EventsProvider extends ContentProvider { private static final int EVENTS = 1; private static final int EVENTS_ID = 2; /** The MIME type of a directory of events */ private static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.example.event" ;

/** The MIME type of a single event */ private static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.example.event" ; private EventsData events; private UriMatcher uriMatcher; // ... }

Por convencin usamos vnd.example en lugar de org.example en the MIME type.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 trminos del URI, la diferencia es que el primer tipo no especifica Un Idaho, pero el segundo tipo hace. Usamos la clase UriMatcher de Androide para analizar gramaticalmente al URI y decirnos cul el cliente especificado. Y nosotros reutilice la clase EventsData de ms temprano en el captulo para ingeniarse lo la real base de datos dentro del proveedor. En inters de espacio, no estoy sirviendo para demostrar el resto de la clase aqu, pero usted puede hacer un download de completamente todo del sitio Web del libro. Todos los tres las versiones del ejemplo de Acontecimientos pueden encontrarse en el archivo originario del .zip de cdigo. La versin final de la apariencia de muestra Events exactamente como lo previo la versin en el exterior (vea Figura 9.3, en pgina 185). Por dentro, Sin embargo, usted ahora tiene el armazn para un acontecimiento tienda que puede ser usado por otras aplicaciones en el sistema, incluso los unos escritos por otro Desarrolladores.

GARCIA JIM

9.7 Avances Rpidos En este captulo, aprendimos a almacenar datos en una base de datos de lenguaje normalizado de consulta del Androide. Si usted quiere hacer ms con lenguaje normalizado de consulta, usted necesitar enterarse de ms las declaraciones y las expresiones que los que cubrimos aqu. Un libro Como Gua del Bolsillo de lenguaje normalizado de consulta Gen06 por Jonathan Gennick o El Definitive Gue a SQLite Owe06 por Mike Owens sera una inversin productiva, pero tenga presente que la sintaxis de lenguaje normalizado de consulta y las funciones varan ligeramente de base de datos para base de datos. Otra opcin para el almacenamiento de datos en Androide es db4o.5 que Esta biblioteca es ms grande que SQLite y los usos una licencia diferente (lGNU Public License) pero es gratis y puede ser ms fcil para usted para acostumbrar, especialmente si usted no hace Sepa lenguaje normalizado de consulta. El SimpleCursorAdapter introdujo en este captulo puede estar hecho a la medida muestre ms de lo que slo avise por escrito. Por ejemplo, usted podra ostentar evaluar estrellas o los sparklines u otros puntos de vista basados en datos en el Cursor. Busque a ViewBinder en la documentacin SimpleCursorAdapter para ms information.6 Y ahora por algo completamente diferente ... el siguiente captulo cubrir Los grficos del 3D con OpenGL.

GARCIA JIM

Captulo 10 Los grficos del 3D en OpenGL


Los grficos de dos dimensiones son geniales para la mayora de programas, pero a veces usted necesita un nivel adicional de profundidad, interactividad, o realismo que no es posible en 2D. Por estas veces, el Androide provee uno tridimensional la biblioteca de grficos bas en el estndar DE EINSTENIO OpenGL. En este captulo, exploraremos conceptos del 3D y acumularemos un programa de muestra que acostumbra OpenGL. 10.1 Grficos Comprensivos del 3D El mundo es tridimensional, pero rutinariamente lo miramos en dos dimensiones. Cuando usted ve televisin o mira una foto en un libro, el 3D las imgenes son aplanadas fuera, o proyectadas, encima de una superficie del 2D (el panel de audiencia de TV o la pgina del libro). Pruebe este experimento simple: cubra un ojo y mire por la ventana. Qu ve usted? La luz del sol rebota contra objetos afuera, atraviesa la ventana, y viaja a su ojo as es que usted puede percibir Eso. En los trminos de grficos, la escena de afuera es proyectada encima de la ventana (o viewport). Si alguien reemplazara su ventana con una alta calidad La foto, se vera lo mismo hasta que usted se movi. Basado en qu tan cercano su ojo es para la ventana y qu tan grande la ventana Es, usted puede ver una cantidad limitada exterior del mundo. Esto es llamado su campo de vista. Si usted saca una lnea de su ojo a las cuatro esquinas de la ventana y ms all, usted metera la pirmide en Figura 10.1, en la siguiente pgina. ste es llamado el tronco de vista (latn para uno " el pedazo quebrado feriado "). Para las razones de funcin, el tronco est usualmente rodeado por ah acrquese y el recorte lejano cepilla tambin. Usted puede ver todo adentro el tronco pero nada fuera de eso.

GARCIA JIM

Figura 10.1: Mirando una escena tridimensional En grficos de computadora del 3D, su pantalla de la computadora acta como el viewport. Su trabajo es conducir al usuario con engao a pensar que es una ventana en otro el mundo simplemente adelante el otro lado del vaso. La biblioteca de grficos OpenGL es la API que usted usa para lograr eso ?. 10.2 Introducing OpenGL OpenGL1 fue desarrollado por Silicon Graphics en 1992. Provee uno unificado interacte para que programadores se aprovechen de hardware de cualquier Fabricante. En su corazn, OpenGL implementa conceptos familiares tan como viewports y alumbrado e intentos para esconder la mayor parte del estrato del hardware del desarrollador. Porque fue diseado para estaciones de trabajo, OpenGL es demasiado grande para equipar en un dispositivo mvil. Entonces, el Androide implementa un subconjunto de OpenGL llamado Gracias, John Carmack OpenGL ha resultado muy exitoso, pero casi no fue. En 1995, la Corporacin Microsoft le introdujo a un competidor llamado Direct3D. A causa de la posicin dominante de mercado de Corporacin Microsoft y significativo Las inversiones de investigacin y desarrollo, por algn rato pareci que Direct3D iba a la absorcin como una industria de facto estndar para jugar. Sin embargo, Uno, John Carmack, cofundador de Software de id, rehus para acceder. 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. Linux de hoy, La x del sistema operativo del impermeable, y los usuarios mviles del dispositivo pueden agradecer a Juan e id El software para ayudar a mantener el estndar OpenGL pertinente. OpenGL para Sistemas Incrustado (EL EINSTENIO OpenGL) .2 Este estndar fue creado por el Khronos Group, un consorcio de la industria de compaas algo semejante Como Intel, AMD, Nvidia, Nokia, Samsung, y Sony. La misma biblioteca

GARCIA JIM
(con diferencias menores) est ahora disponible en plataformas mviles principales Incluyendo a Androide, Symbian, e iPhone. Cada lenguaje tiene sus ataduras de lenguaje para EINSTENIO OpenGL, y Java no es excepcin. Java el atar lenguajes estaba definido por una Java La peticin de especificacin (JSR) 239.3 el Androide implementa este estndar como de cerca como posible, as es que usted puede referirse a una coleccin variada de libros y una coleccin variada de documentacin En JSR 239 y EINSTENIO OpenGL para una descripcin llena de todo su las clases y los mtodos. Ahora echmosle un vistazo cmo crear un programa simple OpenGL adentro Androide. 10.3 Fortaleciendo A Un OpenGL Program Empiece por crear un proyecto de "hola" nuevo ", del Androide" as como en la Seccin 1.2, Creating Su Primer Programa, en pgina 20, excepto este suministro de tiempo lo siguiente los parmetros en el Nuevo Androide Proyectan ventana de dilogo:
Project name: OpenGL Build Target: Android 1.6 Application name: OpenGL Package name: org.example.opengl Create Activity: OpenGL

Joe Asks. . . Tendr Cada Telfono 3D? S y no. Algn Androide que corre dispositivos inferiores no puede en verdad tenga hardware del 3D. Sin embargo, el OpenGL programando la interfaz todava estar all. Todas las funciones del 3D sern emuladas en software. Su programa todava correr, pero ser mucho ms lentamente que un dispositivo acelerado en hardware. Por esta razn, 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. De ese modo, si el usuario est corriendo su programa en un dispositivo ms lento, pueden lisiar una cierta cantidad de su caramelo del ojo para recibir mejor funcin. Esto crear OpenGL. Java para contener su actividad principal. Edite Esto, y lo cambia para referirse a una vista aduanera denominada GLView, como se muestra despus.
Download OpenGL/src/org/example/opengl/OpenGL.java

package org.example.opengl; import android.app.Activity; import android.os.Bundle; public class OpenGL extends Activity { GLView view; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); view = new GLView(this); setContentView(view);

GARCIA JIM
} @Override protected void onPause() { super.onPause(); view.onPause(); } @Override protected void onResume() { super.onResume(); view.onResume(); }

} Pasamos sobre la disposicin del onPause () y mtodos onResume () as es que pueden llamar por telfono lo los mtodos del mismo nombre en la vista. No necesitaremos el rayout resource (res/layout/main.xml) , as es que usted puede borrar Eso. Ahora definamos nuestra clase aduanera de vista:
Download OpenGL/src/org/example/opengl/GLView.java

package org.example.opengl; import android.content.Context; import android.opengl.GLSurfaceView; class GLView extends GLSurfaceView { private final GLRenderer renderer; GLView(Context context) { super(context); // Uncomment this to turn on error-checking and logging //setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS); renderer = new GLRenderer(context); setRenderer(renderer); } }

El GLSurfaceView es una nueva clase introducida en Androide 1.5 que en gran medida simplifica utilizar a OpenGL en Androide. Provee la goma para conectar OpenGL ES para el sistema de Vista y el ciclo biolgico de Actividad. Se requiere cuidado de escoger el formato apropiado de pixel del amortiguador del marco y eso maneja una separata entregando hilo para permitir animacin muy fcil. Todo GLView necesita para haga es extiende GLSurfaceView y defina un dador para la vista. En el siguiente seccione, llenaremos la pantalla de un color entero. 10.4 Dando la Escena Como vimos en la Seccin 4.2, Dibujando a la Junta Directiva, en pgina 80, el Androide La biblioteca del 2D llama al mtodo onDraw () de su vista cada vez que necesita para redibuje una seccin de la pantalla. OpenGL es un poco diferente. En ES OpenGL en Androide, el dibujo es distanciado fuera en una interpretacin la clase que es responsable de inicializar y extraer la pantalla entera. Definamos eso ora

GARCIA JIM
Aqu est el contorno para la clase del GLRenderer:
Download OpenGL/src/org/example/opengl/GLRenderer.java

package org.example.opengl; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.content.Context; import android.opengl.GLSurfaceView; import android.opengl.GLU; import android.util.Log; class GLRenderer implements GLSurfaceView.Renderer { private static final String TAG = "GLRenderer" ; private final Context context; GLRenderer(Context context) { this.context = context; } public void onSurfaceCreated(GL10 gl, EGLConfig config) { // ... } public void onSurfaceChanged(GL10 gl, int width, int height) { // ... } public void onDrawFrame(GL10 gl) { // ... } }

El GLRenderer implementa la interfaz del GLSurfaceView.Renderer, que tiene tres mtodos. Comencemos con el mtodo onSurfaceCreated (), 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.java Line 1 public 2 //

void onSurfaceCreated(GL10 gl, EGLConfig config) {

Set up any OpenGL options we need

3 gl.glEnable(GL10.GL_DEPTH_TEST); 4 gl.glDepthFunc(GL10.GL_LEQUAL); 5 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 6 7 // 8 // 9}

Optional: disable dither to boost performance gl.glDisable(GL10.GL_DITHER);

GARCIA JIM
En lnea 3, establecemos un par de opciones OpenGL. OpenGL tiene docenas de las opciones que pueden ser permitidas o deshabilitadas con glEnable () y glDisable (). La mayor parte de comnmente usados incluyen lo siguiente: La Descripcin de Opcin GL_BLEND Mezcle los valores entrantes de color con los valores ya en el amortiguador de color. GL_CULL_FACE Ignore polgonos 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. Esto es una forma barata para eliminar atrs afronta. GL_DEPTH_TEST Haga comparaciones de profundidad, y actualice la profundidad Amortiguador. Los pixeles ms lejos que esos ya dibujado ser ignorado. GL_LIGHTi Incluya nmero leve al entender unos 's del objeto la claridad y el color. GL_LIGHTING Encienda alumbrado y los clculos materiales. GL_LINE_SMOOTH Dibuje lneas del antialiased (las lneas sin jaggies). GL_MULTISAMPLE Realice multitomar muestras para el antisubmuestreo y otro Efectos. GL_POINT_SMOOTH El antialiased levadizo seala. GL_TEXTURE_2D El uso las texturas para dibujar alisa. Todas las opciones son poco apropiadas por defecto excepto GL_DITHER and GL_MULTISAMPLE. Repare en que todo lo que usted permite tiene algunos lo cuestan en la funcin. Despus complementemos el mtodo onSurfaceChanged (). Este mtodo es llamado una vez despus de que la Superficie sea creada y no obstante cada vez que el tamao de lo Cambios superficiales:
Download OpenGL/src/org/example/opengl/GLRenderer.java Line 1 public 2 //

void onSurfaceChanged(GL10 gl, int width, int height) {

Define the view frustum 0, width, height);

3 gl.glViewport(0,

4 gl.glMatrixMode(GL10.GL_PROJECTION); 5 gl.glLoadIdentity(); 6 float

ratio = (float) width / height; 45.0f, ratio, 1, 100f);

7 GLU.gluPerspective(gl, 8}

Aqu configuramos nuestro tronco de vista y establecemos algunas opciones OpenGL. Nota la llamada para la funcin del ayudante GLU. gluPerspective () en lnea 7. Lo ltimo dos las discusiones son la distancia del ojo para el recorte cercano y lejano Aviones (vea Figura 10.1, en pgina 192).

GARCIA JIM

Figura 10.2: Esa fue bastante problema para conseguir una pantalla negra. Es hora de dibujar algo. El mtodo onDrawFrame () es enumerado y en el hilo de interpretacin creado por la clase del GLSurfaceView.
Download OpenGL/src/org/example/opengl/GLRenderer.java

public void onDrawFrame(GL10 gl) { // Clear the screen to black gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // Position model so we can see it gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); gl.glTranslatef(0, 0, -3.0f); // Other drawing commands go here... }

GARCIA JIM
Para empezar, colocamos la pantalla a negro. Aclaramos ambos el color y los amortiguadores de profundidad. Siempre acurdese de exonerar ambos, o a usted le comprarn algunos resultados muy extraos de la informacin de profundidad para lo previo Marco. Tambin colocamos la posicin de puesta en marcha para el resto de las rdenes del dibujo cul ser completado en la siguiente seccin. Si usted maneja el programa ahora, usted consigue Figura 10.2, en la pgina precedente. Si usted est pensando que es tonto dibujar la misma pantalla negra encima y otra vez en un lazo, la razn est de su parte. Esto har ms sentir ms tarde cundo hablamos de animacin, as es que slo soprteme por ahora. Sigamos adelante y dibujemos algo un poco ms interesndole. Pero primero nosotros necesite definir exactamente lo que estamos dibujando (el modelo). 10.5 Construyendo Un Modelo A merced de la complejidad de los objetos usted quiere dibujar, usted lo har tpicamente crelos usar una herramienta grfica del diseo e imprtelos en su programa. Para los propsitos de este ejemplo, slo definiremos uno el modelo simple en cdigo secreto: un cubo
Download OpenGL/src/org/example/opengl/GLCube.java Line 1 package org.example.opengl; - import java.nio.ByteBuffer; - import

java.nio.ByteOrder;

5 import java.nio.IntBuffer; - import javax.microedition.khronos.opengles.GL10; - import android.content.Context; 10 import - import - class

android.graphics.Bitmap; android.graphics.BitmapFactory; - import android.opengl.GLUtils; GLCube { final IntBuffer mVertexBuffer; - public GLCube() { - int one = 65536; - int half = one / 2; - int vertices[] = { 20 // FRONT - -half, -half, half, half, -half, half, - -half, half, half, half, half, half, - // BACK - -half, -half, -half, -half, half, -half, 25 half, -half, -half, half, half, -half, - // LEFT - -half, -half, half, -half, half, half, - -half, -half, -half, -half, half, -half, - // RIGHT 30 half, -half, -half, half, half, -half, - half, -half, half, half, half, half, - // TOP - -half, half, half, half, half, half, - -half, half, -half, half, half, -half, 35 // BOTTOM - -half, -half, half, -half, -half, -half, - half, -half, half, half, -half, -half, };
15 private - //

Buffers to be passed to gl*Pointer() functions must be direct, i.e., they must be placed on the native heap - // where the garbage collector cannot move them. - // - // Buffers with multi-byte data types (e.g., short, int, - // float) must have their byte order set to native order 45 ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); - vbb.order(ByteOrder.nativeOrder()); - mVertexBuffer = vbb.asIntBuffer();
40 //

GARCIA JIM
- mVertexBuffer.put(vertices); - mVertexBuffer.position(0); 50 } - public

- gl.glVertexPointer(3, 55 gl.glColor4f(1, 1, 1, - gl.glNormal3f(0,

void draw(GL10 gl) { GL10.GL_FIXED, 0, mVertexBuffer);

1); 0, 1); - gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); - gl.glNormal3f(0, 0, -1); - gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4);


60 - gl.glColor4f(1,

1, 1, 1); 0, 0); - gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4); - gl.glNormal3f(1, 0, 0); 65 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4);


- gl.glNormal3f(-1, - gl.glColor4f(1,

1, 1, 1); 1, 0); - gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4); 70 gl.glNormal3f(0, -1, 0); - gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4); -} -}
- gl.glNormal3f(0,

Los vertices forman en orden en lnea 19 definen las esquinas del cubo en fixedpoint modele coordenadas (vea lo "Fixed vs. Floating Point" el recuadro complementario). Cada cara de un cubo es un cuadrado, que consiste en dos tringulos. Acostumbramos un OpenGL comn extrayendo modo llamadas triangle strips . En este modo, especificamos dos puntos de partida, y entonces despus de tan cada subsiguiente el punto define un tringulo con los puntos dos previos. Es una forma rpida para ponga una buena cantidad de geometra fuera de para el hardware de grficos apresurada. Repare en que cada punto tiene tres coordenadas (la x, y, y z). La x y y las hachas sealan el derecho y arriba, respectivamente, y el eje de la z seala fuera de la pantalla hacia el punto del ojo. En el mtodo levadizo (lnea 52), usamos el amortiguador del vrtice creado en lo el constructor y carreras diferentes seis levadizas de tringulos (para los seis lados del cubo). En un programa real, usted querra combinar las llamadas en uno o dos tiras, porque el nmero de ms pocos de OpenGL le llama Haga, lo ms rpido de lo que su programa ir. Ahora usemos nuestra nueva clase en GLRenderer:
Download OpenGL/src/org/example/opengl/GLRenderer.java

private final GLCube cube = new GLCube(); public void onDrawFrame(GL10 gl) { // ... // Draw the model cube.draw(gl); }

Ahora si usted maneja el programa, usted ver la imagen excitante en Figura 10.3, adelante lo en la otra pgina. Bien, es ms excitante que negro.

GARCIA JIM
10.6 Luces, la Cmara Fotogrfica, ... En la vida real usted tiene puntos de luz como el sol, focos delanteros, antorchas, o la lava encendida se empoza. OpenGL le deja definir hasta ocho puntos de luz en su escena. Hay dos partes para iluminar una luz y algo para dele brillo adelante. Comencemos con la luz. Todas las bibliotecas de grficos del 3D soportan tres tipos de alumbrado: "Ambient: Un resplandor general al que la luz contribuye lo entero Escena, 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. "Diffuse: El alumbrado direccional suave, como usted podra poner de uno fluorescente Panel. La mayor parte de la luz contribuy a su voluntad de la escena tpicamente venga de diseminar fuentes. "Specular: Brillante luz, usualmente de fuentes puntuales claras. Combinado con materiales brillantes, esto le da rayos del cabello (los destellos de luz) que sume realismo.

Figura 10.3: Dibujando un cubo no sombreado Un solo punto de luz puede contribuir todo lo que el tres escribe de luz. Estos valores ahonde en una ecuacin alumbrante que determina el color y claridad de cada pixel en la pantalla.

GARCIA JIM
El alumbrado est definido en el mtodo GLRenderer.onSurfaceCreated ():
Download OpenGL/src/org/example/opengl/GLRenderer.java

// Define the lighting float lightAmbient[] = new float[] { 0.2f, 0.2f, 0.2f, 1 }; float lightDiffuse[] = new float[] { 1, 1, 1, 1 }; float[] lightPos = new float[] { 1, 1, 1, 1 }; gl.glEnable(GL10.GL_LIGHTING); gl.glEnable(GL10.GL_LIGHT0); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient, 0); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse, 0); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPos, 0);

Figura 10.4: Iluminando la escena En nuestro cdigo definimos un punto de luz en posicin (1, 1, 1). Es un blanco la luz omnidireccional que tiene un componente difuso brillante y uno oscuro ambiente componente. En este ejemplo, no estamos usando alumbrado del specular. Despus, necesitamos contarle a OpenGL sobre los materiales de los que nuestro cubo est hecho. La luz refleja diferentemente fuera de materiales diferentes, como metal, el plstico, o el escrito. Para simular esto en OpenGL, sume este cdigo en onSurfaceCreated ( ) para definir cmo reacciona el material con el tres mecanografa de luz: Ambiente, difuso, y specular:

GARCIA JIM
Download OpenGL/src/org/example/opengl/GLRenderer.java

// What is the cube made of? float matAmbient[] = new float[] { 1, 1, 1, 1 }; float matDiffuse[] = new float[] { 1, 1, 1, 1 }; gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, matAmbient, 0); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, matDiffuse, 0);

El objeto parecer tener un acabado desafilado, como si fuera hecho apagado Escrito (vea Figura 10.4, en la pgina precedente). La esquina que se sobrepasa bien de el cubo est ms cerca para la luz, as es que aparece ms brillante. 10.7 Ponen en Marcha! Hasta ahora el cubo recin ha estado sentndose all a pie firme. Eso es bastante aburrido, as es que nos deja hacerle moverse. Para hacer eso, necesitamos hacer uno la dos los cambios para nuestro onSurfaceCreated () y los mtodos onDrawFrame () En GLRenderer.
Download OpenGL/src/org/example/opengl/GLRenderer.java

private long startTime; private long fpsStartTime; private long numFrames; public void onSurfaceCreated(GL10 gl, EGLConfig config) { // ... startTime = System.currentTimeMillis(); fpsStartTime = startTime; numFrames = 0; } public void onDrawFrame(GL10 gl) { // ... // Set rotation angle based on the time long elapsed = System.currentTimeMillis() - startTime; gl.glRotatef(elapsed * (30f / 1000f), 0, 1, 0); gl.glRotatef(elapsed * (15f / 1000f), 1, 0, 0); // Draw the model cube.draw(gl); }

Este cdigo rota el cubo un tanto todo el tiempo a travs del lazo principal. Especficamente, cada segundo que alterna 30 grados alrededor del eje de las abscisas y 15 los grados alrededor del eje vertical. El resultado ser un alisado agradable,, hilandera Cubo (vea Figura 10.5, en la siguiente pgina).

GARCIA JIM
10.8 Aplicando Textura Aunque la escena est comenzando a verse ms interesante, nadie lo hara confndalo por vida real. Los objetos de todos los das tienen texturas, como el rough la superficie de una pared de ladrillos o la grava en un sendero. 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 plstico o el pizarrn de la partcula.

Figura 10.5: Rotando el cubo La Animacin Basada En Tiempos La primera versin de este ejemplo le sigui la pista a la rotacin actual reflecte y simplemente incrementado a eso cada vez a travs del lazo. Puede pensar usted una razn por la cual esa fue una idea mala? Desde que el Androide puede funcionar con una coleccin variada de dispositivos diferentes, usted no puede predecir cunto tiempo llevar para dibujar un solo marco. Eso podran tomar la mitad de segundo o 1/100th de un segundo. Si usted se moviera un objeto una cantidad fija cada marco, entonces en dispositivos lentos el objeto se movera demasiado lentamente, y en dispositivos rpidos que hara muvase demasiado rpido. Vinculando la cantidad de movimiento para cunto el tiempo ha transcurrido, usted puede lograr movimiento previsible en cualquier dispositivo. El hardware ms rpido dibujar la animacin ms Suavemente, pero los objetos entrarn de un sitio a otro en la misma cantidad de tiempo.

GARCIA JIM
Vamos a hacerle lo mismo a nuestro cubo usando una foto. Desafortunadamente, el cdigo para hacer esto es medianamente largo. No se preocupe si usted no hace comprenda todo ello de inmediato.
Download OpenGL/src/org/example/opengl/GLCube.java

private final IntBuffer mTextureBuffer; public GLCube() { int texCoords[] = { // FRONT 0, one, one, one, 0, 0, one, 0, // BACK one, one, one, 0, 0, one, 0, 0, // LEFT one, one, one, 0, 0, one, 0, 0, // RIGHT one, one, one, 0, 0, one, 0, 0, // TOP one, 0, 0, 0, one, one, 0, one, // BOTTOM 0, 0, 0, one, one, 0, one, one, }; // ... ByteBuffer tbb = ByteBuffer.allocateDirect(texCoords.length * 4); tbb.order(ByteOrder.nativeOrder()); mTextureBuffer = tbb.asIntBuffer(); mTextureBuffer.put(texCoords); mTextureBuffer.position(0); } static void loadTexture(GL10 gl, Context context, int resource) { Bitmap bmp = BitmapFactory.decodeResource( context.getResources(), resource); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0); gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); bmp.recycle(); } }

Despus necesitamos decir que OpenGL para usar la textura coordina. Sume esto para el comienzo del draw( ) method:
Download OpenGL/src/org/example/opengl/GLCube.java

gl.glEnable(GL10.GL_TEXTURE_2D); // workaround bug 3623 gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, mTextureBuffer);

Figura 10.6: Aplicando una textura Y finalmente necesitamos llamar al mtodo loadTexture () en GLRenderer. Sume estas lneas hasta el final del mtodo onSurfaceCreated ():
Download OpenGL/src/org/example/opengl/GLRenderer.java

// Enable textures gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glEnable(GL10.GL_TEXTURE_2D); // Load the cube's texture from a bitmap GLCube.loadTexture(gl, context, R.drawable.android);

GARCIA JIM

Figura 10.7: La versin final: un cubo transparente Aparezca Este cdigo habilita texturas y la textura se coordina y entonces llama por telfono nuestra el mtodo loadTexture (), pasndole el contexto de Actividad y recurso Idaho as puede cargar la imagen de la textura. R.drawable.android es un archivo PNG reducido a escala para 128 cuadrado de pixeles que copiado para res/drawable/android.png Usted lo puede encontrar en lo bajable desde disco codifique paquete que acompaa este libro. Note el nmero 128 no aparece en cualquier parte del cdigo, as es que usted substituye uno ms grande o ms pequeo la imagen fcilmente. Usted puede ver nuestro progreso en lo que va de Figura 10.6, en la pgina precedente. 10.9 Peekaboo Solo por sport, hagamos el cubo a medias transparentes. Sume esto para GLRenderer.onSurfaceCreated ():
Download OpenGL/src/org/example/opengl/GLRenderer.java

boolean SEE_THRU = true; // ... if (SEE_THRU) { gl.glDisable(GL10.GL_DEPTH_TEST); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE); }

Esto desactiva profundidad experimentando, porque queremos ver objetos obscurecidos tan sano como los unos del primer plano. Tambin se vuelve contra un modo de mezcla que deja a la opacidad de objetos se base en su canal alfa. El efecto neto es que las caras de atrs del cubo aparecern a travs de las caras delanteras. Para el resultado final, sede Figura 10.7, en la pgina previa. Se lo dejar a usted implementar una opcin para dar vuelta tan abierto y cerrado. Intente divirtindose con modos diferentes del preparado para recibir efectos estupendos.

GARCIA JIM
10.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. Esto es tpicamente medido contando el nmero de pantallas o los nmeros de marcos por segundo (LOS PIES POR SEGUNDO) eso es exhibido. Las personas diferentes perciben diferentes las velocidades tan " alise. Los 1530FPS son a veces aceptables a informales Los jugadores, pero ms jugadores serios han venido a esperar una tasa ms alta Como 60FPS o ms. Recomiendo que usted haga todo lo posible para alcance una tasa coherente de 60FPS. Eso concuerda con el mximo renueve tasa de dispositivos actuales del Androide, y es tambin la velocidad aprovechada adelante las plataformas populares de tablajera como Playstation de Sony y Playstation El objeto porttil (PSP). Una tasa alta del marco es desafiante, porque en 60FPS que usted slo tiene El 1/60th de un segundo (16.67 milisegundos) de en medio llama a onDrawFrame () para hacer todo lo que necesite hacerse, incluyendo cualquier animacin, La fsica, y clculos de juego, y el tiempo que lleva en verdad extraer la escena para el marco actual. La nica manera a decir si usted est haciendo Su blanco DE PIES POR SEGUNDO debe medirlo. Para hacer eso, probar sumar este pedacito de cdigo hasta el final del mtodo onDrawFrame ():
Download OpenGL/src/org/example/opengl/GLRenderer.java

// Keep track of number of frames drawn numFrames++; long fpsElapsed = System.currentTimeMillis() - fpsStartTime; if (fpsElapsed > 5 * 1000) { // every 5 seconds float fps = (numFrames * 1000.0F) / fpsElapsed; Log.d(TAG, "Frames per second: " + fps + " (" + numFrames + " frames in " + fpsElapsed + " ms)" ); fpsStartTime = System.currentTimeMillis(); numFrames = 0; }

Cada cinco segundos exhibir su nmero comn DE PIES POR SEGUNDO para el Androide el leo del sistema (vea Seccin 3.10, Eliminando las Pulgas de Un Programa con Mensajes del Leo, adelante Pgina 67). Si este nmero desciende debajo de su tasa objeto, en ese entonces ajstese su el algoritmo y el intento otra vez. Mantngase iterando hasta que usted alcanza su blanco. A el perfilador como traceview4 tambin puede venir bien. Repare en que usted debera evite la tentacin para exhibir esto en la pantalla encima de su otro los grficos porque el acto de exhibirlo se quitar de encima el nmero. Si usted prueba esto ahora, usted puede echar de ver que el emulador maneja bastante ms lentamente que el dispositivo real. En mis pruebas que vi acerca de los 12FPS en lo el emulador y ms cerca para 60FPS en un telfono real. La leccin aqu es eso para la comprobacin de rendimiento usted no puede confiar en el emulador. 10.11 Avances Rpidos En este captulo, usted aprendi a usar la biblioteca de grficos 3D de Androide. Porque el Androide usa la API estndar en la industria DE EINSTENIO OpenGL, uno ancho la variedad de informacin adicional est disponible si usted quiere aprender ms. En particular, recomiendo al Javadoc para la especificacin de API JSR 239. 5 Para otros grficos que los consejos registran la salida que el desarrollador hablan en lo Haga bsquedas en la Internet usando Google Yo/Oh conference.6 Qu es el siguiente? Bien, eso es enteramente decisin de usted. Usted tiene todo el le equipa con herramientas Necesidad, as es que empuje marca algo gran!

GARCIA JIM

A del Apndice Java vs. el Androide El lenguaje y APIs


En la mayora de los casos, los programas del Androide se escriben con el lenguaje de Java, y usan la Java 5 APIs de la biblioteca de la Edicin del Estndar (EL SELENIO). Digo " para lo ms seprese " porque hay algunas diferencias. Este apndice resalta las diferencias entre la normal Java y lo que usted encontrar en Androide. Si usted es ya diestro en desarrollo de Java en otras plataformas, usted debera requerirse una mirada cercana para ver qu cosas usted necesita " desaprenda. El Subconjunto de Lenguaje del A.1 El androide utiliza a un compilador estndar de Java compilar su cdigo originario en bytecodes normales y entonces traducen esos bytecodes en Dalvik Instrucciones. Por consiguiente, el lenguaje entero de Java es soportado, no slo un subconjunto. Compare esto al Google Web Toolkit (GWT), que tiene Su Java para el traductor JavaScript. Utilizando al compilador estndar y Bytecodes, usted no necesite tener el cdigo originario para bibliotecas que usted quiere acostumbrar en sus aplicaciones. El Nivel de Lenguaje El androide soporta cdigo compatible con Java Standard Edition 5 o ms temprano. Java 6 y 7 formatos de clase y caractersticas no son an mantenido sino podra agregarse en ediciones futuras. Tipos Instrinsicos Todos los tipos intrnsecos Java incluyendo byte, quemadura, cortocircuito, int, por mucho tiempo, flotan, duplican, Objeto, Cuerda, y conjuntos imponentes son soportados. Sin embargo, en hardware actual comnmente encontrada en dispositivos mviles, la coma flotante es emulada. Que los recursos es realizada en software en lugar de hardware, hacerlo muy ms lentamente que la normalidad. Las operaciones simples en nmeros reales podran tome un milisegundo para completar. Aunque el uso ocasional est bien, no lo haga el uso el flotador o al doble en cdigo crtico en la funcin. El Multiposicionamiento y la Sincronizacin Los hilos mltiples cuentan con el respaldo de divisin 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. Aunque el Androide soporte cualquier nmero de hilos, en general usted debera utilizar slo a unos pocos. Un hilo es dedicado para la principal interfaz de usuario (si usted tiene uno), y otro el hilo sirve para largas operaciones que corre como clculos o la red Yo/O. La mquina virtual Dalvik implementa la sincronizacin y palabra clave sincronizada

GARCIA JIM
los mtodos relacionados de la biblioteca como Object.wait (), Object.notify (), y Object.notifyAll (). Tambin soporta el paquete del java.util.concurrent para ms sofisticados algoritmos. selos como usted lo hara en cualquier programa de Java para resguardar hilos mltiples de interferir con uno a otro. Reflexin Aunque la plataforma del Androide soporte reflexin de Java, como un general la regla que usted no lo debera usar. La razn es funcin simple: Reflexin es lento. Considere alternativas como preprocesadores y herramientas de fases de compilacin En lugar de eso. Finalizacin La mquina virtual Dalvik soporta finalizacin del objeto durante coleccin de basura algo as como VMs normales de Java. Sin embargo, la mayora de expertos de Java no le aconsejan para confiar en finalizadores porque usted no puede predecir cundo (o si) harn Corra. En lugar de finalizadores, use final explcito () o termine la relacin () Mtodos. El androide es al que se apunt hacia hardware constreido en recurso, as es que es importante que usted suelta todos los recursos tan pronto como usted ya no los necesita. El Subconjunto de la Biblioteca del Estndar El androide soporta un subconjunto relativamente tremendo de la Java Standard Edition 5.0 biblioteca. Algunas cosas se quedaron apagadas porque simplemente no hicieron El sentido (como imprimir), y los otros fueron omitidos porque mejoran APIs est disponible eso es especfico para el Androide (como interfaces de usuario). Mantenido Los siguientes paquetes estndar son soportados en Androide. Consulte lo Java de Edicin de 2 Plataformas de Estndar 5.0 el documentation1 de API para informacin en relacin a la forma de usarlos: java.awt.font: Algunas constantes para Unicode y los carcteres de imprenta java.beans: Algunas clases e interfaces para propiedad JavaBeans Cambia java.io: El archivo y la corriente I/O java.lang (except java.lang.management): El lenguaje y la excepcin Soporte java.math: Grandes nmeros, el redondeo, la precisin java.net: Network I/O, URLs, sockets java.nio: El archivo y el canal I/O java.security: Autorizacin, certificados, llaves pblicas java.sql: La base de datos interacta java.text: Formateo, lenguaje natural, cotejo java.util (including java.util.concurrent): Listas, mapas, sets, conjuntos imponentes, Colecciones javax.crypto: Cifras, llaves pblicas javax.microedition.khronos: Los grficos OpenGL (de Java Micro Edition) javax.net: Socket factories, SSL javax.security (except javax.security.auth.kerberos, javax.security.auth.spi, and javax.security.sasl) javax.sql (except javax.sql.rowset): Ms base de datos interacta javax.xml.parsers: El anlisis gramatical XML org.w3c.dom (but not subpackages): Los nodos DOM y los elementos org.xml.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, usted no los usa ganar acceso a las bases de datos locales del SQLite. Utilice al android.database APIs en lugar de eso (vea Captulo 9, Dndole Ocupacin a SQL, adelante Pgina 171).

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

GARCIA JIM

B del Apndice Hello, Dispositivo


Introducidos en Androide 1.5 (la Magdalena Glaseada), los dispositivos de la aplicacin son aplicacin de la miniatura los puntos de vista que pueden estar incrustados en la pantalla de la pgina principal del sitio Web. Algunos dispositivos es provisto de Androide incluyendo un reloj analgico, un controlador de msica, y uno que slo muestra una foto. Muchos desarrolladores han creado interesarle los dispositivos para exhibir el clima, resumen de las noticias, horscopos, y Ms, y usted pueden tambin. Este apndice le mostrar cmo. B.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 ", el Androide" la aplicacin como nosotros hizo en la Seccin 1.2, Creando Su Primer Programa, en pgina 20, y bien ajstele un poco. Seleccione > Proyecto del Archivo > New ... para abrir el Nuevo Proyecto Ventana de dilogo. Entonces seleccione Proyecto del > Androide del Androide, y haga clic Despus. Entre la siguiente informacin:
Project name: Widget Build Target: Android 1.6 Application name: Widget Package name: org.example.widget

En lugar de introducir un nombre para la Actividad, deje ese campo espacio en blanco y apague la marca de verificacin posteriormente para Crear Actividad. Cuando usted est muy cansado, eso debera verse algo as como Figure B.1, adelante lo en la otra pgina. El Acabado de Clic. El plug-in del Androide crear el proyecto y lo suplir con algunos archivos predeterminados. Los archivos no sern correctos para un proyecto del dispositivo as es que preparmoslos ora.

GARCIA JIM

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

GARCIA JIM
Llamando a Todos los Dispositivos! Nuestra primera parada es el archivo AndroidManifest.xml. Mientras es tcnicamente posible (y comn) para poner dispositivos y actividades en la misma aplicacin, este ejemplo slo tendr un dispositivo. No necesitamos una > etiqueta de < actividad pero nosotros necesitamos aadirle un < aparato receptor para definir el dispositivo. Aqu est lo el archivo manifiesto revisado:
Download Widget/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.example.widget" android:versionCode="1" android:versionName="1.0" > <application android:icon="@drawable/icon" android:label="@string/app_name" > <!-- Broadcast Receiver that will process AppWidget updates --> <receiver android:name=".Widget" android:label="@string/widget_name" > <intent-filter> <action android:name= "android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.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 definicin del dispositivo adentro res/xml/widget.xml. Aqu est la definicin:
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="146dip" android:minHeight="72dip" android:updatePeriodMillis="60000" android:initialLayout="@layout/main" />

Esto especifica un tamao mnimo para el dispositivo, cada cunto debera ser Actualizado (ms en tan posterior), y una referencia para su trazado de puesta en marcha. El layout est definido adentro res/layout/main.xml:
Download Widget/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.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
usted pudo haber echado de ver que este layout es casi as como el usado para el "hola, el Androide" el ejemplo excepto que esta versin especifica el texto negro centrado y una imagen de fondo. Stretch a Satisfacer Para el historial pudimos haber utilizado a cualquier Androide Drawable, como un color entero o un bitmap (vea Seccin 4.1, Extraible, en pgina 73). Nosotros incluso lo pudo haber omitido para conseguir un historial completamente transparente. Pero para este ejemplo quise mostrarle cmo usar una imagen NinePatch. Una imagen NinePatch es una imagen PNG estirable a menudo destinada para el historial de botones capaz de ajustares los tamaos. Usted usa el Draw tool1 de 9 parches incluido con el SDK para crear uno, como se muestra en Figure B.2, adelante lo en la otra pgina. Un borde de un pixel alrededor de la imagen real contiene informacin adicional sobre cmo estirar la imagen e insertar acolch contenido. Lneas en el fondo y borde correcto le dice al Androide dnde el contenido debera ir. 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 debera ser duplicado para estirar la imagen. El archivo resultante debe usar el .9.png de la extensin y se coloc en lo res/drawable directory. La siguiente cosa que necesitamos es la clase del Dispositivo.

Definiendo un historial estirable con el Empate de Draw 9-patch tool.

GARCIA JIM

El resto de la Historia El Widget necesita extender a AppWidgetProvider. Est bien, realmente no necesita Para, pero seguro hace cosas ms convenientes. Aqu est la definicin de La clase del Dispositivo:
Download Widget/src/org/example/widget/Widget.java

package org.example.widget; import android.appwidget.AppWidgetProvider; public class Widget extends AppWidgetProvider { // ... }

Regresaremos a suplir esta clase en un momento pero por ahora lo podemos hacer simplemente use el comportamiento predeterminado provisto por AppWidgetProvider.

Haciendo a la medida su pantalla de la pgina principal del sitio Web con dispositivos

GARCIA JIM
Finalmente, deshagmonos de algunos molestosos mensajes de error definiendo a unos cuantos los valores de la cuerda:
Download Widget/res/values/strings.xml

<?xml version="1.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. Running el Dispositivo Para echar a andar su nuevo dispositivo, vaya a la ventana del Explorador del Paquete, clic derecho El proyecto del Dispositivo,Run As > Android Application . Nada

mucho parecer ocurrir como el Eclipse construye e instala el dispositivo en su emulador o dispositivo. Para ver el nuevo dispositivo, suba el men de contexto de la pantalla de la pgina principal del sitio Web: la prensa y el agarre su dedo (o el ratn) en la pgina principal del sitio Web filtran. Un men aparecer con opciones listando todos los tipos de cosas que usted puede sumar (vea Figura B.3, en la pgina precedente). Escoja Dispositivos entre el men, y entonces seleccione el dispositivo denominado Dispositivo (?). Al fin, su dispositivo debera aparecer (vea a Figure B.4). Pruebe moverlo de un lado para otro por presionar y sujetar su dedo en el dispositivo. Alterne el despliegue para ver cmo el dispositivo automticamente ajusta el tamao de s mismo. Para qutelo, arrstrelo para el icono del cubo de la basura al pie de la pantalla. Tan excitante como eso fue, hagmosle uno mejor exhibiendo la corriente salga en citas y cronometre dentro de nuestro dispositivo.

GARCIA JIM
Estando Al Da En Androide 1.5, los anfitriones del dispositivo (los programas como la pantalla de la pgina principal del sitio Web que puede contienen dispositivos) envele una razn a que todo su dispositivo pequeo bromea cada vez que los dispositivos deberan exhibir algo. La forma del Androide a la que enviarle una razn debe difundir un intento. En este caso, el intento es android.appwidget.action.APPWIDGET_UPDATE. De regreso cuando hacemos caer en una trampa al AndroidManifest.xml file , dijimos al Androide que podramos recibir ese intento y podramos hacer algo interesndole con eso. Ahora Es hora de complementar la clase del Dispositivo para hacer justamente eso:
Download Widget/src/org/example/widget/Widget.java Line 1 package org.example.widget; - import java.text.SimpleDateFormat; - import 5 - import - import

java.util.Date;

android.appwidget.AppWidgetManager; android.appwidget.AppWidgetProvider; - import android.content.Context; - import android.widget.RemoteViews;


10 - public - //

class Widget extends AppWidgetProvider { ... - // Define the format string for the date and time - private SimpleDateFormat formatter = new SimpleDateFormat( 15 "EEE, d MMM yyyy\nHH:mm:ss.SSS" );
- @Override - public

void onUpdate(Context context, appWidgetManager, int[] appWidgetIds) { 20 // Retrieve and format the current date and time - String now = formatter.format(new Date());
- AppWidgetManager - //

Change the text in the widget updateViews = new RemoteViews( 25 context.getPackageName(), R.layout.main); - updateViews.setTextViewText(R.id.text, now); - appWidgetManager.updateAppWidget(appWidgetIds, updateViews);
- RemoteViews - // -} -} 30 super.onUpdate(context,

Not really necessary, just a habit appWidgetManager, appWidgetIds);

Cada vez que el intento APPWIDGET_UPDATE llega adentro, el Androide llamar por telfono nuestro el mtodo onUpdate (). En lnea 21, formateamos el dtil actual acostumbrando uno SimpleDateFormat cre en lnea 14. Esto saldr a la vista el da de la semana, el da del mes, nombre de mes, y ao en la primera fila de lo El dispositivo, y en ese entonces la hora, el minuto, secundan, y los milisegundos en lo secunde alboroto. Despus, en lnea 24 que creamos una instancia RemoteViews para la nueva vista el layout que el dispositivo exhibir. Eso simplemente tanto ocurre que este ejemplo usa el mismo layout, R.layout.main, al actualizar como hizo cuando l comienza. Lnea 26 reemplaza el "hola" original "," texto "mundial" con lo el tiempo y fecha actual. Finalmente, en lnea 27 que enviamos nuestra vista actualizada para reemplazar la corriente el contenido del dispositivo. La llamada para super.onUpdate () en lnea 30 es justa all para la higiene de cdigo. Remueva el dispositivo de su pantalla de la pgina principal del sitio Web y reinstlelo de Eclipse. Cuando usted suma eso de regreso a la pantalla de la pgina principal del sitio Web, usted debera ver Algo as como Figure B.5.

GARCIA JIM

Exhibiendo la fecha y el tiempo. La frecuencia de actualizaciones es controlada por el androide:UpdatePeriodMillis el parmetro en res xml widget.xml. Un valor de 60000 representa 60 segundos, as es que nuestro dispositivo estar actualizado una vez un minuto. Repare en que esto lo es slo un nmero aproximado. El acontecimiento real de actualizacin puede ser demorado (posiblemente mucho tiempo) por otras cosas sucediendo en el telfono. Haga bsquedas en la Internet usando Google recomienda que usted coloque dispositivos para actualizar infrecuentemente, por ejemplo una vez al da o una vez cada hora, para conservar poder de la batera. Pero simplemente Por diversin, pruebe sedimentarse el perodo de actualizacin para un nmero bajo como 1000 o empareje Los 100ms para ver lo que ocurre. Go Wild Ahora que usted sabe los elementos bsicos de dispositivo construyendo, hay sinnmero para lo interesndole chunches que usted puede crear. Si usted necesita caractersticas ms adelantadas como originarse de acontecimientos, proceso subordinado, y especificar una actividad inicial para la configuracin, la consulta el documentation.2 en lnea Intente conservar sus dispositivos simples y tiles, sin embargo. Por ingeniosamente acostumbrar los dispositivos de la aplicacin que usted puede hacer al Androide experimentan ms personales y dinmico para sus usuarios.

You might also like