Consumir JSON en Android

Si el otro día hablaba de crear y consumir JSON en PHP, ahora toca su turno a Android.

¿Por qué usar JSON? Bueno, es un formato de intercambio de datos independiente de cualquier lenguaje y autodefinido. Ok, XML también, pero JSON es más ligero y fácil de parsear.

Existen varias librerías para JSON en Android, pero en el ejemplo usaremos los métodos nativos del SDK: las clases JSONArray y JSONObject.

JSONArray necesita recibir una cadena JSON para devolvernos un array de JSONObject. Supongamos que hemos recibido esos datos (sea de un web service o de un archivo) y los tenemos en una variable llamada data:

JSONArray jsArray = new JSONArray(data);

Ahora ya tenemos los datos dentro de un JSONArray. ¿Cómo lo recorremos? Pues con un for:

for (int i = 0; i < jsArray.length(); i++) {
    JSONObject jsObject = jsArray.getJSONObject(i);
    
    int intejemplo = jsObject.getInt(atributo1);
    String stringejemplo = jsObject.getString(atributo2);
}

El problema es que trabajar así puede ser muy plomífero, tratando los datos a mano, uno a uno. Existen librerías que te pueden echar un cable en esto, dándote mayores funcionalidades. En este caso las dos más populares son GSon y Jackson. En los enlaces podrás ver documentación sobre su uso.

El saber manipular JSON se torna capital cuando quieres trabajar con servicios web, o para comunicar apps con widgets.

Instalar Oracle Java en Ubuntu

Hasta hace unos años Java, de Sun Microsystems, estaba totalmente disponible en los repositorios de Ubuntu. Tras la compra de Sun por parte de Oracle la cosa cambió, se bifurcó entre la versión OpenJava y la OracleJava.

En principio Ubuntu nos proveerá de la versión OpenJava, que debería cubrir todas las necesidades del usuario medio. Pero para el desarrollador puede ser interesante disponer de la versión de Oracle, o simplemente puede darse en algún momento el caso de que un usuario la necesita. Así que la cosa es tal que así:

#Añadir el repositorio a la lista
sudo add-apt-repository ppa:webupd8team/java

#actualizar repositorios
sudo apt-get update

#Instalar OracleJava 7
sudo apt-get install oracle-java7-installer

#Si quieres comprobar que se ha instalado correctamente puedes con
java -version

Listo y sencillo.

Herramientas para revisar la calidad del código Java

Creo que hace un tiempo mi colega El señor Mozano me comentó hace tiempo que hablara de herramientas para el control de calidad del código. Lo dejé colgado, pero he decidido finalmente documentarme, experimentar y lanzar una entrada sobre el tema.

Creo que lo primero es hablar de PDM, una herramienta que controla que se hayan utilizado buenas prácticas de programación: que no haya código duplicado por copypaste, que los algoritmos no se hayan liado y vuelto complejos sin necesidad, que todos los try tengan además del catch su finally… en fin, se trata de una gran herramienta que se integra a la perfección en Eclipse o NetBeans.

Creo que hace tiempo se usaba mucho Checkstyle, pero a mi al menos en las últimas versiones de Eclipse me pareció bastante inútil, porque muchas de sus funcionalidades ya las abarca de por si el IDE. En todo caso, siempre puedes probar, es un revisor de convenciones como la indentación, las convenciones en el nombramiento de variables… etc.

Por su parte Cobertura identifica el porcentaje de código que ha sido accedido en los tests, detectando código inválido o que no ha sido testeado, generando luego un informe en XML.

Me habían recomendado una herramienta llamada FindBugs he de decir que no he trabajado mucho con él en solitario. Busca fallos dentro del código Java haciendo un análisis estático. Es una herramienta desarrollada en Java que requiere de JDK 1.5 como mínimo, aunque es capaz de revisar hasta código en Java 1.0, es libre (licencia LGPL) y fue desarrollado por la universidad de Maryland

