Hola amigos de androideity el dia de hoy les mostrare como poder enviar un tweet desde tu propia aplicacion, seguramente habran visto o usado muchas aplicaciones que permiten realizar esto como la de nike+ running , endondomondo, etc. al final del tutorial tu podras hacer lo mismo.
Twitter posee una API REST mediante la cual interactuaremos con el, también pone ofrece un listado de librerías para diversos lenguajes para poder utilizar el api de una manera sencilla, actualmente el api se encuentra en la version 1.1 la version 1.0 dejara de funcionar en marzo del 2013
Lo que nosotros vamos a realizar puede hacerse directamente desde el api sin utilizar ninguna librería pero esto implica tener un fuerte conocimiento sobre esta, para poder facilitar las cosas utilizaremos una librería orientada a java llamada Twitter4J también es compatible con Android y permite compatibilidad con OAuth, recomiendo que le den una lectura rapida a la documentacion de esta libreria.
Twitter utiliza OAuth para proveerle acceso al api a las aplicaciones externas, este mecanismo de autenticacion nos permite interactuar sin la necesidad de comprometer los datos del usuario como el usuario y clave.
mas info sobre OAuth: http://es.wikipedia.org/wiki/OAuth
tambien ofrece algunos ejemplos sobre como acceder usando este protocolo. https://dev.twitter.com/docs/auth/using-oauth
Antes de empezar a ver el código necesitamos registrar nuestra aplicación para que pueda interactuar con el, podremos hacerlo desde aquí una vez ya logueados veremos una pantalla como esta:
Yo le puse de nombre a mi aplicacion: sebas_tweet_test_android_app ustedes deben ingresar otro diferente.
El formulario es muy simple de completar pero hay 2 que pueden confundir.
Website: deberán colocar la dirección de la pagina web de la aplicación en donde el usuario podria descargarla, aunque si no tienen ninguna web pueden escribir lo que deseen no importa si existe o no.
Callback URL: Aqui pueden ingresar la direccion web a la cual nos retornara una vez de que la autenticacion con twitter alla sido exitosa. se puede dejar en blanco tambien.
una vez que halla completado el captcha y aceptado los termino clicken en “Create your Twitter application”.
Luego veran esta pantalla:
Como veran al comienzo muestra el nombre de la aplicación que registramos, la descripcion y la url que ingresamos en el campo website.
Deben ir a la solapa settings , veran que pueden moficar todos los datos que ingresaron antes, tambien pueden cambiar el icono de la aplicación deben dirigirse
a la sección Application Type y seleccionar Read and Write ya que la aplicación no sera de solo lectura, una vez actualizado los datos deben volver a la solapa details y tomar nota de los sig. valores que utilizaremos en la aplicacion, “Consumer key”,”Consumer secret”. Estas claves son las que usara nuestra aplicación de android para autenticarse con twitter. Luego terminaremos la registracion clickeando en “Create my access token”, con esto terminamos la parte del registro en twitter.
Ahora si manos a la obra.
Como siempre tendran el codigo disponible en el repositorio en github al final.
Ahora es el turno de descargar la librería Twitter4J que les comente al principio, al momento en que he escrito el tutorial la ultima version era la 2.2.6
para android pueden descargarla de aqui.(igual en el repositorio estara el proyecto de eclipse con la libreria ya incluida).
de lo que descargaron el archivo que deben buscar esta dentro de la carpeta lib llamado “twitter4j-core-android-2.2.6.jar”.
javadoc de la libreria aqui.
La version de android que he utlizado para hacer este tutorial es la 2.3.3.
he llamado al proyecto “Twitter_testapp”, si no van a usar el codigo del repositorio recuerden incluir la libreria antes de continuar
La estructura del proyecto es la siguiente, como veran luego de incluir la libreria deberia de quedar asi.
La aplicación sera muy simple, basicamente hara lo siguiente:
1- Al arrancar buscara en el shared preferences si existe el registro con las claves obtenidas de twitter, en caso de que NO abrira un webview que la primer vez que corramos la app nos pedira loguearnos en twitter para habilitar que la app pueda utilizar nuestra cuenta de twitter, luego descargara unas claves que guardara en el shared preferences para que la porxima vez que arraque pued ‘loguearse’ automaticamente.
2-Luego podremos escribir un tweet, al intentar enviarlo volvera a realizar la validacion previa, luego enviara el texto que hallamos escrito, en caso de sea exitoso el borde de la imagen del medio sera de color verde, si ocurrio algun fallo sera de color rojo.
3-Tambien hay un boton de Logoff que borrara los datos almacenados en el sharedpreferences.
Se vera de la siguiente forma:
Cuando el envio del tweet sea exitoso se vera de esta forma, podran observar que el borde la imagen del centro cambia de color.
En caso de error:
He creado dos clases auxiliares para facilitar el manejo del envio de tweets y el acceso al shared preferences ademas esta pueden ser reutilizadas para otros proyectos.
He creado una clase llamada “Constants_Settings”
Aquí he definido algunas constantes que usaremos en toda la app.
Deben modificar los siguientes valores por los obtenidos cuando registramos la aplicación en twitter.
OAUTH_CONSUMER_KEY =”Consumer key”
OAUTH_CONSUMER_KEY_SECRET=”Consumer key Secret”
En esta ocasion no hablare sobre los layouts y el archivo manifest ya que son muy simples, los pueden ver directamente en el repositorio.
Veremos primero la clase principal MainActivity.java leer comentarios en cada caso.
Les comentare basicamente lo que hacemosen esta clase:
En la linea 41 se crea una instancia a la clase TweetHelper a la cual le pasamos el context como parametro.
Luego en la 45 llamamos al metodo validar_login() que lo que hace es verificar si en el telefono estan almacenados los access token y acces token secret en caso de que no llama al webview lineas 93 a 98
Intent i = new Intent(MainActivity.this, TwitterWebActivity.class);
i.putExtra(“URL”, tweet_hlp.get_AuthenticationURL());
en este pasa como parámetro la autenticationURL que seria la url callback que comente mas adelante , cuando el webview termina nos retorna el oauth_verifier del cual en la linea 116 en onActivityResult
tweet_hlp.Store_OAuth_verifier(oauthVerifier);
lo almacenamos en el telefono.
Luego tenemos el botón de envio de Tweets que volvera a llamar validar_login() descripto recien.
Tambien obtenemos el texto del campo de text
String texto = tweet_txt.getText().toString();
Luego hacemos uso del metodo Send_Tweet que retorna un boolean sobre si se envio o no el tweet
boolean twt_snd_status = tweet_hlp.Send_Tweet(texto);
Luego en base a la respuesta mostramos un Toast y cambiamos la imagen mediante
tweet_imgstatus(1);
Luego esta el otro Boton LogOff que borra el contenido guardado en sharedpreferences.
Veamos rapidamente el webview TwitterWebActivity.java
Como veran no es nada del otro mundo recibe por parámetro URL y lo muestra. Luego retorna “oauth_verifier” como les comente mas arriba.
Ahora es el turno de la clase que he creado para facilitar el uso de twitter dentro del paquete com.cipolat.twitter_testapp.lib
TweetHelper.java
Lean los comentarios para cada caso:
Como veran el constructor recibe por parametro el context que es necesario para la clase Shar_Pref_Helper, tambien instanciamos esta clase y le pasamos como parametro el nombre con el que se almacenara el registro en el shared preferences y el contexto.
También al principio de la clase creamos unas variables que tomaran los datos de la clase Constants_Settings.
Luego en la linea 42 mpezamos a crear objeto para interactuar con twitter
twitter = new TwitterFactory().getInstance();
En la linea 46 le asignamos las claves para la autenticacion usando OAuth,estos estan en la clase mencionada previamente
twitter.setOAuthConsumer(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET);
Para poder enviar los tweets usamos la función Send_Tweet(String tweet_text) que recibe como parametro el text que queremos que envie, este retorna un valor booleano relacionado con el exito o no del emvio del tweet, esto es utilizado en la clase main para cambiar la imagen de estado.
Dentro Creamos el objeto configuracion necesario pasamos como parametros las claves consumer key and consumer Secret y los accessToken y accessTokensecret para la autenticacion OAuth estos son extraidos del shared preferences por lo que antes de ejecutar esto es necesario realizar para verificar su existencia como hicimos anteriormente
Configuration conf = new ConfigurationBuilder()
.setOAuthConsumerKey(OAUTH_CONSUMER_KEY)
.setOAuthConsumerSecret(OAUTH_CONSUMER_SECRET)
.setOAuthAccessToken(accessToken)
.setOAuthAccessTokenSecret(accessTokenSecret).build();
Usamos lo seteado anteriormente para obtener una instancia para autenticacion OAuth.
Creamos nuevamente objeto para acceder a twitter, (podria haberse utilizado el creado anteriormente) al cual le asigamos el objeto configuracion con las claves para la autenticacion con twitter.
Twitter t = new TwitterFactory(conf).getInstance();
//Actualizamos estado, enviamos el twwet.
t.updateStatus(tweet_text);
Esto esta dentro de un bloque try cath para determinar si se envio el tweet ya que puede surgir la excepcion TwitterException.
Luego esta clase tiene otras funciones como Store_OAuth_verifier(String OAuth) que recibe como parámetro oauthVerifier del cual hablamos antes.
con el parametro recibido retorna un AccessToken
AccessToken at=twitter.getOAuthAccessToken(mRequestToken, OAuth);
del usaremos los metodo getToken y getTokenSecret para grabar estos datos dentro del telefono ya que seran necesario para el envio del tweet como vimos antes.
shrpref.Write_String(TW_ACCTOKEN, at.getToken());
shrpref.Write_String(TW_ACCTOKEN_SECRET, at.getTokenSecret());
Luego otro metodo para comentar es verify_logindata() que retorna un valor booleano.
Basicamente accede al shared preferences y verifica si existen dentro del shared preferences los TW_ACCTOKEN_SECRET y TW_ACCTOKEN
(shrpref.isExist(TW_ACCTOKEN_SECRET en base al resultado devuelve el valor booleano.
Consideraciones al momento de enviar tweets:
Como comente anteriormente a la hora de enviar un tweet o interactuar con twitter puede surgir la excepcion TwitterException recomiendo leer el api sobre esto.
Deben tener en cuenta de que no pueden enviar un tweet en blanco y que no pueden enviar un mismo mensaje repetidas veces sin un tiempo de espera son las mismas consideraciones que tienen en cuenta cuando usan twitter.
Los errores que muestra son de este tipo:
10-01 01:10:10.493: W/System.err(1630): 403:The request is understood, but it has been refused. An accompanying error message will explain why. This code is used when requests are being denied due to update limits (https://support.twitter.com/articles/15364-about-twitter-limits-update-api-dm-and-following).
Aclaro que no soy un experto en el uso de twitter con android, por lo que si alguno tiene mas conocimientos y considera que algo esta incorrecto sientase libre de usar el cuadro de comentarios como tambien si tienen alguna otra consulta o pregunta.
Esto fue todo por hoy, espero que les halla gustado, hasta la proxima.!
Sebastian
¿Te gustó este tutorial? ¡Compártelo!
















