epespad

(Tutorial) Programando aplicaciones usando API de Facebook

Vuelvo a subir el post perdido al borrar la categoría Ebooks y tutoriales. Dado que no tenía el borrador guardado volvía a armarlo usando el cache de google.

Éste artículo es una traducción de éste artículo que pueden encontrar en la sección Developer de Facebook.

Para éste tutorial se supone que conocen qué es Java, qué es Android, conocen el API de Facebook, han usado Eclipse.

Registrar una nueva aplicación de Facebook
Antes de comenzar propiamente con Android voy a tratar de explicar cómo registrar la aplicación de Facebook.
Básicamente, Developer es una aplicación más de Facebook, la que nos brindará un API Key con el que se realizarán las peticiones al servidor. Por ello, debemos acceder a Developer y otorgarle permisos básicos, como toda aplicación.
Seleccionamos "Crea una" aplicación y acto seguido va a saltar con que debemos validar nuestra cuenta usando el móvil o tarjeta de crédito.
Sugerencia personal, usen la tarjeta si tienen. El tema es que el mensaje nunca me llegó y no podía entrar a validar la tarjeta; acabo de descubrir cómo hacer ésto último: ingresar a configuración de la cuenta, y una pestaña es Pagos. Allí se agrega la tarjeta.
Ahora volvemos a la página de Developer y ponemos nuevamente crear una aplicación. Ingresamos el nombre, el captcha y listo, aplicación creada.
En la página actual van a encontrar el "ID de la aplicación". Más tarde lo vamos a usar.
Acto seguido ir a Editar Aplicación, ingresar a la pestaña Móvil y dispositivos y allí seleccionar Aplicación nativa. Más abajo deben ingresar la Clave de Hash. Más tarde trataré ése tema. Básicamente es una firma de la aplicación.
Modifiquen las demás cosas (url, descripción, etc) y listo.

Vamos con Android ahora.

Como vamos a programar en Android, necesitamos tener instalado el SDK y el Eclipse (bueno, ésto último no es necesario, se puede programar para Android sin Eclipse, pero, para qué renegar?). Si no lo tienes detente aquí y visita éste post donde se explica Cómo empezar a programar en Android.

Configurando el Facebook SDK for Android
Pueden instalar Git. Es un programa para versionado de archivos. No lo he usado nunca, si conozco SVN. Supongo que debe tener las mismas funcionalidades. De ser así, sería útil para actualizar lo que descargaremos a continuación sin tener que ingresar a la página, bajar la última versión disponible y verificar si hay algún cambio (el SDK de Facebook para Android tiene correcciones y agregados eventuales).
Supongamos que lo instalaron. Abren una ventana de comandos (inicio, ejecutar, cmd), se posicionan en la carpeta donde instalaron Git, entran a bin y allí pegan el siguiente comando:
git clone git://github.com/facebook/facebook-android-sdk.git
éso lo que hace es bajar del repositorio a nuestro disco el sdk.
Seguimos con la otra posibilidad, suponiendo que no lo instalaron. Entran a ésta página Facebook SDK for Android y allí descargan la última versión disponible.

Qué se descargó?
examples son ejemplos como lo dice el nombre :-). Uno básico, iniciar sesión, realizar algunas llamadas a la API y mostrar un diálogo. El otro tiene la posibilidad de ver las últimas novedades.
facebook es un proyecto de Eclipse. Se usa a continuación.
tests es para generar aplicaciones de testeo.
En la raíz de la carpeta veremos facebook.apk. Es una versión de Facebook para instalar en el emulador, dado que no vamos a poder bajarla desde el Market. Es útil tener la aplicación dado que hay una manera de iniciar sesión usando la cuenta configurada en dicha aplicación en vez de que nuestra aplicación pida los datos para conectarse (aunque si usan Windows para programar probablemente vayan a tener problemas dado que al generar la firma que nombré anteriormente desde Windows no se genera correctamente). Para instalar la aplicación, desde la línea de comandos teniendo el emulador abierto:
adb install ~/facebook-android-sdk/Facebook.apk

Terminada la instalación.

Creando el proyecto en Eclipse
Comenzamos. Para usar desde nuestra aplicación el API de Facebook debemos crear un proyecto nuevo de Android en Eclipse usando código existente, que encontraremos en el directorio facebook de la carpeta que acabamos de descargar. Seleccionamos el target destino (versión de Android para la que programaremos).
(al fin una imagen, se está poniendo aburrido)
(Tutorial) Programando aplicaciones usando API de Facebook

Ahora sí creamos otro proyecto de Android que será nuestra aplicación. Pero como dije antes, debemos decirle al Eclipse que nuestro proyecto requiere a otro como referencia. Vamos a propiedades del proyecto, Android y allí seleccionamos el proyecto de Facebook.
Facebook
Como nuestra aplicación va a usar Facebook, necesitamos internet desde la aplicación. Pedimos permiso:
<uses-permission android:name="android.permission.INTERNET"> 
</uses-permission>


