El gran libro de programación avanzada con Android

Tekst
0
Recenzje
Przeczytaj fragment
Oznacz jako przeczytane
El gran libro de programación avanzada con Android
Czcionka:Mniejsze АаWiększe Aa


El gran libro de programación avanzada con Android

Primera edición, 2012

© 2012 José Enrique Amaro Soriano

© MARCOMBO, S.A. 2012

Gran Via de les Corts Catalanes, 594

08007 Barcelona

www.marcombo.com

«Cualquier forma de reproducción, distribución, comunicación pública o transformación de esta obra solo puede ser realizada con la autorización de sus titulares, salvo excepción prevista por la ley. Diríjase a CEDRO (Centro Español de Derechos Reprográficos, www.cedro.org) si necesita fotocopiar o escanear algún fragmento de esta obra.»

ISBN: 978-84-267-2023-8

«En un futuro cercano, no habrá ningún accesorio, salvo

una escoba acaso, que no tenga un procesador dentro.» (Arthur C. Clarke)

ÍNDICE GENERAL

1. INTRODUCCION

2. ANIMACIONES INTERPOLADAS

2.1. Traslaciones

2.2. Repetición de animaciones

2.3. Rotaciones

2.4. Dilataciones y contracciones

2.5. Apariciones y desapariciones

2.6. Series de animaciones

2.7. Animaciones con Java

2.8. AnimationListener

2.9. Animación de un layout

2.10. Animación de un layout en Java

2.11. LayoutAnimationListener

3. ANIMACIÓN DE FOTOGRAMAS

3.1. Animación usando recursos

3.2. Animación de fotogramas en Java: AnimationDrawable

3.3. Ajuste de la relación de aspecto

4. PROCESOS EN BACKGROUND

4.1. Uso de Timer y RunOnUiThread

4.2. Modificación de la UI con post

4.3. Modificación de la UI con Handler.post

4.4. Métodos combinados para modificar la UI

4.5. Modificación de la UI con AsyncTask

4.6. Máquina tragaperras

5. SENSORES

5.1. Sensor de aceleración

5.2. Lista de sensores de un teléfono

5.3. Sensor de campo magnético

5.4. Sensor de orientación

5.5. Sensor de proximidad y sensor de luminosidad

6. DIÁLOGOS

6.1. Crear un diálogo

6.2. Diálogos con botones

6.3. Diálogos con ítems

6.4. Diálogos de elección única

6.5. Diálogos de elección múltiple

6.6. Diálogos de progreso

6.7. Diálogos personalizados

7. MENÚS

7.1. Menú de opciones

7.2. Submenús

7.3. Submenú con casillas

7.4. Menús de contexto

8. VISUALIZACIÓN DE LISTAS

8.1. La clase ListView

8.2. Listas interactivas

8.3. ListView personalizado

8.4. Construcción de un BaseAdapter

8.5. La clase ListActivity

8.6. Listas desplegables con SpinnerView

9. BASES DE DATOS

9.1. Elementos de SQLite y SQL

9.1.1. Iniciar sqlite3 con ADB

9.1.2. Crear una tabla

9.1.3. Algunas expresiones SQL

9.2. Crear una base de datos con Android

9.3. Borrar filas de una tabla

9.4. Automatizar las columnas del Cursor

9.5. Abrir una base de datos con SQLiteOpenHelper

9.6. Borrar filas con delete

9.7. Realizar búsquedas con query

9.8. Adaptar un Cursor a un ListView

10. PROVEEDORES DE CONTENIDOS

10.1. El proveedor de contactos

10.2. La tabla de datos de los contactos

10.3. La tabla raw contacts

10.4. Añadir contactos

10.5. Otros proveedores de contenidos

10.6. Implementación de un ContentProvider

10.7. Acceso externo a nuestro ContentProvider

10.8. La clase UriMatcher

11. COMUNICACIÓN ENTRE ACTIVIDADES

11.1. Secuencia de estados de una actividad

11.2. Resultado de una actividad

11.3. Resultado de cancelar una subactividad

11.4. Grupo de actividades

11.5. Abrir aplicaciones externas explícitamente

11.6. Abrir aplicaciones externas implícitamente

11.7. Uso del PackageManager

11.8. Filtro de datos en un intent

11.9. Agregar funcionalidad de otras apps

12. INTERNET Y RSS FEEDS

 

12.1. Advertencia importante antes de conectar a Internet

12.2. Mostrar páginas web con WebView

12.3. Mostrar imágenes con WebView

12.4. Mostrar HTML con WebView

