Archive for the ‘Java’ Category

Android: inicializar un DatePicker

Cuando usamos un DatePicker para seleccionar una fecha, en casi todos los casos haremos algo con esa nueva fecha. Si lo que queremos hacer tiene que hacerse en el momento que se cambia la fecha tendremos que inicializar el DatePicker y asignarle el Listener que manejará el evento OnDateChange.

Para inicializar el DatePicker usaremos esta senténcia:

datePicker.init(year, month, day, dateSetListener);

Veamos un ejemplo:

DatePicker datePicker1 = (DatePicker) findViewById(R.id.datePicker1);
datePicker1.init(datePicker1.getYear(), datePicker1.getMonth(), datePicker1.getDayOfMonth(), new OnDateChangedListener() {
 @Override
 public void onDateChanged(DatePicker view, int year, int monthOfYear,int dayOfMonth) {
  // Hacemos algo cuando cambia la fecha
  Toast.makeText(getApplicationContext(), "FECHA:" + dayOfMonth + "/" + (monthOfYear+1) + "/" + year, Toast.LENGTH_SHORT).show();
 }
});

En el ejemplo hemos inicializado el DatePicker con la fecha que tiene por defecto, es la fecha actual. Podemos inicializar el DatePicker con la fecha que necesitemos.

datePicker.init(2013, 00, 31, dateSetListener);
private DatePicker.OnDateChangedListener dateSetListener = new DatePicker.OnDateChangedListener() {
 public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
  Toast.makeText(getApplicationContext(), "FECHA:" + dayOfMonth + "/" + (monthOfYear+1) + "/" + year, Toast.LENGTH_SHORT).show();
 } 
};

En este ultimo ejemplo hemos definido el comportamiento del Listener de forma autónoma, de manera que se podría reutilizar en otro DatePicker.

 

Share

Java: GetTimestamp usando Calendar

El timestamp UNIX es el número de segundos desde las 00:00:00 UTC del 1 de enero de 1970.

El Timestamp es una forma muy común de manipular y guardar las fechas. La parte práctica es que el formato es LONG y es muy fácil de manipular. La parte “mala” es que siempre hay que manipularlo para obtener fechas amigables para el usuario.

El objeto Calendar dispone del método getTimeInMillis, que devuelve el timestamp en milisegundos de la fecha actual.

 Calendar calendar = Calendar.getInstance();
 calendar.getTimeInMillis();

Si queremos obtener el timestamp de una fecha concreta, tenemos que inicializar la instancia del objeto Calendar.

 Calendar calendario = Calendar.getInstance();
 calendario.set( Calendar.YEAR, 2013);
 calendario.set( Calendar.MONTH, 03 );
 calendario.set( Calendar.DAY_OF_MONTH, 23 );
 calendario.set( Calendar.HOUR_OF_DAY, 0 ); 
 calendario.set( Calendar.MINUTE, 0 );
 calendario.set( Calendar.SECOND, 0); 
 calendario.set( Calendar.MILLISECOND, 0 );

Así queda en una función:

private long getTimeStamp(int year, int month, int day_of_month, int hour_of_day, int minutes, int seconds, int miliseconds ) {
 Calendar calendar = Calendar.getInstance();
 calendar.getTimeInMillis();
 calendar.set( Calendar.YEAR, year );
 calendar.set( Calendar.MONTH, month );
 calendar.set( Calendar.DAY_OF_MONTH, day_of_month );
 calendar.set( Calendar.HOUR_OF_DAY, hour_of_day ); 
 calendar.set( Calendar.MINUTE, minutes ); 
 calendar.set( Calendar.SECOND, seconds ); 
 calendar.set( Calendar.MILLISECOND, miliseconds );
 return calendar.getTimeInMillis();
}

Con la llamada:

long today = getTimeStamp(2013, 0, 30, 0, 0, 0, 0 );

Hay una cosa que hay que tener en cuenta, los meses van de 0 a 11.

Share

Android: Hash calculator

Para seguir con la temática de moda, y después de leer por ahí que me pico por estar en el lado de la luz… voy a poner en práctica, con un ejemplo de calculadora de hash, lo tratado en post anteriores.

Yo trabajo con eclipse pero voy a intentar poner las explicaciones sin entrar en el detalle de las acciones del entorno de trabajo que yo utilizo.

Creamos un proyecto nuevo de Android y creamos en el layout principal los objetos tal que la imagen siguiente o como nos resulte más usable.

