martes, 21 de febrero de 2012

Twitter desde android con twitter4j


Intentando responder una consulta a alumnos me propuse crear una aplicación android que permita cambiar el status en twitter. Lo que sigue a continuación es un resumen de los pasos que tuve que dar para construirla y algunas lecciones aprendidas.

Para empezar tuve que buscar las apis necesarias. El sitio de twitter para desarrolladores ofrece algunas opciones dependiendo el lenguaje que se desee utilizar, así que ahí encontré la referencia a twitter4j. El primer paso fue entonces bajar esta librería. En mi caso alcanzo con utilizar el archivo twitter4j-core-android-2.2.5.jar, agregandolo al Build Path de mi aplicación

Las aplicaciones que interactúan con twitter deben estar registradas. Para eso alcanza con entrar en el sitio para desarrolladores y definir nuestra aplicación. El proceso es bastante sencillo y nos proveerá algunos datos que luego necesitaremos para interactuar con twitter.


Es importante definir la aplicación como lectura/escritura y definir una dirección de callback. No importa que dirección, lo importante es que ingresemos algo:

Al terminar el proceso obtendremos algunos datos importantes, entre ellos el consumer key y consumer secret:

Antes de poder usar la librería es necesario entender el mecanismo de autenticación que ofrece twitter para aplicaciones externas. El mismo utiliza el protocolo OAuth, que permite a las aplicaciones interactuar con twitter sin necesidad de intercambiar (comprometer) los datos de usuario usuario y clave.

La primera vez que nuestra aplicación se ejecute dirigirá al usuario a una página web de twitter para autenticarse (no olvidar asignar permiso de acceso a internet para la aplicación). Cuando el usuario se autentique en la página web, nuestra aplicación recibirá la confirmación y guardara un token de acceso y una clave devueltas por la página. A partir de ese momento el usuario no necesitará volver a ingresar su nombre de usuario o clave, ya que el token y su clave lo identifican. Nuestra aplicación guardará en el almacenamiento local ese token para poder utilizarlo en las siguientes interacciones.

Ahora podemos crear la aplicación. Para la actividad inicial generamos el siguiente layout:

xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<TextView

android:id="@+id/textView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/contenido"

android:textAppearance="?android:attr/textAppearanceLarge" />

<EditText

android:id="@+id/editText1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_weight="0.77"

android:gravity="top"

android:inputType="textMultiLine" >

<requestFocus />

EditText>

<Button

android:id="@+id/button1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:onClick="tweet"

android:text="@string/tweet" />

LinearLayout>


Simplemente tiene una caja de texto para escribir el mensaje y un botón para cambiar el status. En la clase comenzamos definiendo algunos atributos:

public final static String consumerKey = "***********";

public final static String consumerSecret = "******************";

public final static String CALLBACKURL = "myapp://mainactivity";


private String twitterAccesToken = "";

private String twitterAccesTokenSecret = "";


private Twitter twitter;

private TextView tweetTextView;

private RequestToken rt = null;


Importante: los valores de consumerkey y consumersecret deben ser cambiados por los obtenidos al registrar la aplicación. Al iniciarse nuestra actividad veremos si entre las preferencias se encuentran el access token y acces secret necesarios para interactuar con twitter. Si no se encuentran direccionaremos al usuario a la página de twitter para que se autentique.

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);


tweetTextView = (TextView) findViewById(R.id.editText1);


SharedPreferences settings = getSharedPreferences("DemoPreferences",

MODE_PRIVATE);


twitterAccesToken = settings.getString("twitterAccesToken", "");

twitterAccesTokenSecret = settings.getString("twitterAccesTokenSecret",

"");


twitter = new TwitterFactory().getInstance();


if (twitterAccesToken.length() == 0) {

twitter.setOAuthConsumer(consumerKey, consumerSecret);

try {

rt = twitter.getOAuthRequestToken(CALLBACKURL);


} catch (TwitterException e) {

e.printStackTrace();

}

Intent i = new Intent(this, WebActivity.class);

i.putExtra("URL", rt.getAuthenticationURL());

startActivityForResult(i, 0);

}

}


