Incluir imágenes gravatar en tus apps Android
Se ha comentado en repetidas ocasiones la importancia de crear snippets que podamos reutilizar en nuestro código. Yo suelo guardarlas, como ya comenté, en gists para tenerlos siempre a mano, editarlos y compartirlos.
Como también dije, os iré compartiendo los que creo que os pueden ser de utilidad. Lo iré haciendo gradualmente y cuando crea que realmente están listos para que lo utilicéis. No tengáis prisa, todo llegará.
En esta ocasión pretendemos aprovechar que muchos de los usuarios de nuestra aplicación tienen creado un Gravatar, y lo utilizaremos como su imagen de perfil. Así además de simplificar y unificar las imágenes de los usuarios entre diferentes plataformas, es una buena manera de ahorrarnos el desarrollar todo el ecosistema de subida, almacenamiento y demás servicios relacionados con el tratamiento de las imágenes. Para los que no tengáis muy claro de que va esto del Gravatar aquí lo explicamos detenidamente.
Básicamente, deberemos montar lo que sería la dirección URL, puesto que en simplemente sabiendo el correo del usuario podremos solicitar al servidor dicha imagen. Explicamos en su momento el proceso en PHP de la mano de nuestro querido Alejandro. La base es la misma, pero en nuestro caso al ser Java, deberemos adaptar la idea al dicho lenguaje.
Manos a la obra
Deberemos convertir el email del usuario a MD5, para eso nos apoyaremos en estos dos algoritmos:
public static String md5Hex(String message) { try { MessageDigest md = MessageDigest.getInstance("MD5"); return hex(md.digest(message.getBytes("CP1252"))); } catch (NoSuchAlgorithmException e) { LOGE(TAG, e.toString()); } catch (UnsupportedEncodingException e) { LOGE(TAG, e.toString()); } return null; } public static String hex(byte[] array) { StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < array.length; ++i) { stringBuffer.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3)); } return stringBuffer.toString(); }
Y lo montamos todo con las URLs:
public final static String GRAVATAR_BASE_URL = "http://www.gravatar.com"; public final static String GRAVATAR_BASE_URL_SSL = "https://secure.gravatar.com"; public final static String GRAVATAR_AVATAR = "/avatar/"; public static String codeGravatarImage(String email) { String emailHash = md5Hex(email.toLowerCase().trim()); return GRAVATAR_BASE_URL + GRAVATAR_AVATAR + emailHash //+ ".jpg" }
Podríamos dejarlo así, pero en nuestro caso preferimos dar la opción de poner una imagen propia por defecto en el caso de que el usuario no disponga de Gravatar, al igual que cambiar el tamaño de la misma:
public final static int DEFAULT_SIZE = 80; public final static String GRAVATAR_DEFAULT_IMAGE = "http://sitio.com/imagen.jpg"; private static String formatUrlParameters() { List<String> params = new ArrayList<>(); params.add("s=" + DEFAULT_SIZE); params.add("d=" + GRAVATAR_DEFAULT_IMAGE); return "?" + TextUtils.join("&", params.toArray()); }
El script todo junto quedaría tal que así:
import android.text.TextUtils; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; /** * @author Miguel Catalan Bañuls */ public class GravatarUtils { private static final String TAG = "GravatarManager"; public final static int DEFAULT_SIZE = 80; public final static String GRAVATAR_BASE_URL = "http://www.gravatar.com"; public final static String GRAVATAR_BASE_URL_SSL = "https://secure.gravatar.com"; public final static String GRAVATAR_AVATAR = "/avatar/"; public final static String GRAVATAR_DEFAULT_IMAGE = ""; public static String codeGravatarImage(String email) { String emailHash = md5Hex(email.toLowerCase().trim()); String params = formatUrlParameters(); return GRAVATAR_BASE_URL + GRAVATAR_AVATAR + emailHash //+ ".jpg" + params; } public static String md5Hex(String message) { try { MessageDigest md = MessageDigest.getInstance("MD5"); return hex(md.digest(message.getBytes("CP1252"))); } catch (NoSuchAlgorithmException e) { LOGE(TAG, e.toString()); } catch (UnsupportedEncodingException e) { LOGE(TAG, e.toString()); } return null; } public static String hex(byte[] array) { StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < array.length; ++i) { stringBuffer.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3)); } return stringBuffer.toString(); } private static String formatUrlParameters() { List<String> params = new ArrayList<>(); params.add("s=" + DEFAULT_SIZE); params.add("d=" + GRAVATAR_DEFAULT_IMAGE); return "?" + TextUtils.join("&", params.toArray()); } }
¿Perezoso?
Si lo quieres todo junto, ordenado, bonito y con un lazo aquí tenéis el Gist que os comentaba al principio.
¿Qué opináis?¿Os ha sido de utilidad?