12.5. Conexión HTTP

12.6. Introducción a XML y RSS

12.7. Análisis de documentos XML con DOM

12.8. Extraer los valores de los elementos XML

12.9. Conectar a un RSS feed

12.10. Inspeccionar una página WEB con Jsoup

12.11. Descargar y comprimir una imagen de Internet

13. CORREO ELECTRÓNICO

13.1. Enviar un email con un intent

13.2. Enviar un fichero adjunto por email

13.3. Enviar ficheros comprimidos con zip

14. LOCALIZACIÓN Y MAPAS

14.1. Coordenadas en Google Maps

14.2. El API de Google Maps

14.3. MapView

14.4. Control de mapas

14.5. Geocodificación

14.6. Localización

14.7. Dibujar sobre un mapa y geocodificación inversa

APÉNDICE A

La interfaz de usuario

A.1. Orientación de una actividad

A. 2. Dimensiones de la pantalla

APÉNDICE B

Complementos de Java

B. 1. Métodos con número variable de parámetros

B.2. ArrayList

B.3. Genéricos

B.4. Definición de una clase con tipos genéricos

APÉNDICE C

Versiones de Android

BIBLIOGRAFÍA

1. INTRODUCCIÓN

En mi primer libro sobre programación en Android, titulado Android: programación de dispositivos móviles a través de ejemplos (que denominaré abreviadamente Android a partir de ahora) y publicado por la editorial Marcombo, presentaba las técnicas esenciales para iniciarse rápidamente en la programación del sistema, enfatizando en aplicaciones de cálculo numérico y gráficos. En este segundo libro introduzco técnicas más avanzadas (aunque no necesariamente más complicadas) para realizar programas que se ejecutarán en un smartphone, tablet o cualquier otro dispositivo con el sistema operativo Android. La obra está dirigida a no especialistas y supone un acercamiento genuinamente práctico al sistema Android. No se requieren conocimientos profundos de Java. El apéndice A de mi primer primer libro contiene una introducción al lenguaje Java específico para Android, suficiente para seguir este segundo. Sin embargo, no es necesario haberlo leído para seguir y entender este, siempre que se posean las nociones básicas para crear una actividad con Android.

El material contenido en esta obra se plantea como una colección de ejemplos escritos expresamente para ilustrar alguna técnica particular de Android. Los ejemplos son programas completos, pero breves, que permitirán al lector minimizar las dificultades que puedan surgir para comprender la materia. La idea es que, después de trabajar los programas simples de este libro, el lector sea capaz de escribir sus propios programas y de explorar por sí mismo el sistema. Todos los ejemplos han sido probados en un dispositivo o en el emulador, y funcionan correctamente en las versiones de Android 2.1 (Eclair) y posteriores (ver Apéndice A para una lista de las versiones de Android). El código fuente de todos los programas se puede descargar de la página web del autor: http://www.ugr.es/local/amaro/android

La selección del material no es ni mucho menos exhaustiva. Las librerías de Android contienen numerosas clases y métodos para realizar casi cualquier tarea que el lector pueda imaginar, y otras que ni se le ocurriría que pudieran realizarse con un artefacto tan pequeño como un teléfono. La principal fuente de documentación y recursos de Android es la página web oficial de Android developers y los foros especializados que se encuentran en Internet, donde el lector iniciado puede profundizar y ampliar sus conocimientos sobre el sistema Android. Sin embargo, la vasta extensión de sus librerías hace que, al contrario que con otros lenguajes, introducirse en Android no sea tarea fácil para los no iniciados. Con este libro se pretende contribuir a soslayar las dificultades y acercar este novedoso sistema al público en general. Profesores, estudiantes, científicos, ingenieros, técnicos y público en general encontrarán ideas útiles que podrán aplicar en sus trabajos, en sus tareas cotidianas o simplemente como entretenimiento, usando su smartphone o su tablet Android como herramienta.

Acerca de los ejemplos

El material didáctico de este libro consiste en más de ochenta ejemplos. Cada ejemplo se compone de una aplicación de Android completa con sus correspondientes capturas de pantalla. Los códigos fuente están disponibles en la página web de la editorial Marcombo y en la del autor. Cada ejemplo se descarga en forma de una carpeta comprimida con ZIP, que contiene un proyecto de Eclipse con todos los archivos de la aplicación. Dicha carpeta se puede importar o descomprimir directamente desde el programa Eclipse.

Para importar un proyecto de Android desde Eclipse, se pueden seguir las siguientes instrucciones:

1 Seleccionar Import en el menú File. Aparecerá una lista de opciones.

