Androideity

Programación android en español, tutoriales, documentación, noticias, smartphones, tablets, programación android, aplicaciones android

Envio de Tweets desde tu aplicación usando la libreria Twitter4J y OAuth

| | 44 Comentarios

 

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).

 este era relacionado con el envió de un mismo mensaje uno seguidotras otro.
El mensaje incluye un codigo de error, el cual es el codigo devuelto por twitter, el listado de estos codigos de error se encuentra aqui.
Por ultimo les comento rapidamente la clase para manejar el acceso al shared preferences:
Esta clase debe recibir como parametro el nombre del registro en el shared preferences y el contexto.
Tiene una funcion llamada isExist(String val) la cual en base al parametro pasado retorna un valor booleano
referido a la existencia o no de una clave con ese nombre.
Tambien poseee las funciones Get_stringfrom_shprf(String val) la cual retorna un String con el conetenido del parametro val sacado del Shared Preferences.
Write_String(String clave, String valor) la cual escribe dentro del registro los valores que recibe.
Remove_Value(String clave) Borra el valor que le pasemos como parametro.
Bien esto fue todo antes de terminar comparto con ustedes un vídeo donde pueden ver en funcionamiento la aplicación.
Los invito a que accedan al repositorio (haciendo click en la imagen debajo) y prueben el codigo,
como veran no es muy complicado espero que les sea util.
Las siguientes paginas me  han servido como fuentes:

 

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!

 

Comparte este post

Acerca de: sebastiancipolat

Desarrolador web y de aplicaciones moviles, apasionado por la tecnologia y todo lo relacionado con ella, Fanatico de la Ciencia Ficcion y del software libre. De Buenos Aires, Argentina

Sígueme en Twitter

Leer todos mis artículos

También puede interesarte