Necesitamos una Activity con un WebView para que el usuario pueda ver la página. Esa es la actividad llamada WebActivity a la que hace referencia el código. El layout para la actividad será:


xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent" >


<WebView

xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/webview"

android:layout_width="fill_parent"

android:layout_height="fill_parent" />


LinearLayout>



Y el código:


public class WebActivity extends Activity {


Intent mIntent;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.web);

mIntent = getIntent();

String url = (String) mIntent.getExtras().get("URL");

WebView webView = (WebView) findViewById(R.id.webview);

webView.setWebViewClient(new WebViewClient() {

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

if (url.contains(DemotwitterActivity.CALLBACKURL)) {

Uri uri = Uri.parse(url);

String oauthVerifier = uri

.getQueryParameter("oauth_verifier");

mIntent.putExtra("oauth_verifier", oauthVerifier);

setResult(RESULT_OK, mIntent);

finish();

return true;

}

return false;

}

});

webView.loadUrl(url);



Este código permite que una vez que el usuario se autentica el control vuelva a la actividad anterior pasando la información obtenida. En la actividad original obtendremos los datos y los guardaremos en las preferencias de la aplicación:


@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (resultCode == Activity.RESULT_OK) {

String oauthVerifier = (String) data.getExtras().get(

"oauth_verifier");

AccessToken at = null;

try {

at = twitter.getOAuthAccessToken(rt, oauthVerifier);


SharedPreferences appSettings = getSharedPreferences(

"DemoPreferences", MODE_PRIVATE);

SharedPreferences.Editor prefEditor = appSettings.edit();

prefEditor.putString("twitterAccesToken", at.getToken());

prefEditor.putString("twitterAccesTokenSecret",

at.getTokenSecret());

prefEditor.commit();


} catch (TwitterException e) {

e.printStackTrace();

}

}

}


Una vez que tenemos los datos de autenticación podemos cambiar el status. Para ello en el click del botón colocamos el siguiente código:


public void tweet(View v) {

Configuration conf = new ConfigurationBuilder()

.setOAuthConsumerKey(consumerKey)

.setOAuthConsumerSecret(consumerSecret)

.setOAuthAccessToken(twitterAccesToken)

.setOAuthAccessTokenSecret(twitterAccesTokenSecret).build();

Twitter t = new TwitterFactory(conf).getInstance();

try {

t.updateStatus(tweetTextView.getText().toString());

tweetTextView.setText("");

} catch (TwitterException e) {

e.printStackTrace();

}

}

Listo. La primera vez que ejecutemos la aplicación deberemos autenticarnos contra twitter y a partir de allí la información de nuestra cuenta no viaja más. El resultado:




miércoles, 19 de noviembre de 2008

Tablas en Java II



Siguiendo con el ejemplo anterior, agregamos a a tabla la capacidad de detectar cuando se selecciona un nuevo elemento. Para ello solo agregamos un MouseListener sobre la tabla, y en el mouse click, vemos el elemento seleccionado.

Acá esta el link al código completo.

Dejo además otro link donde obtener mucha información de como usar Tablas.

martes, 18 de noviembre de 2008

Tablas en Java


Acá les dejo un ejemplo de como usar tablas y modelos en Java. En el ejemplo van a encontrar una clase de dominio (Mensaje) y una ventana con una tabla que muestra mensajes, diferenciando si son errores o no con un icono.

Lo interesante del ejemplo es ver como todo lo relacionado a como se muestra la tabla está especificado en la clase ModeloMensajes. En el constructor de la ventana se crea un modelo indicando los datos que se van a mostrar y se le setea este modelo a la tabla.

Acá está el link al código completo. Esta hecho con eclipse (por si quieren abrirlo con el editor visual), pero pueden ejecutarlo desde cualquier otra ide.



lunes, 7 de julio de 2008

Nació Sofi!

Hoy 7 de Julio a las 18:40 nació Sofía. Peso 3.700 grs. y midió 51 cms. Acá les dejo unas fotos con solo unos minutos fuera de la panza de la mamá.

Muchas gracias a todos los que estuvieron pendientes.