Aunque se hace más llevadero escribir con Swype sigue siendo arduo postear desde un tablet, aunque resulta especialmente emocionante pensar que por fin podré probar mis desarrollos Gingerbread en un entorno real y no en el simple emulador. Intentaré seguir portándome bien para que los Reyes me traigan uno de los grandes y dar el salto a Honeycomb pero, mientras tanto, a falta de pan buenas son tostadas. ¡Os deseo Feliz Navidad y buenos desarrollos!
sábado, 17 de diciembre de 2011
miércoles, 23 de noviembre de 2011
Despedida y cierre
lunes, 24 de octubre de 2011
martes, 4 de octubre de 2011
Prácticas Android: ejecutando aplicaciones apk desde otras aplicaciones Android
Para que esto sea posible se copia el archivo de instalación del OI File Manager en la subcarpeta /res/raw del árbol del proyecto. Esto supone la integración total de dicho archivo con el resto del proyecto. Cuando se envía un intent al explorador y éste no responde, se hace una copia temporal del archivo apk de /res/raw a la tarjeta SD (véase el método boolean guardarRawComo(String nombreFichero)). Una vez desplegado el apk en la SD ya podemos proceder a su ejecución con el envío de un nuevo intent con una acción de tipo ACTION_VIEW que activará la actividad de instalación. Al terminar y devolver el control a la actividad principal, se elimina el archivo temporal de la SD. Es importante contar el permiso de instalación de paquetes "android.permission.INSTALL_PACKAGES" declarado en el descriptor AndroidManifest.xml.
Puedes descargar el proyecto NetBeans aquí.
domingo, 2 de octubre de 2011
Practicas Android: capturando información de las llamadas entrantes
Bundle bundle = intent.getExtras();
String phone_number = bundle.getString("incoming_number");
Puedes descargar el proyecto Netbeans de ejemplo aquí. Ten en cuenta que esta aplicación no dispone de interfaz gráfica. Tendrás que abrir el log del terminal donde ejecutes la aplicación y a continuación abrir un segundo terminal desde el que realizar la llamada. La salida del programa se producirá en el log, tal y como indica la figura. Detectará el teléfono del llamante y cuando descuelgues registrará esta situación.
jueves, 29 de septiembre de 2011
Prácticas Android: arrastrar para desplazarse entre distintas pantallas
Prácticas Android: integrando un explorador de archivos en nuestras aplicaciones
adb install
miércoles, 28 de septiembre de 2011
Java. Splash-Screen de arranque de programa con transparencias.
martes, 27 de septiembre de 2011
Prácticas Android: enviando y recibiendo mensajes SMS
- Descarga el proyecto NetBeans de ejemplo aquí
- Para poder probar la aplicación deberás instalarla en dos terminales distintos, uno para enviar y otro para recibir. Como número de teléfono de cada terminal podrás usar el número de puerto en el que corre el emulador. Podrás verlo en la barra de título de la ventana del emulador.
Prácticas Android: enviando un email a una lista de destinatarios
Se nos pedirá que introduzcamos el identificador de la cuenta y nuestra contraseña:
Pulsamos el botón Next para avanzar. El proceso de verificación de la cuenta puede tardar algún tiempo:
A continuación podemos darle opcionalmente un nombre a nuestra configuración de cuenta y proporcionar un nombre de usuario que aparecerá en los mensajes salientes:
Después de pulsar el botón Done y si todo ha ido bien, el proceso termina mostrándonos una lista con los correos de nuestra bandeja de entrada:
Una vez configurado el correo, crea una app Android en NetBeans añadiendo el siguiente código al método onCreate().
String listaDestinatarios[] = {"correo1@hotmail.es", "correo2@gmail.com"};
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("plain/text");
intent.putExtra(Intent.EXTRA_EMAIL, listaDestinatarios);
intent.putExtra(Intent.EXTRA_SUBJECT, "Asunto");
intent.putExtra(Intent.EXTRA_TEXT, "Contenido");
startActivity(Intent.createChooser(intent, "Email"));
Al arrancar la aplicación ésta invocará a "Email" pasándole la lista de correos a los que va destinado el correo, con el asunto del mismo y el contenido. Después el usuario tendrá que pulsar el botón "Send" para confirmar el envío. Antes podrá llevar a cabo las ediciones que considere oportunas.jueves, 22 de septiembre de 2011
Prácticas Android: trabajando con bases de datos SQLite
Intenta subsanar los siguientes errores:
- La aplicación permite agregar un empleado sin nombre, especificando sólo la edad.
- El programa lanza un críptico mensaje de error cuando se introduce texto en el cuadro de la edad y se intenta insertar el empleado.
- Cuando eliminamos un empleado y volvemos a la pestaña para añadir nuevos empleados, no se actualiza el contador de empleados totales registrados en la base de datos.
- Tras ingresar un nuevo empleado, los cuadros de texto con la información del mismo no se limpian.
- No se impide la introducción de registros duplicados.
Otras tareas propuestas:
- Ya que los departamentos a los que pueden pertenecer los empleados se introducen desde el código, estos son fijos, no hay posibilidad de cambio. Habilita un cuadro de texto para poder añadir nuevos departamentos.
- Crea una nueva tabla donde vayan a parar los empleados que se hayan eliminado, a manera de archivo histórico y habilita algún componente que permita ver el contenido de dicho histórico.
miércoles, 21 de septiembre de 2011
Prácticas Android: servicios y reproducción de sonido
Un servicio es una aplicación que corre de forma automática, sin interacción directa con el usuario (aunque pueden ser interactuados por mediación de una actividad, como en este ejemplo). Desarrollan tareas importantes, para el resto de las aplicaciones o para el sistema, ejecutándose en segundo plano. Tienen un ciclo de vida diferente a las actividades, por lo que los métodos que hay que sobrecargar también son diferentes. En este proyecto NetBeans de ejemplo dispones de una interfaz gráfica con dos botones para iniciar y detener un servicio que permite reproducir música de fondo. Además, aparecerán advertencias indicándote por qué fase del ciclo de vida del servicio se está pasando en cada momento. Trata de contestar a los siguientes puntos:
- ¿Cuál es la clase base de la que han de derivar todos los servicios?
- ¿Cuál es la clase que permite la reproducción de sonidos?
- ¿Para qué sirve el método onBind() del servicio? ¿Por qué aquí devuelve null en todo caso?
- ¿Se ha de especificar el servicio de alguna manera en el AndroidManifest.xml?
- ¿Qué se invoca antes, a onCreate() o a onStart()?
- ¿Qué clase de objetos permiten comunicar la actividad con el servicio para controlarlo a través de los botones?
martes, 20 de septiembre de 2011
Prácticas Android: cambiando la altura de los tabs
- En main.xml localiza la etiqueta
y cambia android:layout_height="65px" por android:layout_height="40px" - En MainActivity.java localiza las instrucciones tipo
tabs.getTabWidget().getChildAt(<índice>).getLayoutParams().height = 65;
y sustitúyelas por
tabs.getTabWidget().getChildAt(<índice>).getLayoutParams().height = 40;
Prácticas Android: experimentando con secuencias animadas de imágenes
- ¿Qué clase es imprescindible para poder animar una sequencia de imágenes? ¿En qué paquete se encuentra?
- ¿Cómo podrías variar la velocidad de la animación?
- ¿Qué habría que hacer para incluir algún fotograma más?
lunes, 19 de septiembre de 2011
Java 2D
A medida que se van introduciendo nuevas clases de la API, éstas se van hilvanando entre sí para proporcionar al programador un mayor control sobre el aspecto de los lienzos que quiera dibujar. De esta forma se estudia, entre otras muchas cosas, el dibujo de figuras sobre fotografías digitales, la sobreimpresión de texto sobre imágenes e incluso la utilización del contorno de un texto en negrita como elemento a través del que ver una imagen de fondo.
Cada uno de los conceptos necesarios se introduce desde cero, aunque se suponen conocimientos del lenguaje Java, y se proporcionan numerosos ejemplos completos que pueden ser puestos en práctica sin más modificación que la de elegir la foto preferida que se desea transformar, o modificar la cadena de texto a visualizar. Cada ejemplo se acompaña de una adecuada explicación sobre las líneas de código vitales que producen el efecto que se desea conseguir en cada caso, por lo que al lector le resultará muy cómodo realizar modificaciones personalizadas y obtener sus propios resultados. La inclusión de las imágenes que resultan de cada uno de los ejemplos comentados también ayuda enormemente a la comprensión del código y facilita la asimilación de conceptos.
jueves, 15 de septiembre de 2011
Prácticas Android: Cambiar/Restaurar el fondo de pantalla.
- Cambiar el fondo de pantalla supone disponer de algún permiso especial. ¿Cómo se llama dicho permiso? ¿En qué archivo ha de ser especificado?
- Intenta sustituir la imagen del tigre por otra imagen personalizada.
- ¿Serías capaz de crear una lista de imágenes para poder elegir entre varias?
martes, 13 de septiembre de 2011
Android: ejemplo de Cajón Deslizante (SlidingDrawer)
- Archivo /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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<SlidingDrawer
android:id="@+id/drawer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:handle="@+id/handle"
android:content="@+id/content">
<ImageView
android:id="@id/handle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/icon"/>
<LinearLayout
android:id="@id/content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Ejemplo de Sliding Drawer"/>
</LinearLayout>
</SlidingDrawer>
</LinearLayout>
- Archivo /res/values/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Demo Cajón Deslizante</string>
<string name="hello">Hola a todos</string>
</resources>
Prácticas Android: Campos de texto con función de autocompletado dinámica
Descarga el siguiente proyecto de NetBeans e indaga sobre la implementación de este campo de texto dinámico para introducir nombres de países. A medida que se escribe irán apareciendo nombres cuya parte inicial coincida con los caracteres introducidos. Si no se selecciona ningún país de la lista desplegable y se introduce uno nuevo, al hacer clic en el botón "Agregar País", dicho país se añadirá a la lista ya existente de manera que también podrá formar parte de despliegues posteriores. Esto es, el programa tiene una lista estática inicial formada por los países "Argentina", "Albania", "Alemania", "Argelia", "Israel", "Bolivia", "México", "Brasil", "Holanda", "Italia", "España", "Etiopía" pero podrás aumentarla con los países que vayas introduciendo en tiempo de ejecución.
Trata de hallar respuesta a las siguientes cuestiones:
- El TextView auxiliar con id "txt_texto" está declarado convenientemente pero su atributo de visibilidad ha sido marcado como "gone" y no se despliega en pantalla. ¿Qué diferencia aprecias al cambiar "gone" por "invisible"? ¿Son lo mismo? Estudia el comportamiento de la aplicación también cuando se marca como "visible"
- ¿Cómo se consigue que no se almacene el mismo país más de una vez? Si los textos introducidos son exactamente iguales no aparecerán repetidos en la lista desplegable; pero si hay diferencias entre mayúsculas y minúsculas sí se repiten... ¿Se te ocurre alguna manera de evitar esta situación?
- Cambia el valor de la propiedad android:completionThreshold para descubrir cuál es su cometido.
Prácticas Android: explorando los ficheros de texto
Ejemplo de lectura de fichero de texto:
Prácticas Android: crear aplicaciones con más de una pantalla
- La creación de una clase por cada pantalla extendiendo siempre la clase Activity
- Los archivos descriptivos de las distintas interfaces en la subcarpeta /res/layout. ¿Cómo asocia el compilador cada archivo XML con la subclase de Activity (pantalla) que le corresponde?
- La inclusión de las actividades en el descriptor AndroidManifest.xml
- La comunicación entre pantallas mediante objetos Intent y el paso de pares (clave, valor) mediante Bundle.
jueves, 8 de septiembre de 2011
miércoles, 7 de septiembre de 2011
Prácticas Android: experimentando con Google Maps
Descarga este proyecto de NetBeans 7.0.1 en el que encontrarás una aplicación básica para el uso de Google Maps sobre Android. Para que funcione deberás contar con un terminal virtual con la siguiente configuración:
Una vez cubiertos estos pormenores podrás ejecutar la aplicación desde el IDE de NetBeans. Simplemente, carga a pantalla completa un mapa donde se marca la ubicación del centro donde estamos impartiendo el curso, tal y como se muestra en la primera viñeta.
No obstante, hay comentadas algunas líneas de código que ilustran otras características adicionales de los mapas. Por ejemplo, en el método sobrecargado onCreate() de la clase AndroidMapas hay una línea comentada para activar la vista de satélite. Quita el comentario y vuelve a ejecutar el proyecto para comprobar que efectivamente funciona. En ese mismo método, al final, hay una llamada comentada al método privado buscarUbicacion() que es capaz de mostrarnos el mapa de alguna ubicación dando una descripción textual de la misma. Esto es, la función contraria a la primera: en vez de buscar un punto a partir de sus coordenadas, buscamos una coordenada a partir de la descripción del punto.
Si quieres una explicación más detallada de la funcionalidad de las distintas líneas de código lee atentamente estos tres artículos relacionados:
javascript:void(prompt('',gApplication.getMap().getCenter()));
Una vez que dispongas de las coordenadas localiza el lugar del código donde se emplean así como dónde se le da nombre al punto referenciado para cambiar el texto de la etiqueta.
Prueba, también a hacer búsquedas descriptivas con distintas cadenas de texto. Lo ideal sería que ampliaras la interfaz mediante un cuadro de texto que me permitiese introducir la cadena de búsqueda y un botón para activarla.
¿Sabrías decir en qué parte del código se elimina la barra de título y los iconos de batería y cobertura para aprovechar todo el espacio de la pantalla para el mapa?
¿Serías capaz de cambiar el marcador típico de Google Maps por el icono de una chincheta o el logotipo de Android?
Averigua cómo cambiar el círculo azul del marcador por un cuadrado rojo.
martes, 6 de septiembre de 2011
Ejercicio. Desarrollar una aplicación Android básica.
- La edad debe ser superior o igual a 18 años, pues se considera que el cálculo no es suficientemente preciso aplicado a menores de edad.
- La altura debe ser superior o igual a 150 cms, pues el cálculo se desvirtúa para personas que padezcan algún tipo de problema de crecimiento.
- El peso no puede ser negativo o cero.
- Todos los campos son obligatorios.
El resultado que debe mostrarse en la salida, en función del índice calculado, será:
- Por debajo de los 20 Kg/m2: "Anorexia nerviosa"
- Entre 20 y 25: "Peso ideal"
- Entre 25 y 30: "Sobrepeso o exceso de peso"
- Entre 30 y 35: "Obesidad leve"
- Entre 35 y 40: "Obesidad moderada"
- Por encima de 40: "Obesidad mórbida"
Para calcular el IMC emplea la siguiente fórmula:
lunes, 5 de septiembre de 2011
Archivos principales de un proyecto Android en NetBeans
MainActivity.java: es la actividad principal de nuestra aplicación; en otras palabras, es la clase que se inicia al ejecutarse nuestra app. Justo cuando acabamos de crear nuestro proyecto la clase sólo contiene esto:
R.java: esta clase sirve para encontrar los recursos de datos que se generen en la aplicación. Esta clase nunca debe modificarse manualmente ya que se genera automáticamente cada vez que compilamos o en el momento que ingresamos un nuevo recurso en algún archivo; inicialmente contiene esto:
main.xml: este archivo nos sirve para declarar o posicionar los objetos como botones, vistas, textos, inputs etc. Se basa en tags o etiquetas al estilo de HTML; inicialmente sólo tiene un objeto "TextView" con la leyenda "Hello Android from NetBeans". Básicamente este archivo es el que muestra todo lo que vemos en pantalla. Se pueden tener varios archivos de este tipo en la carpeta layout si se quiere tener más de una vista diferente.
Strings.xml: este archivo se utiliza para crear recursos estáticos de variables u otras cosas, como por ejemplo el nombre de la app o valores iniciales para algún input, en este caso solo tengo una string con el nombre de mi app.
AndroidManifest.xml: el archivo donde se indica qué actividad será la principal, cuales serán los intents, el nombre de versión, el nombre de aplicación y el icono que usará su aplicación, entre otros aspectos descriptivos de la aplicación.
Estos serían, grosso modo, los archivos principales de un proyecto en Android.