Hash Calculator

Hash Calculator

Lo más relevante del archivo main.xml son los nombres de los campos:

[…]
    <EditText
        android:id="@+id/editTextString"
        android:inputType="text" >
[…]
        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/buttonCalculate"
[…]
        android:onClick="calculateHash"
        android:text="@string/buttonCalculate" />
[…]

Al botón le indicamos qué debe de hacer en la acción onClick, en este caso calculateHash.

5 TextView con los nombres siguientes:

            android:id="@+id/textViewMD5Hash"
            android:id="@+id/textViewSHA1Hash"
            android:id="@+id/textViewSHA256Hash"
            android:id="@+id/textViewSHA384Hash"
            android:id="@+id/textViewSHA512Hash"
Nota: los nombres, textos y demás están en inglés por la costumbre de programar en inglés.

 

Veamos como ha quedado nuestra clase encrypt después de arreglarla un poco para poder usarla en una App.

import java.security.MessageDigest;
import android.text.Editable;
public class encrypt {
      public static String hashStr(Editable str, String type) throws Exception {
            String result = "Impossible!";
            if (type == "MD5" || type == "SHA-1" || type == "SHA-256" || type == "SHA-384" || type == "SHA-512" ) {
                        MessageDigest md = MessageDigest.getInstance(type);
                        md.update(str.toString().getBytes());
                        StringBuilder sb = new StringBuilder();
                        for (byte b : md.digest())
                             sb.append(Integer.toHexString(0x100 + (b & 0xff)).substring(1));
                        result = sb.toString();
            };          
            return      result;    
      }
}

Hemos puesto un control para que el tipo de Hash corresponda con lo que podemos hacer.

La Activity de la App tiene el siguiente método para crearse, donde tomamos los campos del layout que van a interactuar de forma activa.

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        stringValue=(EditText)findViewById(R.id.editTextString);
        tvMd5Hash=(TextView)findViewById(R.id.textViewMD5Hash);
        tvSha1Hash=(TextView)findViewById(R.id.textViewSHA1Hash);
        tvSha256Hash=(TextView)findViewById(R.id.textViewSHA256Hash);
        tvSha384Hash=(TextView)findViewById(R.id.textViewSHA384Hash);
        tvSha512Hash=(TextView)findViewById(R.id.textViewSHA512Hash); 
    }

Como hemos comentado, el botón genera una acción onClick que llama al siguiente método:

    public void calculateHash(View view) throws Exception {
      Editable str = stringValue.getText();
      if ( str.toString() == "" ) {
            // do nothing or show a Toast message
      }else {
            tvMd5Hash.setText(encrypt.hashStr(str, "MD5"));
            tvSha1Hash.setText(encrypt.hashStr(str, "SHA-1"));
            tvSha256Hash.setText(encrypt.hashStr(str, "SHA-256"));
            tvSha384Hash.setText(encrypt.hashStr(str, "SHA-384"));
            tvSha512Hash.setText(encrypt.hashStr(str, "SHA-512"));
      }
    }

El resultado de la ejecución de la App es el siguiente:

Hash Calculator Result

Hash Calculator Result

Debido a que el resultado no se veía completo puse el contenido en un Scrollview.

Podeis encontrar el ejemplo  completo aquí: https://github.com/davidrojasdominguez/hash-calculator.git

 

Share

Java: Calcular hash

Como ya nos instruyó Josep Rivas en un post anterior Generación de Hashes en Objective-C, el concepto de Hash debe de usarse para comprobaciones y no para almacenar datos por los motivos que ya se mencionaron.

Tanto como si queremos usar un hash para comprobar como para almacenar datos, en Java lo podemos hacer utilizando lo que se conoce como Clases Motor, como por ejemplo la clase MessageDigest. Las clases motor en criptografía Java se deben al concepto de Independencia y extensibilidad de los algoritmos (uno de los 2 conceptos básicos en que se basa la Arquitectura Criptográfica de Java (JCA), más información aquí). Esto significa que JCA nos ofrece unas clases que proporcionan la funcionalidad de servicios criptográficos.

En resumen, Java no proporciona las funciones MD5 o SHA-256 de forma directa (como lo hace php por ejemplo), sino que hay que tomar una clase que ofrece servicios e implementar las funciones o métodos usando los servicios de encriptación que nos ofrece esa clase.