Comentarios de este artículo

  • http://twitter.com/flowwerg FlorenciaGomez

    muy bueno, que buena idea! te felicito sr cipolat

    • http://twitter.com/seba_cipolat sebastian cipolat

      jaja gracias amiga! ;)

      • Jorge

        no corre la aplicacion en el emulador 2.2, no puede iniar la emulacion del opengIES, ayuda pls

        • http://sebastiancipolat.com.ar sebastiancipolat

          A mi si me funciono en 2.2
          saludos

  • Luz Peguero

    Saludos, tengo un problema con esta aplicacion. En la clase TwitterWebActivity, en el metodo shouldOverrideUrlLoading, cuando estoy buscando twitter_callback en “R.string.twitter_callback” no me aparecia. Entonces lo que hice fue crearla en el archivo strings.xml. pero no estoy segura de cual valor debo asignarle para crearla..

  • http://twitter.com/seba_cipolat sebastian cipolat

    Hola Luz,
    Es una buena observación al parecer se me había olvidado de modificar esa linea y decirle que tome el valor que esta en la clase Constants_Settings, en el archivo string.xm deberia de decir referido al twitter_ callback

    twitter-callback:///

    De todas formas si descargas el codigo del repositorio estaba el archivo string.xml lo podes ver aca->
    https://github.com/Androideity/Envio-de-Tweets-desde-tu-aplicaci-n-usando-la-libreria-Twitter4J-y-OAuth/blob/master/Twitter_testapp/res/values/strings.xml

    Ya modifique el codigo de la clase TwitterWebActivity en el repositorio
    lo podes ver aca.
    https://github.com/Androideity/Envio-de-Tweets-desde-tu-aplicaci-n-usando-la-libreria-Twitter4J-y-OAuth/blob/master/Twitter_testapp/src/com/cipolat/twitter_testapp/TwitterWebActivity.java

    Gracias por comentar.
    Saludos.

  • Jackie

    Hola, como puedo hacer para subir imagenes?
    gracias

  • Diego

    Hola yo he probado este ejemplo en android 2.2 y corre execelente, pero si lo corro en android 3.2 sale un error en la linea

    mRequestToken = twitter.getOAuthRequestToken(callbackURL);

    alguien sabe como solucionar este problema.
    Gracias de antemano.

    • http://twitter.com/seba_cipolat sebastian cipolat

      Hola,
      vaya que raro y que es lo que dice el error?

      • Diego

        Mira este es el error que me arroja cuando lo ejecuto en una tablet Samsung Galaxy Tab 7 Plus con android 3.2

        • http://twitter.com/seba_cipolat sebastian cipolat

          vaya que raro!

        • http://twitter.com/JaimeYesidLeon Jaime Leon

          Hola Diego,
          Este error te sale porque desde la version 3.1 de Android debes correr en un hilo diferente al principal todas la peticiones que tengan que ver con internet. Asi que debes crear un hilo aparte y hace esta peticion.

          Cordial saludo

          jaime

          • http://twitter.com/seba_cipolat sebastian cipolat

            Gracias Jaime por la aclaracion.!

  • Diego

    Hola amigo, tengo un problema con el API Facebook, mira yo ya tengo la aplicacion que publicaron, que esta corriendo correctamente, pero solo yo nomaz puedo publicar mensaje con esta aplicacion en mi facebook mas no con otras cuentas diferentes, xq cuando entro con otra cuenta diferente a la que he creado la aplicacion no me deja publicar, me sale mensaje de “Ha ocurrido un error, por favor intente de nuevo mas tarde”, como haria para poder publicar con cuentas diferentes.
    Se que esta duda no iria en este post, quisiera saber si sabes como solucionarlo.
    Gracias de antemano.

    • http://twitter.com/seba_cipolat sebastian cipolat

      Hola ,no tengo conocimiento sobre el API de facebook, no voy a poder ayudarte
      saludos.

  • Ela_Riel

    Hola, estoy probando las clases que hiciste, pero al momento de instanciar a TweetHelper me lanza una excepcion “could not find class twitter4J.TwitterFactory”… y tambien con twitter4J.conf.ConfigurationBuilder,… eso, me podrian ayudar?

    • Ela_Riel

      hola, estaba importando mal la libreria, era solo eso

      • http://twitter.com/seba_cipolat sebastian cipolat

        genial!

    • Jofrix

      Como lo solucionaste? esque me pasa lo mismo

      • http://twitter.com/seba_cipolat sebastian cipolat

        Hola,

        Importar la libreria es muy simple:

        En el eclipse al proyecto le das click derecho properties luego en

        Java Build Path tab Libraries -> Add External Jar y luego agregas el .jar que te bajastes “twitter4j-core-android-2.2.6.jar” con eso deberia funcionar.

        saludos.

        • Jofrix

          Haciendo esto, que es lo que hago siempre para importar librerias me sale el mismo error que le salia a Ela_Riel. “could not find class twitter4J.TwitterFactory”… y tambien con twitter4J.conf.ConfigurationBuilder. Si alguien sabe como solucionar-lo… Un Saludo!

  • http://www.adnfriki.com/ iRe – Aplicaciones Android

    Una vez más te pasaste jaja, qué grande! Mil graaaacias!

  • Asier

    Hola muy buen aporte, he intentado hacerlo yo mismo paso a paso pero me saltaban errores, de modo que baje tu codigo entero y lo ejecute. Y me salta el mismo error, utilizando tu propio codigo. Baje de twitter4J la version 3.0.3.

    Pues bien el error que me salta es el siguiente: si podeis ayudarme… GRACIAS

    • Asier

      Nada este problema ya lo he solucionado, ahora tengo este otro jeje.

      • http://twitter.com/seba_cipolat sebastian cipolat

        Hola, menciona algo sobre NullPointerException habria que ver en que parte de la ejecucion da ese error.
        te recomiendo que ejecutes la aplicacion en modo debug y veas si podes encontrar algo.
        saludos.

        • Asier

          Hola es en la clase tweethelper linea 81 get authenticationURL, en la foto se ve despues del caused by las 3 lineas donde da el error.

    • Asier

      Es como si no cogiera las claves de consumerkey y consumersecret, tarda igual en darse de alta? yo creo que he hecho bien el registro de la app, el nombre y la descripicion pones lo que quieras y en las url callback la he dejado vacia. Luego es darle a generar y ya…
      Luego ya en tu apk es solo ir a los settings y cambiar esas dos keys.

      No se es raro

  • http://twitter.com/nigarcia Nixon Garcia

    Estoy desarrollando una app pero cuando quiero compartirla en Twitter me da este error

    • http://twitter.com/seba_cipolat sebastian cipolat

      Hola,no te sabria decir menciona algo sobre NullPointerException habria que ver en que parte de la ejecucion da ese error.te recomiendo que ejecutes la aplicacion en modo debug y veas si podes encontrar algo.
      saludos.

  • edgar2701

    Buenas!! Quería saber que se coloca en este lugar del código

    en el “URL”

    i.putExtra(“URL”, tweet_hlp.get_AuthenticationURL());

    Si dejo “URL” se sale de la aplicación
    colocando cualquier otra cosa entra a la aplicación y abre el WebView en blanco…

    En el LogCat aparece lo siguiente:

    05-20 12:50:55.687: E/AndroidRuntime(5781): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { cmp=com.cipolat.twitter_testapp/.TwitterWebActivity (has extras) }} to activity {com.cipolat.twitter_testapp/com.cipolat.twitter_testapp.MainActivity}: java.lang.NullPointerException: println needs a message

    Por otra parte en el MainActivity me aparece que estos valores no son utilizados
    private TextView tweetTextView;
    private RequestToken mRequestToken = null;
    me falta alguna parte del código?

    por último en la clase Constants_Settings usando todos esos String sin static me quita las advertencias en las clases TweetHelper y TwitterWebActivity.
    Es correcto hacer esto??

    Espero puedan ayudarme y por adelantado doy las gracias.
    Saludos!!

    • edgar2701

      En la primera parte del Artículo reza lo siguiente:

      “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.”

      Le puse cualquier cosa y la aplicación funcionó… Anteriormente lo dejé en blanco…

      También recordar llenar los access token y acces token secret en la clase Constants_Settings: Esto lo proporciona dev.twitter.com/apps/ cuando registramos la app… También debe activar Sign in with Twitter..

      private TextView tweetTextView;
      private RequestToken mRequestToken = null;
      No son necesarios en el Main para correr la aplicación…

      El modificador static ciertamente crea advertencias en las clases TweetHelper y TwitterWebActivity. El mismo eclipse sugiere quitarlo..

      Nuevamente doy las gracias al escritor de este artículo, si se les ocurre hacer otro tutorial para leer TL, DM, y hacer búsqueda por #hashtag no estaría nada mal. Casi toda la documentación de esta librería viene en Inglés..

      Saludos cordiales!!

      • Roberto

        Buenas como conseguiste solucionar este problema por que a mi me sigue saliendo haga lo que haga.

      • http://sebastiancipolat.com.ar sebastiancipolat

        Hola, para callback se puede poner cualquier cosa pero la recomendacion es que no ya que tiene un uso especifico que en este momento no recuerdo pero para lo que hicimos aca no importa.
        tweetTextView, mRequestToken por mas que de advertencias yo recomiendo dejarlos, mucho no importa lo que diga el eclipse este no ide no es 100% orientado a android y a veces he observado que marca cosas que estan bien y este lo muestra como no o advertencia.
        me alegro q te halla gustado, gracias por el aporte.

        Saludos

  • José Ballesteros

    hola quisiera preguntarte si es posoble cambiar el nombre de la funcion onActivityResult por otro ya que en un proyecto que estoy realizando hay una funcioncon igual nombre, si es posible te agradeceria que me dijeras que clase es la que lo llama

    • http://sebastiancipolat.com.ar sebastiancipolat

      Hola, el onActivityResult no es una funcion que cree yo, estoy sobrecargando otra por eso tiene el override arriba, pueden haber varias con diferentes parametros, depende de lo q haga la otra se podrian unir las dos, si tenes dificultado con eso te recomiendo que le des un vistazo de nuevo a la documentacion de android.
      Saludos

  • sayuri

    hola amigos una duda cuando ejecuto esta app me marca un error “unfortunately , twitter_testapp has stoped” a que se debera eso, saludos

    • http://sebastiancipolat.com.ar sebastiancipolat

      Hola, No lo se.
      revisa el Logcat y debugea la app para encontrar en donde esta y por que da ese error.

      Saludos

  • Marco

    Disculpa, cuando lo corro desde la tablet, entro a la pagina e inicio con mis datos me devuelve un pin. Que hago con ese pin?

  • Vladimir

    hola, de casualidad sabe como cargar un perfil publico de twitter, una universidad en mi caso, para verlo en una app creada por mi?

    • http://sebastiancipolat.com.ar sebastiancipolat

      Hola, no entiendo a que te refieres con cargar un perfil publico?, mucho con esta libreria no use, solo lo que puse en el tutorial. revisa la documentacion de Twitter4J tal vez halla algo q te ayude.