Pero todas estas herramientas pueden resumirse en una, la más utilizada: SONAR. Realmente es una recopilación que utiliza algunos de los programas antes citados (al menos seguro FindBugs, Checkstyle y PDM, y algunos más de los que no he hablado) por lo que se trata de una herramienta muy completa. Podéis instalarlo solo o integrado en un Tomcat con MySQL (y puede que haya más opciones, pero me remito a lo aprendido en este tutorial) y existen plugins para otros muchos lenguajes (PHP, Cobol, C, C#, PL/SQL…), aunque nativamente trabaja con Java. Podéis informaros sobre él en la web del proyecto, desde el que lo podéis descargar.

Desde luego que Sonar os ahorrará romperos mucho la cabeza al integrar herramientas ya para todo: buscar duplicados, revisar la arquitectura, el sangrando, la complejidad, los posibles bugs, los comentarios, las convenciones… Pero si queréis probar por separado todas las antes citadas se integran perfectamente en Eclipse.

Programando un activity de Android para que se abra a una hora definida

Ya sea para una aplicación de despertador, para programar una actualización diaria, para hacer una app de notas de aviso… cuando desarrollamos una app para android es muy útil (y a veces indispensable) poder aprovechar para programar que una aplicación se lance a una determinada hora.

Suponiendo que ya sabes sobre desarrollo Android, la idea es simple: creas una activity que, al recibir un evento de calendario (con la hora concreta) lanza la otra activity en cuestión. Por ejemplo, «Quiero que todos los días a las 12:01 la aplicación se conecte a la base de datos y actualice la información».

El primer paso, lo dicho, es crear una clase que herede de BroadcastReceiver, sobreescribiendo su método onReceive:

public class Temporizador extends BroadcastReceiver{
@Override 
	public void onReceive(Context context, Intent intent)  { 
            Intent actividadALanzar = new Intent(context, actividadALanzar.class);
            context.startActivity(actividadALanzar);
	}
}

Debemos declarar esta clase en el Android Manifest, dentro de la etiqueta

<receiver  android:process=":remote" android:name="Temporizador"></receiver>

Lo siguientes es crear la pantalla principal y programar el evento, usando una clase PendingIntent:

Intent intentoLanzar = new Intent(getBaseContext(), Temporizador.class);
PendingIntent pIntent=PendingIntent.getBroadcast(this, 0, intentoLanzar, PendingIntent.FLAG_UPDATE_CURRENT);

Finalmente basta con crear un objeto calendario, con las horas definidas, y utilizar el AlarmManager para lanzar el intento pendiente a la hora prefijada (en este caso, estará pillando la hora actual):

Calendar cal = Calendar.getInstance(); 
cal.setTimeInMillis(System.currentTimeMillis());
cal.set (Calendar.HOUR_OF_DAY, timePicker.getCurrentHour()); 
cal.set (Calendar.MINUTE, timePicker.getCurrentMinute()); 
cal.set (Calendar.SECOND, 0);

AlarmManager aMan = (AlarmManager)getSystemService(ALARM_SERVICE); 
aMan.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pIntent); 

Aunque este método os permite hacer llamadas periódicas a la aplicación, esto no es recomendable por el excesivo consumo de energía. Los servicios se crearon para hacer eso de forma eficiente.

Instalar JBoss en Linux.

El servidor de aplicaciones Java JBoss es uno de los más populares y utilizados. Su instalación en Linux no plantea demasiados problemas siguiendo unos sencillos pasos:

Lo primero es descargar JBoss desde su página oficial. Tenéis que tener en cuenta qué versión del JDK de Java tienes instalado, para saberlo basta con ejecutar java -version en el terminal, y nos devolverá la información sobre la versión de Java instalada. Recuerda, la versión del JDK y la de JBoss han de ser compatibles entre sí.

Luego debes desempaquetar el .zip descargado en algún directorio donde tengas permisos de
lectura y escritura.

Tras descomprimir el zip queda ajustar las variables de entorno, más concretamente que la variable JBOSS_HOME apunte al directorio de instalación de JBoss. En el archivo .bashrc localizado en el home agrega la sentencia: export JBOSS_HOME= seguida del fichero donde descomprimieras el .ZIP en el paso anterior. También tienes que comproba que JAVA_HOME esté apuntando al directorio de instalación del JDK.

Si vas a utilizar el API de persistencia de Java (JPA), tendrás que instalar el archivo jar del driver JDBC en el directorio $JBOSS_HOME/server/default/lib; donde default es la configuración utilizada por JBoss.

A la hora de arrancar JBoss tenéis varias opciones (all, default, minimal, standard, web). Por defecto arranca en default, pero para iniciar JBoss con una configuración distinta a esta se debe ejecutar: $JBOSS_HOME/bin/run.sh -c, seguido de la opción (por ejemplo $JBOSS_HOME/bin/run.sh -c all).

Encriptando en MD5 con java

Todavía no he buceado mucho en JavaSE7, pero que yo recuerde JSE6 no incluía ninguna función que encriptara en MD5, y a la hora de trabajar con contraseñas (a nivel de seguridad web, por ejemplo) este algoritmo es muy útil. Normalmente en mis desarrollos en PHP suelo encriptar en el cliente usando una función md5 en Javascript, pero en Java podréis hacerlo con el siguiente código. Se trata de una función que recibe una cadena y devuelve su hash md5.

Bueno, primero tendréis que incluir estas dos librerías:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

En todo caso, si usáis Eclipse o NetBeans para programar en Java ya os pedirá que importéis dichas librerías al añadir referencias a ellas en el código. La función es la siguiente:

        public static String cryptMD5(String textoPlano)
	{
		try
		{
		   private static final char[] HEXADECIMALES = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' };

		   MessageDigest msgdgt = MessageDigest.getInstance("MD5");
		   byte[] bytes = msgdgt.digest(textoPlano.getBytes());
		   StringBuilder strCryptMD5 = new StringBuilder(2 * bytes.length);
		   for (int i = 0; i < bytes.length; i++)
		   {
		       int low = (int)(bytes[i] & 0x0f);
		       int high = (int)((bytes[i] & 0xf0) >> 4);
		       strCryptMD5.append(HEXADECIMALES[high]);
		       strCryptMD5.append(HEXADECIMALES[low]);
		   }
		   return strCryptMD5.toString();
		} catch (NoSuchAlgorithmException e) {
		   return null;
		}
	}

La he testeado y ha ido funcionando, así que creo que os puede hacer un buen servicio a la hora de trabajar con contraseñas de forma segura.