Vemos un ejemplo para aclarar estos conceptos. Tomaremos como clase motor la clase MessageDigest. Crearemos una clase “encrypt” en la que implementaremos nuestros métodos de hash. Luego esta clase la podremos usar en nuestros proyectos Java, Android, etc. Para empezar crearemos un método para calcular el Hash de una cadena en MD5.

/** Import MessageDigest Motor Class **/
import java.security.MessageDigest;
public class encrypt {
/**
 * Public Method md5Str
 * ARG: String
 * RETURN: Hash of String
 */
      public static String md5Str(String str) throws Exception
      {
            // Create a MessageDigest with MD5 criptographic services
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            // Load values to MessageDigest
            md5.update(str.getBytes());           
            // Get Encrypted value and show it in hexadecimal
            StringBuilder sb = new StringBuilder();
            for (byte b : md5.digest())
                  sb.append(Integer.toHexString(0x100 + (b & 0xff)).substring(1));
            return sb.toString();       
      }
 }

Obtenemos de la cadena “Hello World” el siguiente hash MD5: b10a8db164e0754105b7a99be72e3fe5

La JCA permite los siguientes algoritmos en sus clases motor

  • MD2
  • MD5
  • SHA-1
  • SHA-256
  • SHA-384
  • SHA-512

Por lo tanto, rápidamente pasando un parámetro más a nuestra método, podemos obtener un método que nos muestre el hash de una cadena en función del algoritmo deseado:

      public static String hashStr(String str, String type) throws Exception
      {
            MessageDigest md= MessageDigest.getInstance(type);
            md.update(str.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : md.digest())
                  sb.append(Integer.toHexString(0x100 + (b & 0xff)).substring(1));
            return sb.toString();       
      }

IMPORTANTE: Hay que afinar el método para verificar que los valores de type son los esperados y no generemos errores o excepciones inesperadas.

Estos son los HASH generados con este último método para la cadena “Hello World”

  • encrypt.hashStr(“Hello World”, “MD2″));

MD2: 27454d000b8f9aaa97da6de8b394d986

  • encrypt.hashStr(“Hello World”, “MD5″));

MD5: b10a8db164e0754105b7a99be72e3fe5

  • encrypt.hashStr(“Hello World”, “SHA-1″));

SHA-1: 0a4d55a8d778e5022fab701977c5d840bbc486d0

  • encrypt.hashStr(“Hello World”, “SHA-256″));

SHA-256: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

  • encrypt.hashStr(“Hello World”, “SHA-384″));

SHA-384: 99514329186b2f6ae4a1329e7ee6c610a729636335174ac6b740f9028396fcc803d0e93863a7c3d90f86beee782f4f3f

  • encrypt.hashStr(“Hello World”, “SHA-512″));

SHA-512: 2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b

Podeis comprobar los valores aquí.

Espero que esto nos ayude un poco más en el mundo de la encriptación.

Share

Android – Notificaciones Toast

Existe un tipo de notificación que no son invasivas para el usuario y le permiten seguir interactuando con la aplicación. Estas notificaciones son de tipo brindis, como su nombre indica. De echo son notificaciones que muestran un texto pero no permiten interacción. La definición oficial es la siguiente:

Una notificación brindis es un mensaje que aparece en la superficie de la ventana.Sólo llena el espacio requerido para el mensaje y la actividad actual del usuariopermanece visible e interactivo. La notificación automáticamente se desvanecedentro y fuera, y no aceptan eventos de interacción.

Toast Notification

Uso de Toast

Toast.makeText(context, text, duration).show();
  • “Context” es el lugar donde queremos que aparezca la notificación.
  • “Text” es el texto que se quiere mostrar
  • “Duration” es el tiempo que está visible la notificación. Existen constantes con unos valores predeterminados

Un ejemplo típico es usar la notificación cuando hacemos clic en un botón y queremos mostrar un mensaje.

        Button myButton = (Button) mainView.findViewById(R.id.myButton);
        myButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
            		// Show Notification
                	Toast.makeText(v.getContext(), "My Button clicked!", Toast.LENGTH_SHORT).show(); 

            	}
            }
        );

Más información en: http://developer.android.com/guide/topics/ui/notifiers/toasts.html

Share

Java : Hola Mundo!

No hay mejor manera de empezar una pagina de Snippets que con los tipicos “Hello World”, asi que aqui os dejo el de Java :

public static void main (String[] args)
{
 System.out.println(“hola mundo”);
}
Share