Truco Android: como hacer que tus aplicaciones aparezcan en el Market para los HTC Tattoo
Feb 8
Desde Android 1.6 se introdujeron nuevos tamaños de pantalla como la QVGA del Tattoo (240 x 320). Muchas aplicaciones no se ven bien a esta resolución (el tamaño normal es HVGA de 320 x 480) , por eso debemos indicar específicamente en el AndroidManifest.xml las resoluciones que soporta nuestra aplicación.
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4" /> <supports-screens android:smallScreens="true" android:largeScreens="true" android:normalScreens="true"/>
La primera línea indica que desarrollamos para Android 1.6, pero que damos soporte a la 1.5 (cuanta más gente la use mejor)
La segunda, indica las resoluciones que soportamos. Asegúrate de probarlas todas en el emulador antes de subirla al Market.
Tienes la explicación completa en la esta guía.
Concurso Entre Blogs: Gana un lector de ebooks Papyre 6.1.
Feb 2
A través de Twitter me he enterado de que la gente de EntreBlogs.com va a sortear (por cortesía de Grammata) un lector de libros electónicos Papyre 6.1. Los ganadores se decidirán el próximo día 5 de marzo de 2010.
Si quieres participar aquí tienes las bases del concurso.
Lastfm + Spotify + Twitter = Spotibot
Ene 21
Spotibot es un bot con el que podemos interactuar a través de Twitter y que nos prepara playlists basadas en consultas de Lastfm para que las escuchemos en Spotify, ahí queda eso
Veamos un ejemplo:
Con nuestra cuenta de Twitter mandamos un mensaje del estilo:
@spotibot similar to Heroes del Silencio
A los pocos minutos recibiremos una mención con la recomendación:
@francho_lab Try “Calles de Papel” by La Fuga -http://is.gd/6GXrv
Si pinchamos en el enlace se nos abre una página con la lista de canciones del álbum recomendado y un botón para abrirlas directamente en Spotify.
Pero no queda ahí la cosa, desde la web de Spotibot también podemos crear listas de canciones basadas en las preferencias que tenemos almacenadas en Lastfm.
por una red S.O.S.tenible ¡retirada de la Ley Sinde YA!
Ene 12

Leo en el blog de Enrique Dans que se ha creado una plataforma para luchar contra la “Ley Sinde” llamada Red S@Stenible. También se ha creado la campaña bajo el lema Internet NO será otra tele que llevará a cabo diversas acciones ciudadanas durante todo el periodo de la presidencia española de la UE.
Desde estas líneas quiero dar mi apoyo a estas iniciativas al igual que ya hice con el #manifiesto.
Después del salto tenéis el texto íntegro de la reivindicación, copiarlo y distribuirlo (cuanto más mejor).
Jugando con Java y el API de Twitter
Ene 9
Twitter tiene un API muy completa que nos permite interactuar con su servicio desde nuestras aplicaciones. Esta tarde he estado enredando un poco con ella y la verdad es que se me ocurren un montón de aplicaciones prácticas(logueos, análisis automáticos, integración en servicios de noticias, estadísticas, seguimiento de usuarios, actualizaciones automáticas del perfil, etc…)
Existen librerías en un montón de lenguajes que facilitan aún mas su uso. Pero en este caso yo he preferido programar un servicio desde cero (lo cual, gracias a la documentación del API no ha sido nada complicado).
El siguiente ejemplo es una aproximación sencilla que permite actualizar nuestro estado (enviar un post) desde aplicación Java.
/*
* http://creativecommons.org/licenses/by-nc/3.0/deed.es
*/
package org.francho.java.twitter;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
// http://commons.apache.org/codec/
import org.apache.commons.codec.binary.Base64;
/**
*
* @author francho - http://francho.org/lab/
*/
public class Twitter {
private String username;
private String pass;
private String response;
Twitter(String username, String pass) {
setCredentials(username, pass);
}
/**
* Ejemplo de acción implementada.
*
* Actualiza el estado de Twitter con el texto que recibe
*
* @param status
*/
public void statusesUpdate(String status) {
try {
URL url = new URL("http://twitter.com/statuses/update.xml");
status = URLEncoder.encode(status, "UTF-8");
String parametros = "status=" + status;
doTwitterRequest(url, parametros);
} catch (MalformedURLException ex) {
Logger.getLogger(Twitter.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(Twitter.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* Se encarga de la conexión con Twitter.
* Necesita tener precargada los datos de autentificación (constructor), la url y los parámetros
*/
private void doTwitterRequest(URL url, String parametros) {
response = "";
try {
// Creamos una conexión
URLConnection conn;
conn = url.openConnection();
conn.setAllowUserInteraction(false);
conn.setDoOutput(true);
// Configuramos la autentificación (sencilla basada en HTTP)
conn.setRequestProperty("Authorization", "Basic " + getBasicCredentials());
// Preparamos la conexión con el servidor (vamos a mandar un formulario por post)
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// Abrimos el canal de comunicación de envío
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
// Mandamos los parámetros de la acción que (los ha tenido que precargar el método correspondiente)
out.writeBytes(parametros.toString());
// Nos aseguramos de que todo se envíe
out.flush();
// Ya hemos dicho lo que teníamos que decir, así que cerramos la conexión de envio
out.close();
// Capturamos la respuesta
BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String l = "";
while ((l = input.readLine()) != null) {
response += l + "\n";
}
} catch (IOException ex) {
Logger.getLogger(Twitter.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void setCredentials(String username, String pass) {
this.username = username;
this.pass = pass;
}
public String getBasicCredentials() {
byte[] credentialsBytes = (username + ":" + pass).getBytes();
byte[] encodedBytes = Base64.encodeBase64(credentialsBytes);
return new String(encodedBytes);
}
public String getResponse() {
return response;
}
}
Este sería un ejemplo de uso de nuestra clase:
/*
* http://creativecommons.org/licenses/by-nc/3.0/deed.es
*/
package org.francho.java.twitter;
import java.util.Date;
/**
*
* @author francho - http://francho.org/lab/
*/
public class Test {
public static void main(String[] args) {
Twitter twitter = new Twitter("yoEnTwitter", "miclave");
Date ahora = new Date();
twitter.statusesUpdate("Jugando con Java y el API de Twitter " + ahora);
System.out.println(twitter.getResponse());
}
}



