SlideShare una empresa de Scribd logo
Workshop:

Integración de Social Media en
            Android
       Appcircus Academy
          Alberto Alonso Ruibal
       alberto.ruibal@mobialia.com
       T: @mobialia @albertoruibal
Quién soy
Ingeniero de Telecomunicación
                    System Manager
                    J2EE Developer
Desarrollador Android @ Mobialia
        Mobialia Chess, Internet Chess Club App
   Gasolineras España, Connect-4, Trivial, Slot Racing
              Martin Varsavsky's RadioMe
             Track my Followers for Twitter
Mi blog: http://www.alonsoruibal.com
Mi empresa: http://www.mobialia.com
Más recursos para aprender Android
Desarrollé la aplicación WikiPlaces como ejemplo para
LabAndroid Málaga. Esta aplicación contiene varios ejemplos
de cómo hacer muchas cosas comunes en Android
●   Pantalla inicial con un Dashboard
●   Crear pantallas de preferencias y obtener preferencias
●   Usar la API de Google Maps API (incluyendo overlays) y la
    Location API para obtener la ubicación
●   Usar servicios JSON externos
●   Listas y adapters
●   Lanzar aplicaciones externas con Intents
●   Integración con AdMob para mostrar anuncios
              http://www.mobialia.com/labandroid
¿Por qué integrar social media?

● Obtener datos de la red social
● Conseguir visibilidad en redes sociales


● Compartir datos de la aplicación


● Simplificar el login para los usuarios

  de tu aplicación
● Obtener datos adicionales del usuario
Aplicación de demostración




Todos los ejemplos de esta presentación
    están en una aplicación de código abierto:
http://www.mobialia.com/social_media_demo/
El botón de compartir
    ●   Muy fácil de implementar
    ●   Lanzamos un intent de tipo “ACTION_SEND” que va a
        ser recibido por las aplicaciones de social media

    public void onShareChoose(View v) {
   String shareText = ((EditText)
findViewById(R.id.EditText)).getText().toString();
        Intent intent = new Intent(android.content.Intent.ACTION_SEND);
        intent.setType("text/plain");
        intent.putExtra(android.content.Intent.EXTRA_TEXT, shareText);
   startActivity(Intent.createChooser(intent,
getResources().getText(R.string.share_choose)));
}
Intents en Android
Son un sistema en Android que podemos
  utilizar para lanzar actividades de la
  misma o de diferentes aplicaciones

Una actividad lanza un intent
   El intent puede incluir datos “extra”
             Otra actividad recibe el intent
Esto muesta el selector de actividad
Especificando el componente
Podemos lanzar una actividad específica
(en este ejemplo lanzamos la aplicación
oficial de Twitter):

PackageManager packageManager = context.getPackageManager();

List<ResolveInfo> activityList = packageManager.queryIntentActivities(intent, 0);

for (ResolveInfo act : activityList) {

 if (act.activityInfo.name.indexOf("com.twitter.") == 0) { // Check it if starts by...

  ComponentName name = new ComponentName(act.activityInfo.applicationInfo.packageName,
act.activityInfo.name);

  intent.setComponent(name);

  startActivity(intent);

...
Integración con Twitter

●   En este ejemplo mostraremos el timeline del
    usuario
●   Twitter utiliza autenticación OAUTH
●   La respuesta de la API de Twitter es JSON
●   Hay muchas opciones, yo prefiero signpost
    http://code.google.com/p/oauth-signpost/
Añadiendo signpost
Hay tres versiones de la librería:
●   java.net.HttpUrlConnection
●   Apache Commons HTTP (usamos esta)
●   Jetty HTTP Client
Para integrarla es necesario descargar:
●   signpost-core-1.2.1.1.jar
●   signpost-commonshttp4-1.2.1.1.jar
Y añadirlos al build path de Eclipse
Obteniendo una API Key de Twitter (I)
Registra tu aplicación en https://dev.twitter.com/apps
Obteniendo una API Key de Twitter (II)
Una vez registrado,puedes optener el “Consumer key” y
el “Consumer secret” e insertarlos en el código:




OAuthConsumer oauthConsumer = new CommonsHttpOAuthConsumer(
  // the consumer key of this app (replace this with yours)
  "RFbRzd0BzYGZjrDd02ec5g" ,
  // the consumer secret of this app (replace this with yours)
  "wo9lKhzwpEfdXS2Z3dO2W092W9pMoJGrc5kUsBdA");
Interceptando la URL de callback
Interceptamos la URL de callback
“socialmediademo://twitter” URL modificando el
AndroidManifest.xml:
<activity
android:name =".TwitterProviderActivity"
android:label ="@string/app_name">
<intent-filter>
 <action android:name="android.intent.action.VIEW"></action>
 <category android:name="android.intent.category.DEFAULT"></category>
 <category android:name="android.intent.category.BROWSABLE"></category>
 <data android:scheme="socialmediademo" android:host="twitter"></data>
</intent-filter>
</activity>
Autenticando al usuario
Ahora redirigimos al usuario a la URL de autenticación,
especificando una URL de callback:
public static String CALLBACK_URL = "socialmediademo://twitter";
//...
 String authUrl = oauthProvider.retrieveRequestToken(oauthConsumer,
CALLBACK_URL);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl));
// save token
accessToken     = oauthConsumer.getToken();
tokenSecret = oauthConsumer.getTokenSecret();
 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP |
Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_FROM_BACKGROUND |
Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Autenticación de Twitter