2 Seleccionar Existing projects into Workspace y pulsar next.

3 Marcar la opción Select archive file y pulsar Browse.

4 Seleccionar el archivo comprimido con el proyecto y pulsar aceptar.

Si, tras importar un proyecto en Eclipse, se produjera un error de compilación del tipo Compiler compliance level, debemos cambiar la versión de compilación de Java en las propiedades del proyecto. Para ello, pulsaremos con el boton derecho sobre el proyecto en Eclipse y seleccionaremos properties. Se abrirá una ventana con las propiedades. Iremos a la sección del compilador de Java y marcaremos Enable Project-specific settings. De este modo ya podremos modificar el valor aignado al Compiler compliance level.

Cómo localizar el fichero correspondiente a un ejemplo específico

Cada uno de los más de ochenta ejemplos de este libro contiene una actividad principal de la que se infiere el nombre del proyecto, y de ahí el nombre del fichero ZIP. Por ejemplo, si una actividad se llama Acelerometro o AcelerometroActivity, el archivo con el proyecto se llamará seguramente Aceleromero.zip, o un nombre parecido. Alternativamente, podemos leer el nombre del proyecto en las capturas de pantalla de los ejemplos, puesto que la barra superior de la ventana contiene el título de la actividad.

Acerca de los acentos

Los nombres de las variables y clases de Java, actividades y ficheros de recursos no pueden contener acentos ni otros caracteres como la letra ñ. Aunque hemos procurado escribir correctamente las tildes en las palabras en castellano en el texto, esto no es posible cuando se refieren a nombres de variables o ficheros. Tampoco se recomienda usar acentos en los nombres que designan a las columnas o tablas de una base de datos. El lector queda advertido de que, cuando encuentre una palabra castellana escrita incorrectamente sin tilde, ésta se refiere seguramente a uno de estos casos. De la misma manera, seguimos la norma de no utilizar acentos en los nombres de los proyectos.

Agradecimientos

Quisiera expresar mi agradecimiento, en primer lugar, a Jeroni Boixareu, de la editorial Marcombo, por sus sugerencias y apoyo para realizar este proyecto. En segundo lugar, a los lectores de mi primer libro de Android que me han escrito con ideas y peticiones. Algunas las he procurado incluir en esta obra. Gracias también a los miembros del grupo de Física Nuclear y Hadrónica de la Universidad de Granada, principalmente a Enrique Ruiz Arriola, Rodrigo Navarro Pérez y Nacho Ruiz Simó, que pacientemente atendieron a mis demostraciones con el teléfono de muchos de los ejemplos de este libro. Sus comentarios, durante los cafés, supusieron un valioso feedback. También es pertinente agradecer aquí el proyecto de investigación del Ministerio FIS2011-2414. Sin lugar a dudas, Android se integrará como herramienta en nuestra vida cotidiana y también en nuestro trabajo científico. Parte del material de este libro se desarrolló con la idea de aplicarlo en nuestras labores investigadoras. No olvido al Departamento de Física Atómica, Molecular y Nuclear de la Universidad de Granada, que ha facilitado la utilización de sus infraestructuras. Finalmente, le agradezco a mi familia su entusiasmo y paciencia, y especialmente a Miguel Ángel Amaro, la maquetación de este libro en Word.

2. ANIMACIONES INTERPOLADAS

En Android podemos aplicar animaciones simples a un objeto View. Se denominan animaciones interpoladas, o tweened animations, y consisten en traslaciones, rotaciones, cambios de tamaño o modificaciones de la transparencia. Cada animación puede almacenarse en un fichero xml en el directorio res/anim de nuestro proyecto. Este directorio habrá que crearlo, ya que Eclipse no lo genera al iniciar un nuevo proyecto.

2.1. Traslaciones

En este primer ejemplo Animacion.java aplicaremos una traslación a un texto definido como un objeto de tipo Textview. La traslación se efectúa especificando un cambio en la coordenada X inicial y final, en este caso en términos de porcentaje respecto al ancho total de la pantalla. También se debe especificar la duración de la animación en milisegundos. El sistema se encarga de interpolar entre la posición inicial y la final a intervalos regulares de tiempo para mostrarnos la animación. El siguiente fichero contiene la información de la animación:


El layout de este ejemplo es el siguiente:


En el programa Animacion.java definimos un objeto de tipo Animation mediante una referencia al fichero de animación traslacion_derecha.xml. Para iniciar la animación, basta con llamar al método startAnimation() del objeto TextView, pasando la animación como argumento.

 