Generamos el hash que ingresaremos luego en la aplicación en Facebook:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/myKey.keystore  
| openssl sha1 -binary 
| openssl base64


keytool es una herramienta del jdk de java. Les va a pedir algunos datos: nombre, organización, fecha de caducidad de la llave, crear una contraseña para la firma (la van a usar al exportar la aplicación firmada en el Eclipse) y no recuerdo si algo más.
Éstas 2 palabras (androiddebugkey y myKey) no necesariamente tienen que ser esas 2.
Pegamos el resultado en el Facebook:
api

Aquí ingresamos el API Key que obtuvimos al registrar la aplicación:
Facebook facebook = new Facebook("YOUR_APP_ID");

A través de éste objeto tipo Facebook realizaremos las peticiones.

SingleSignOn (SSO)
Ésto es lo que le decía que se puede hacer al tener instalada la aplicación de Facebook en el teléfono.
Vean el código en la página en inglés.
En ésta línea se origina la validación del usuario., pidiendo permisos extras.
facebook.authorize(this, new String[] { "email", "read_stream" }, new DialogListener() {
...


Si no se necesitan permisos extras, se puede remover el parámetro completo (mientras menos permisos pida la aplicación más confiable es, muchos no instalan una aplicación si pide un montón de permisos, lo mismo ocurre con los de Android). Por defecto siempre se otorga el permiso de datos básicos.
[/code]facebook.authorize(this, new DialogListener() {
...[/code]

There is a strong inverse correlation between the number of permissions your app requests and the number of users that will allow those permissions. The greater the number of permissions you ask for, the lower the number of users that will grant them; so we recommend that you only request the permissions you absolutely need for your app.


Para consultar una lista completa de permisos, ingresar a permissions reference.

Interactuando con el Graph API
Por ejemplo con el siguiente código se obtienen los amigos del usuario logueado:
// get information about the currently logged in user
facebook.request("me&quot;
//get the logged-in user's friends
facebook.request("me/friends&quot;

Para conocer más métodos de la API consultar Graph API y Legacy REST API.

Dado que los métodos se conectan a internet y esperan la respuesta (llamado sincrónico), el programa se bloquea. Es recomendable por ello crear un hilo que ejecute el llamado y no se bloquee la interfaz. Para ello se provee la clase AsyncFacebookRunner.
Por ejemplo para realizar una petición usando FQL

            Bundle parameters = new Bundle(); 
            String fql = "..."; 
            parameters.putString("method", "fql.query"); 
            parameters.putString("query", fql); 
            parameters.putString("callback", ""); 
        this.mAsyncRunner.request(parameters, new requestListener()); 

class requestListener implements RequestListener{ 
public void onComplete(String response, Object state) { 
JSONObject json = new JSONObject(response); 
JSONArray d = json.getJSONArray("data"); 
for (int i=0; i<l; i++) { 
                    JSONObject o = d.getJSONObject(i); 
                    String b = o.getString("birthday_date"); 






        instancia.runOnUiThread(new Runnable() { 
            public void run() { 
//actualizar elementos de la interfaz de la actividad 
//ésto debe realizarse en el mismo hilo de la actividad sino lanza una excepción
            } 
        }); 

}


Evitando el SSO
Como les había comentado previamente existe un problema con la generación del hash si lo haces desde Windows. Investigando en internet parece que es cierto. Como había dicho, la key es usada para firmar la aplicación (es una política de Android), garantizando que la aplicación que está instalada en el teléfono, si tiene la firma de la empresa que la generó, está tal cual la liberó la empresa (todo ésto es porque como Android se basa en Java, el código puede decompilarse, pero no firmarse con la misma key dado que necesitan la clave secreta que se generó con keytool).
Si usan el SSO, al momento del login en el teléfono les va a tirar un error (invalid_key).
Entonces la solución al problema es evitar usar la credencial de la aplicación de Facebook y obligar al login desde nuestra aplicación (llamar al diálogo de Facebook realmente, la aplicación nunca puede acceder a la clave del usuario).
Ésto se logra agregando un parámetro al llamar al método authorize: Facebook.FORCE_DIALOG_AUTH
mFacebook.authorize(a, BirthFb.PERMISSIONS, Facebook.FORCE_DIALOG_AUTH, new LoginListener());

Siguiendo con la línea anterior, en la clase LoginListener se llamará al método onComplete(Bundle values) cuando se autentifique correctamente al usuario.

Bueno, creo que no me olvidé nada como para empezar. Voy a revisar los códigos que tengo a ver si hay algo para agregar.
Cualquier duda/sugerencia es bienvenida.

Si les interesa los invito a unirse a una comunidad que creé sobre programación para android: Programadores Android

4 comentarios - (Tutorial) Programando aplicaciones usando API de Facebook

solano_0_
quiero poner todos los permisos en uno, como puedo hacer eso, por ejemplo en mi app primero pide permisos para obtener correo e infrmacion basica, luego vuelve a cargar y pide permisos para punliar en el muro!! se puede hacer todo en uno???
yain
oye quiero mostrar los estadosde mis amigo enun textbox como lo hago