La página de Twitter se abre
en el navegador del sistema


Este ejemplo es de sólo
lectura (no se puede hacer
follow o enviar mensajes)
Verificando el login del usuario
Entonces, en la actividad que recibe el
callback (TwitterProviderActivity):

Uri uri = this.getIntent().getData();
String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
oauthConsumer.setTokenWithSecret(accessToken, tokenSecret);
oauthProvider.retrieveAccessToken(oauthConsumer, verifier);
// save new token
accessToken   = oauthConsumer.getToken();
tokenSecret = oauthConsumer.getTokenSecret();
Obteniendo los mensajes del timeline
Ahora podemos lanzar peticiones contra los
métodos de la API REST:

 String url =
"http://api.twitter.com/1/statuses/home_timeline.json?count=100";
HttpGet request = new HttpGet(url);
HttpClient httpClient = new DefaultHttpClient();
// sign the request
oauthConsumer.setTokenWithSecret(accessToken, tokenSecret);
oauthConsumer.sign(request);
HttpResponse response = httpClient.execute(request);
Interpretando la respuesta JSON
La API de Android integra un parser JSON

JSONArray array = new JSONArray(response);
for (int i = 0; i < array.length(); i++) {
    JSONObject user = object.getJSONObject("user");
    Update update = new Update();


update.setMessage(Html.fromHtml(object.getString("text")).toString()
);
    update.setUserId(user.getString("screen_name"));
    update.setUserName(user.getString("name"));
// ...
Finalmente mostramos el timeline

             En el código fuente
             también se puede
             encontrar:
              ●   Adapter de lista para
                  las actualizaciones de
                  estado
              ●   Cache de imágenes
Integración con LinkedIn

●   Muy similar a Twitter, también podemos usar
    libsignpost
●   API XML/JSON
●   Un pequeña diferencias: se necesita
    especificarle a signpost que LinkedIn utiliza
    OAUTH version 1.0a:
     oauthProvider.setOAuth10a(true);
Obteniendo una API Key de LinkedIn
https://www.linkedin.com/secure/developer
Autenticación de LinkedIn


          Funciona como la de Twitter,
          abriendo el navegador del
          sistema
          También tenemos una URL
          de Callback
Llamando a la API de LinkedIn
Por defecto en XML, debemos enviarle el
parámetro “&format=json”

String response =
httpRequest("http://api.linkedin.com/v1/people/~/network/updates?
count=100&format=json");
if (response != null) {
JSONObject object = new JSONObject(response);
//...
Resultado de LinkedIn


         Muestra las
         actualizaciones de estado
         de tus contactos de
         LinkedIn
Integrando Google+


●   Soporte OAuth 1.0a y 2.0 (experimental)
●   Podríamos usar google-api-java-client:
http://code.google.com/p/google-api-java-client/
●   En nuestro ejemplo utilizamos libsignpost con
    OAUTH 1.0a, también es necesario
    especificárselo explícitamente a libsignpost
Limitaciones de la API de Google+

●   Sólo lectura
●   No podemos acceder a los “Circles” del usuario
●   No se puede acceder al “Timeline”
Qué se puede hacer:
●   Obtener información de un usuario
●   Listar las “Actividades” de un usuario
●   Hacer búsquedas
Registrar un dominio para OAUTH 1
https://accounts.google.com/ManageDomains
Crear aplicación en Google API
               Console
         https://code.google.com/apis/console/




Registramos la
aplicación para obtener
una “API key”
Configurando OAUTH para Google+
●   Se crea el Consumer OAUTH con el dominio
oauthConsumer = new CommonsHttpOAuthConsumer("mobialia.com",
                                                "xxxxxxxxxxxxx");
●   Al crear el proveedor OAUTH le pasamos como parámetro
    una URL para el “scope”
String URL = "https://www.googleapis.com/auth/plus.me";


oauthProvider = new CommonsHttpOAuthProvider(
"https://www.google.com/accounts/OAuthGetRequestToken?scope=" +
      URLEncoder.encode(URL, "utf-8"),
"https://www.google.com/accounts/OAuthGetAccessToken",
"https://www.google.com/accounts/OAuthAuthorizeToken?hd=default");
Llamando a Google+
●   La autenticación funciona igual que la de
    Twitter
●   La key de la Google APIs console se le pasa
    en el momento de la llamada:
String response =
 httpRequest("https://www.googleapis.com/plus/v1/
people/me/activities/public?
key=AIzaSyBRloeHFF1G2_GafnnbhthvnYXljIi4oc4");
Resultado de Google+



         En nuestro ejemplo
         mostramos las
         “Actividades” del usuario
         que se ha autenticado en
         Google+
Utilizar el social media para login
No hace falta pedirle todos los datos al usuario
Yo recomiendo Facebook:
  ● Más usuarios


  ● Más datos de cada usuario


Podemos obtener datos adicionales del usuario:
  ● Género


  ● Edad


  ● ...
Integración con Facebook

●   Utiliza OAUTH 2.0, libsignpost no lo soporta
●   Necesitamos el SDK de Facebook de Github:
    https://github.com/facebook/facebook-android-sdk/
●   Configuramos el SDK de Facebook como un
    proyecto “Librería” y añadimos una
    dependencia a esa librería
●   Usamos la nueva Graph API
Obteniendo una API Key de
            Facebook (I)
https://www.facebook.com/developers/
Obteniendo una API Key de
               Facebook (II)
Aquí tenemos el identificador de la aplicación
Necesitamos especificarle un hash de la clave de nuestro
certificado: keytool -exportcert -alias androiddebugkey -keystore
~/.android/debug.keystore | openssl sha1 -binary | openssl base64
Preparando el objeto de Facebook
Y lanzando la autenticación de Facebook

final   int ACTIVITY_CODE = 777;
final String appId = "219172308103195";
final String[] PERMISSIONS = new String[] { "user_birthday" };


Facebook fb = new Facebook(appId);
fb.authorize(this, PERMISSIONS, ACTIVITY_CODE, this);
// (Callback not detailed)
Login con Facebook

       Abre una Actividad de
       Facebook solicitando los
       datos de autenticación
Obtener datos del usuario de
              Facebook
Una vez autenticados podemos lanzar peticiones,
“/me” obtiene la información del usuario

String res = fb.request("/me");
JSONObject object = new JSONObject(res);
Log.d(TAG, object.getString("id"));
Log.d(TAG, object.getString("name"));
Log.d(TAG, object.getString("gender"));
Log.d(TAG, object.getString("birthday"));
Mejorando los anuncios con los
          datos del usuario
●   Podemos especificarle a AdMob el sexo del
    usuario y su edad:

AdRequest adRequest = new AdRequest();
adRequest.setGender(Gender.FEMALE);
adRequest.setBirthday("19790129");
AdView adView = (AdView) this.findViewById(R.id.adView);
adView.loadAd(adRequest);
Resultado de Facebook
       La aplicación de demo
       muestra los datos del usuario
       El anuncio mostrado se
       puede con los datos del
       usuario
       Podemos utilizar los datos
       del usuario en varias partes
       de la application
       ¡Cuidado con la LOPD si los
       guardamos en un servidor
       nuestro!
Más ideas
● Se puede utilizar una WebView para
  integrar Social Media
● Botón para hacer “Follow” integrando

  la API de Twitter
● Botón “Like” para facebook: necesita

  crear una página en Facebook
● “Foursquare” API integration
Redes sociales para gaming
Redes sociales específicas para
compartir LeaderBoards,
Achievements...
● OpenFeint


● ScoreLoop
Preguntas...


Gracias por vuestra atención!


        Alberto Alonso Ruibal
     alberto.ruibal@mobialia.com
       http://www.mobialia.com
     T: @mobialia @albertoruibal

Más contenido relacionado

DOCX
Manual de aplicaciones moviles
Jael Vazquez
 
PDF
Android bootcamp 101 v2.0
Juan Manuel Baiutti
 
PDF
"Los Imprescindibles de .NetCore"
www.encamina.com
 
DOCX
Manual marichuy
Maria de Jesus Reyes Betancourt
 
PPT
Android Bootcamp - GTUG Uruguay
gtuguruguay
 
PPTX
Desarrollo de aplicaciones adroid
Jefferson Chipantiza
 
PDF
Mobile 2.0 Open Ideas WorkShop: Building Social Media Enabled Apps on Android
Alberto Ruibal
 
PPSX
Android
Ju Miranda Obando
 
Manual de aplicaciones moviles
Jael Vazquez
 
Android bootcamp 101 v2.0
Juan Manuel Baiutti
 
"Los Imprescindibles de .NetCore"
www.encamina.com
 
Android Bootcamp - GTUG Uruguay
gtuguruguay
 
Desarrollo de aplicaciones adroid
Jefferson Chipantiza
 
Mobile 2.0 Open Ideas WorkShop: Building Social Media Enabled Apps on Android
Alberto Ruibal
 

Similar a Appcircus Academy: Integración de Social Media en Android (20)

PDF
Servicios web
Cheli Hedz
 
PPTX
Curso Cloud Computing, Parte 2: Google App Engine
Diego López-de-Ipiña González-de-Artaza
 
PDF
LabAndroid: Taller "Mi Primera Aplicación Android"
Alberto Ruibal
 
PPT
Introduccion a Android
Paradigma Digital
 
ODP
Servicios web con Python
Manuel Pérez
 
PDF
Congreso visión 2012 - taller introducción app engine
Nigeŗ Arce
 
PDF
Web 2.0 ajax con SharePoint
goreorti
 
PPT
Desarrollo android - 4 - arquitectura de aplicación
Emilio Aviles Avila
 
PPTX
Gadget review
Jesus Vera
 
PPTX
Gadget review
Roberto Perales
 
PDF
Google cloud endpoints
GDG Lima
 
PPTX
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptx
Luis775803
 
DOCX
Manual de aplicaciones moviles
Jael Vazquez
 
PPTX
Prepara tus apps de SharePoint y Office 365 para el futuro
Miguel Tabera
 
DOCX
Manual de aplicaciones moviles
Jael Vazquez
 
DOCX
Manual de aplicaciones moviles
Jael Vazquez
 
PPT
Google apps engine
Blanca Rodríguez
 
DOCX
Manual marichuy
Maria de Jesus Reyes Betancourt
 
DOCX
Manual marichuy
Maria de Jesus Reyes Betancourt
 
PDF
Creando mi primer bot application en Visual Studio 2017
Vicente Gerardo Guzman Lucio
 
Servicios web
Cheli Hedz
 
Curso Cloud Computing, Parte 2: Google App Engine
Diego López-de-Ipiña González-de-Artaza
 
LabAndroid: Taller "Mi Primera Aplicación Android"
Alberto Ruibal
 
Introduccion a Android
Paradigma Digital
 
Servicios web con Python
Manuel Pérez
 
Congreso visión 2012 - taller introducción app engine
Nigeŗ Arce
 
Web 2.0 ajax con SharePoint
goreorti
 
Desarrollo android - 4 - arquitectura de aplicación
Emilio Aviles Avila
 
Gadget review
Jesus Vera
 
Gadget review
Roberto Perales
 
Google cloud endpoints
GDG Lima
 
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptx
Luis775803
 
Manual de aplicaciones moviles
Jael Vazquez
 
Prepara tus apps de SharePoint y Office 365 para el futuro
Miguel Tabera
 
Manual de aplicaciones moviles
Jael Vazquez
 
Manual de aplicaciones moviles
Jael Vazquez
 
Google apps engine
Blanca Rodríguez
 
Creando mi primer bot application en Visual Studio 2017
Vicente Gerardo Guzman Lucio
 
Publicidad

Último (20)

PDF
MANUAL APA - I SEMESTRE - SOCIOLOGÍA UNCP
AnjallJennifer
 
DOCX
Tabla de frecuencia - grado 11-1 2025.docx
spinedaf07
 
DOCX
INFORME AGRO I ciclo (2).docx Madeley Santoyo
madeleysantoyo
 
PDF
Metodologia de la Investigacion Cientifica UAI Ccesa007.pdf
Demetrio Ccesa Rayme
 
PDF
La Disciplina marcara tu Destino - Ryan Holiday Ccesa007.pdf
Demetrio Ccesa Rayme
 
PDF
La Investigacion Educativa CLACSO Ccesa007.pdf
Demetrio Ccesa Rayme
 
PDF
El Docente de Educacion Virtual NARCEA Ccesa007.pdf
Demetrio Ccesa Rayme
 
PDF
Paradigma@Investigadores Siglo XXI Revista N° 8
Equipo de investigadores comunitarios de Innovación Tecnológica (EDICIIT)
 
PPTX
LA EDUCACIÓN EN PANAMÁ DÉCADA DEL 2000 AL 20100
fernandayanguez8
 
PDF
TRABAJO_FINAL_INFORME_DOCUMENTAL (2).pdf
ingrid2426ar
 
PDF
Nunca tires la Toalla - Donald Trump Ccesa007.pdf
Demetrio Ccesa Rayme
 
PDF
La Tecnologia Educativa para la Sociedad Digital Ccesa007.pdf
Demetrio Ccesa Rayme
 
PDF
Inteligencia Artificial en la Educacion AV3 Ccesa007.pdf
Demetrio Ccesa Rayme
 
PDF
A.- PLANEACIÓN_Competencias Globales_LM.pdf
MarcoAntonioGuzmanPo
 
PDF
Cumpleaños SENA Regional Atlántico mes de agosto de 2025
comunicacionessenaat
 
DOCX
INFORME AGRO.MADELEY_primer ciclo agropecuaria
madeleysantoyo
 
PDF
Diversidades Intelectuales y Trastorno Espectro Autista Ccesa007.pdf
Demetrio Ccesa Rayme
 
PDF
El Poder de la Disciplina DM3 Ccesa007.pdf
Demetrio Ccesa Rayme
 
PDF
Superacion Personal Se Tu Mismo SB3 Ccesa007.pdf
Demetrio Ccesa Rayme
 
PDF
Metodología de la Investigación Cientifica - Hernández Sampieri Ccesa007.pdf
Demetrio Ccesa Rayme
 
MANUAL APA - I SEMESTRE - SOCIOLOGÍA UNCP
AnjallJennifer
 
Tabla de frecuencia - grado 11-1 2025.docx
spinedaf07
 
INFORME AGRO I ciclo (2).docx Madeley Santoyo
madeleysantoyo
 
Metodologia de la Investigacion Cientifica UAI Ccesa007.pdf
Demetrio Ccesa Rayme
 
La Disciplina marcara tu Destino - Ryan Holiday Ccesa007.pdf
Demetrio Ccesa Rayme
 
La Investigacion Educativa CLACSO Ccesa007.pdf
Demetrio Ccesa Rayme
 
El Docente de Educacion Virtual NARCEA Ccesa007.pdf
Demetrio Ccesa Rayme
 
Paradigma@Investigadores Siglo XXI Revista N° 8
Equipo de investigadores comunitarios de Innovación Tecnológica (EDICIIT)
 
LA EDUCACIÓN EN PANAMÁ DÉCADA DEL 2000 AL 20100
fernandayanguez8
 
TRABAJO_FINAL_INFORME_DOCUMENTAL (2).pdf
ingrid2426ar
 
Nunca tires la Toalla - Donald Trump Ccesa007.pdf
Demetrio Ccesa Rayme
 
La Tecnologia Educativa para la Sociedad Digital Ccesa007.pdf
Demetrio Ccesa Rayme
 
Inteligencia Artificial en la Educacion AV3 Ccesa007.pdf
Demetrio Ccesa Rayme
 
A.- PLANEACIÓN_Competencias Globales_LM.pdf
MarcoAntonioGuzmanPo
 
Cumpleaños SENA Regional Atlántico mes de agosto de 2025
comunicacionessenaat
 
INFORME AGRO.MADELEY_primer ciclo agropecuaria
madeleysantoyo
 
Diversidades Intelectuales y Trastorno Espectro Autista Ccesa007.pdf
Demetrio Ccesa Rayme
 
El Poder de la Disciplina DM3 Ccesa007.pdf
Demetrio Ccesa Rayme
 
Superacion Personal Se Tu Mismo SB3 Ccesa007.pdf
Demetrio Ccesa Rayme
 
Metodología de la Investigación Cientifica - Hernández Sampieri Ccesa007.pdf
Demetrio Ccesa Rayme
 
Publicidad

Appcircus Academy: Integración de Social Media en Android

  • 1. Workshop: Integración de Social Media en Android Appcircus Academy Alberto Alonso Ruibal [email protected] T: @mobialia @albertoruibal
  • 2. Quién soy Ingeniero de Telecomunicación System Manager J2EE Developer Desarrollador Android @ Mobialia Mobialia Chess, Internet Chess Club App Gasolineras España, Connect-4, Trivial, Slot Racing Martin Varsavsky's RadioMe Track my Followers for Twitter Mi blog: http://www.alonsoruibal.com Mi empresa: http://www.mobialia.com
  • 3. Más recursos para aprender Android Desarrollé la aplicación WikiPlaces como ejemplo para LabAndroid Málaga. Esta aplicación contiene varios ejemplos de cómo hacer muchas cosas comunes en Android ● Pantalla inicial con un Dashboard ● Crear pantallas de preferencias y obtener preferencias ● Usar la API de Google Maps API (incluyendo overlays) y la Location API para obtener la ubicación ● Usar servicios JSON externos ● Listas y adapters ● Lanzar aplicaciones externas con Intents ● Integración con AdMob para mostrar anuncios http://www.mobialia.com/labandroid
  • 4. ¿Por qué integrar social media? ● Obtener datos de la red social ● Conseguir visibilidad en redes sociales ● Compartir datos de la aplicación ● Simplificar el login para los usuarios de tu aplicación ● Obtener datos adicionales del usuario
  • 5. Aplicación de demostración Todos los ejemplos de esta presentación están en una aplicación de código abierto: http://www.mobialia.com/social_media_demo/
  • 6. El botón de compartir ● Muy fácil de implementar ● Lanzamos un intent de tipo “ACTION_SEND” que va a ser recibido por las aplicaciones de social media public void onShareChoose(View v) { String shareText = ((EditText) findViewById(R.id.EditText)).getText().toString(); Intent intent = new Intent(android.content.Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(android.content.Intent.EXTRA_TEXT, shareText); startActivity(Intent.createChooser(intent, getResources().getText(R.string.share_choose))); }
  • 7. Intents en Android Son un sistema en Android que podemos utilizar para lanzar actividades de la misma o de diferentes aplicaciones Una actividad lanza un intent El intent puede incluir datos “extra” Otra actividad recibe el intent
  • 8. Esto muesta el selector de actividad
  • 9. Especificando el componente Podemos lanzar una actividad específica (en este ejemplo lanzamos la aplicación oficial de Twitter): PackageManager packageManager = context.getPackageManager(); List<ResolveInfo> activityList = packageManager.queryIntentActivities(intent, 0); for (ResolveInfo act : activityList) { if (act.activityInfo.name.indexOf("com.twitter.") == 0) { // Check it if starts by... ComponentName name = new ComponentName(act.activityInfo.applicationInfo.packageName, act.activityInfo.name); intent.setComponent(name); startActivity(intent); ...
  • 10. Integración con Twitter ● En este ejemplo mostraremos el timeline del usuario ● Twitter utiliza autenticación OAUTH ● La respuesta de la API de Twitter es JSON ● Hay muchas opciones, yo prefiero signpost http://code.google.com/p/oauth-signpost/
  • 11. Añadiendo signpost Hay tres versiones de la librería: ● java.net.HttpUrlConnection ● Apache Commons HTTP (usamos esta) ● Jetty HTTP Client Para integrarla es necesario descargar: ● signpost-core-1.2.1.1.jar ● signpost-commonshttp4-1.2.1.1.jar Y añadirlos al build path de Eclipse
  • 12. Obteniendo una API Key de Twitter (I) Registra tu aplicación en https://dev.twitter.com/apps
  • 13. Obteniendo una API Key de Twitter (II) Una vez registrado,puedes optener el “Consumer key” y el “Consumer secret” e insertarlos en el código: OAuthConsumer oauthConsumer = new CommonsHttpOAuthConsumer( // the consumer key of this app (replace this with yours) "RFbRzd0BzYGZjrDd02ec5g" , // the consumer secret of this app (replace this with yours) "wo9lKhzwpEfdXS2Z3dO2W092W9pMoJGrc5kUsBdA");
  • 14. Interceptando la URL de callback Interceptamos la URL de callback “socialmediademo://twitter” URL modificando el AndroidManifest.xml: <activity android:name =".TwitterProviderActivity" android:label ="@string/app_name"> <intent-filter> <action android:name="android.intent.action.VIEW"></action> <category android:name="android.intent.category.DEFAULT"></category> <category android:name="android.intent.category.BROWSABLE"></category> <data android:scheme="socialmediademo" android:host="twitter"></data> </intent-filter> </activity>
  • 15. Autenticando al usuario Ahora redirigimos al usuario a la URL de autenticación, especificando una URL de callback: public static String CALLBACK_URL = "socialmediademo://twitter"; //... String authUrl = oauthProvider.retrieveRequestToken(oauthConsumer, CALLBACK_URL); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)); // save token accessToken = oauthConsumer.getToken(); tokenSecret = oauthConsumer.getTokenSecret(); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_FROM_BACKGROUND | Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent);
  • 16. Autenticación de Twitter La página de Twitter se abre en el navegador del sistema Este ejemplo es de sólo lectura (no se puede hacer follow o enviar mensajes)
  • 17. Verificando el login del usuario Entonces, en la actividad que recibe el callback (TwitterProviderActivity): Uri uri = this.getIntent().getData(); String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER); oauthConsumer.setTokenWithSecret(accessToken, tokenSecret); oauthProvider.retrieveAccessToken(oauthConsumer, verifier); // save new token accessToken = oauthConsumer.getToken(); tokenSecret = oauthConsumer.getTokenSecret();
  • 18. Obteniendo los mensajes del timeline Ahora podemos lanzar peticiones contra los métodos de la API REST: String url = "http://api.twitter.com/1/statuses/home_timeline.json?count=100"; HttpGet request = new HttpGet(url); HttpClient httpClient = new DefaultHttpClient(); // sign the request oauthConsumer.setTokenWithSecret(accessToken, tokenSecret); oauthConsumer.sign(request); HttpResponse response = httpClient.execute(request);
  • 19. Interpretando la respuesta JSON La API de Android integra un parser JSON JSONArray array = new JSONArray(response); for (int i = 0; i < array.length(); i++) { JSONObject user = object.getJSONObject("user"); Update update = new Update(); update.setMessage(Html.fromHtml(object.getString("text")).toString() ); update.setUserId(user.getString("screen_name")); update.setUserName(user.getString("name")); // ...
  • 20. Finalmente mostramos el timeline En el código fuente también se puede encontrar: ● Adapter de lista para las actualizaciones de estado ● Cache de imágenes
  • 21. Integración con LinkedIn ● Muy similar a Twitter, también podemos usar libsignpost ● API XML/JSON ● Un pequeña diferencias: se necesita especificarle a signpost que LinkedIn utiliza OAUTH version 1.0a: oauthProvider.setOAuth10a(true);
  • 22. Obteniendo una API Key de LinkedIn https://www.linkedin.com/secure/developer
  • 23. Autenticación de LinkedIn Funciona como la de Twitter, abriendo el navegador del sistema También tenemos una URL de Callback
  • 24. Llamando a la API de LinkedIn Por defecto en XML, debemos enviarle el parámetro “&format=json” String response = httpRequest("http://api.linkedin.com/v1/people/~/network/updates? count=100&format=json"); if (response != null) { JSONObject object = new JSONObject(response); //...
  • 25. Resultado de LinkedIn Muestra las actualizaciones de estado de tus contactos de LinkedIn
  • 26. Integrando Google+ ● Soporte OAuth 1.0a y 2.0 (experimental) ● Podríamos usar google-api-java-client: http://code.google.com/p/google-api-java-client/ ● En nuestro ejemplo utilizamos libsignpost con OAUTH 1.0a, también es necesario especificárselo explícitamente a libsignpost
  • 27. Limitaciones de la API de Google+ ● Sólo lectura ● No podemos acceder a los “Circles” del usuario ● No se puede acceder al “Timeline” Qué se puede hacer: ● Obtener información de un usuario ● Listar las “Actividades” de un usuario ● Hacer búsquedas
  • 28. Registrar un dominio para OAUTH 1 https://accounts.google.com/ManageDomains
  • 29. Crear aplicación en Google API Console https://code.google.com/apis/console/ Registramos la aplicación para obtener una “API key”
  • 30. Configurando OAUTH para Google+ ● Se crea el Consumer OAUTH con el dominio oauthConsumer = new CommonsHttpOAuthConsumer("mobialia.com", "xxxxxxxxxxxxx"); ● Al crear el proveedor OAUTH le pasamos como parámetro una URL para el “scope” String URL = "https://www.googleapis.com/auth/plus.me"; oauthProvider = new CommonsHttpOAuthProvider( "https://www.google.com/accounts/OAuthGetRequestToken?scope=" + URLEncoder.encode(URL, "utf-8"), "https://www.google.com/accounts/OAuthGetAccessToken", "https://www.google.com/accounts/OAuthAuthorizeToken?hd=default");
  • 31. Llamando a Google+ ● La autenticación funciona igual que la de Twitter ● La key de la Google APIs console se le pasa en el momento de la llamada: String response = httpRequest("https://www.googleapis.com/plus/v1/ people/me/activities/public? key=AIzaSyBRloeHFF1G2_GafnnbhthvnYXljIi4oc4");
  • 32. Resultado de Google+ En nuestro ejemplo mostramos las “Actividades” del usuario que se ha autenticado en Google+
  • 33. Utilizar el social media para login No hace falta pedirle todos los datos al usuario Yo recomiendo Facebook: ● Más usuarios ● Más datos de cada usuario Podemos obtener datos adicionales del usuario: ● Género ● Edad ● ...
  • 34. Integración con Facebook ● Utiliza OAUTH 2.0, libsignpost no lo soporta ● Necesitamos el SDK de Facebook de Github: https://github.com/facebook/facebook-android-sdk/ ● Configuramos el SDK de Facebook como un proyecto “Librería” y añadimos una dependencia a esa librería ● Usamos la nueva Graph API
  • 35. Obteniendo una API Key de Facebook (I) https://www.facebook.com/developers/
  • 36. Obteniendo una API Key de Facebook (II) Aquí tenemos el identificador de la aplicación Necesitamos especificarle un hash de la clave de nuestro certificado: keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
  • 37. Preparando el objeto de Facebook Y lanzando la autenticación de Facebook final int ACTIVITY_CODE = 777; final String appId = "219172308103195"; final String[] PERMISSIONS = new String[] { "user_birthday" }; Facebook fb = new Facebook(appId); fb.authorize(this, PERMISSIONS, ACTIVITY_CODE, this); // (Callback not detailed)
  • 38. Login con Facebook Abre una Actividad de Facebook solicitando los datos de autenticación
  • 39. Obtener datos del usuario de Facebook Una vez autenticados podemos lanzar peticiones, “/me” obtiene la información del usuario String res = fb.request("/me"); JSONObject object = new JSONObject(res); Log.d(TAG, object.getString("id")); Log.d(TAG, object.getString("name")); Log.d(TAG, object.getString("gender")); Log.d(TAG, object.getString("birthday"));
  • 40. Mejorando los anuncios con los datos del usuario ● Podemos especificarle a AdMob el sexo del usuario y su edad: AdRequest adRequest = new AdRequest(); adRequest.setGender(Gender.FEMALE); adRequest.setBirthday("19790129"); AdView adView = (AdView) this.findViewById(R.id.adView); adView.loadAd(adRequest);
  • 41. Resultado de Facebook La aplicación de demo muestra los datos del usuario El anuncio mostrado se puede con los datos del usuario Podemos utilizar los datos del usuario en varias partes de la application ¡Cuidado con la LOPD si los guardamos en un servidor nuestro!
  • 42. Más ideas ● Se puede utilizar una WebView para integrar Social Media ● Botón para hacer “Follow” integrando la API de Twitter ● Botón “Like” para facebook: necesita crear una página en Facebook ● “Foursquare” API integration
  • 43. Redes sociales para gaming Redes sociales específicas para compartir LeaderBoards, Achievements... ● OpenFeint ● ScoreLoop
  • 44. Preguntas... Gracias por vuestra atención! Alberto Alonso Ruibal [email protected] http://www.mobialia.com T: @mobialia @albertoruibal