El método setFillAfter(true) debe llamarse para que la transformación se mantenga tras la animación. En caso contrario, al finalizar esta, se mostrará el objeto TextView en su posición especificada en el layout. La animación se aplica al objeto TextView como un todo. Si añadimos texto con append más adelante, este también será animado. El resultado se muestra en la figura 2.1. El texto animado aparece inicialmente desplazado hacia la izquierda. Esto se establece en el fichero de animación en la línea


que indica que la coordenada X se desplace una distancia negativa igual al 50% del ancho de la pantalla. La posición final se define en la línea


es decir, desplazar el texto una distancia positiva igual al 50% del ancho de la pantalla. Para que el texto desaparezca completamente de la pantalla, basta con desplazarlo una distancia del 100%. Por ejemplo, la traslación


hará que el texto, inicialmente fuera de la pantalla a la izquierda, aparezca moviéndose hasta desaparecer por la derecha de la pantalla.

Esta otra animación


hace que el texto aparezca por la izquierda hasta llegar a la posición indicada en el layout, con un desplazamiento final igual a cero.



Figura 2.1. Animación interpolada con traslación a la derecha. Durante la animación (izquierda) y tras la animación (derecha).

Análogamente, especificando un desplazamiento inicial igual a cero y final igual a 100%, haremos ver que el texto se mueve desde su posición inicial hasta desaparecer de la pantalla por la derecha.


El interpolador controla el modo en que la velocidad de la animación varía con el tiempo, indicado en el fichero xml de la animación mediante la etiqueta interpolator.


Estos son algunos de los interpoladores disponibles:


En el ejemplo anterior hemos utilizado el modo acelerate, con el que se consigue que el movimiento vaya haciéndose más rápido. En caso de que quisiéramos que la velocidad fuera constante, usaríamos linear. El interpolador overshoot produce el efecto de «dar martillazos».

2.2. Repetición de animaciones

Para repetir una animación, debemos usar el método setRepeatMode() e indicar el número de repeticiones con setRepeatCount(). Por ejemplo, para repetir una animación 20 veces:


En este punto hay que advertir que en las actuales versiones de Android, la repetición de animaciones no funciona con la etiqueta set que hemos utilizado en el ejemplo anterior (bug documentado en la página web de Android). La etiqueta set se aplica a un objeto AnimationSet, que permite superponer varias animaciones. Para repetir una animación, esta debe ser simple, es decir, no debe contener la etiqueta set.

En el siguiente ejemplo se anima un texto central a lo largo de la diagonal. El movimiento es oscilatorio alrededor de su posición original con una amplitud de 50 píxeles de abajo arriba y de izquierda a derecha. El movimiento es rápido, con una duración de 200 milisegundos, y la aceleración es como un martilleo. El fichero de la animación es el siguiente:


Usaremos el siguiente layout:


A continuación se detalla el programa Java. Nótese que no se usa setFillAfter(true) para que el texto al final quede en su posición original. También se ilustra cómo pueden recuperarse algunos parámetros de la animación con getRepeatMode() y getRepeatCount(). En la figura 2.2. se muestra el resultado.


Figura 2.2. Animación repetida con movimiento diagonal. Durante la animación (izquierda) y tras la animación (derecha).



2.3. Rotaciones

Para generar una rotación debemos especificar el ángulo inicial y final. Esto se puede indicar en un fichero xml, al igual que en el caso de las traslaciones. En el siguiente ejemplo hacemos girar el texto central repetidas veces. Usando el mismo layout del ejemplo anterior, el fichero de la animación es el siguiente:


Las variables pivotX y pivotY indican la posición del centro de giro. En este caso, ambas valen 50%, correspondiendo al centro del objeto que se está rotando. El programa Rotacion.java es prácticamente el mismo que el del ejemplo anterior, cambiando el nombre del fichero de animación y el texto. En la figura 2.3. se muestra el resultado.




Figura 2.3. Animación rotando un texto.

2.4. Dilataciones y contracciones

Una dilatación o contracción es una animación de la escala en las dimensiones de un objeto de tipo View. Esto se hace en xml utilizando la propiedad scale. Para este ejemplo, usaremos el siguiente fichero de animación:


Se debe indicar la escala inicial y final en cada dimensión X e Y. El centro de dilatación se especifica igual que el centro de rotación, con pivotX y pivotY.

El programa Java para dilatar un texto sería una variante de los ejemplos anteriores, usando el mismo layout. En la figura 2.4. se muestra el resultado.



Figura 2.4. Animación dilatando un texto.