Uso de la API Graph: Android

El SDK para Android permite la integración con la API Graph de Facebook. Con las clases GraphRequest y GraphResponse, puedes realizar solicitudes y obtener respuestas en JSON de forma asincrónica. También puedes realizar solicitudes por lotes en un solo recorrido de ida y vuelta a los servidores de Facebook con GraphRequestBatch.

Obtén más información sobre la API Graph en:

Consulta también la referencia de GraphRequest, GraphResponse y GraphRequestBatch para obtener información sobre cómo utilizar el SDK de Facebook para Android y cómo realizar llamadas a la API Graph en más casos de uso.

Requisitos previos

Antes de empezar, configura lo siguiente:

Clase GraphRequest

La clase GraphRequest tiene un método newMeRequest que llama al extremo /user/me para recuperar los datos de usuario del identificador de acceso correspondiente.

El SDK para Android envía los permisos que tiene tu aplicación en el access_token para controlar el acceso a los datos. Si tu aplicación no dispone de ningún identificador de acceso, la API Graph solo devuelve información disponible al público en general. Para obtener información detallada sobre las propiedades y los permisos de User, consulta User en la referencia de la API Graph.

De forma predeterminada, un método newMeRequest recupera campos predeterminados de un objeto de usuario. Si necesitas más campos o quieres reducir la carga útil para que no se vea afectado el rendimiento, puedes añadir un parámetro fields y solicitar campos concretos:

GraphRequest request = GraphRequest.newMeRequest(
        accessToken,
        new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(
                   JSONObject object,
                   GraphResponse response) {
                // Application code
            }
        });
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link");
request.setParameters(parameters);
request.executeAsync();

En el método de devolución de llamada, los datos de la respuesta se deserializan en un objeto JSONObject si la solicitud se realiza correctamente. Los campos que no se pueden recuperar debido a la falta de permisos se omitirán en el resultado.

Para el usuario con la sesión iniciada, el SDK tiene las clases Profile y ProfileTracker. Para obtener más información, consulta Inicio de sesión con Facebook para Android.

Recuperar datos de usuario

Los datos a los que tengas acceso dependerán de los permisos que le concedan a tu aplicación y de los datos que se hayan compartido con aplicaciones. A continuación incluimos un ejemplo de respuesta sin procesar de la API Graph para user_location y user_birthday:

{
  "id": "12345678", 
  "birthday": "1/1/1950", 
  "first_name": "Chris", 
  "gender": "male", 
  "last_name": "Colm", 
  "link": "http://www.facebook.com/12345678", 
  "location": {
    "id": "110843418940484", 
    "name": "Seattle, Washington"
  }, 
  "locale": "en_US", 
  "name": "Chris Colm", 
  "timezone": -8, 
  "updated_time": "2010-01-01T16:40:43+0000", 
  "verified": true
}

Gestionar resultados

En función del extremo al que llames, recibirás un JSONObject o JSONArray.

Las llamadas de objeto único como newMeRequest devuelven un objeto JSONObject. Las llamadas para obtener varios resultados como newMyFriendsRequest devuelven un objeto JSONArray.

Gestionar errores

Puedes examinar el campo de error en un objeto GraphResponse para comprobar si la solicitud da error o no. El campo de error es de tipo FacebookRequestError. Los métodos a los que puedes llamar son:

El objeto de error tiene campos que proporcionan detalles sobre el error, como:

  • error code,
  • sub error code,
  • error message,
  • user facing error message,
  • etc.

Para obtener información más detallada sobre posibles códigos de error, consulta Uso de la API Graph: Gestionar errores.

El objeto GraphResponse también tiene un elemento enum que categoriza el error. Las tres categorizaciones posibles son:

  • LOGIN_RECOVERABLE: hay un problema que requiere que el usuario vuelva a iniciar sesión. Puedes llamar a la clase LoginManager de resolveError con el objeto GraphResponse y la actividad o el fragmento de tu aplicación. Esta acción activará la interfaz de usuario de inicio de sesión con Facebook y tendrás que implementar una instancia de CallbackManager junto al fragmento o la actividad que generan la llamada para que el inicio de sesión se realice correctamente.
  • TRANSIENT: indica que se ha producido un problema temporal. Tu aplicación puede reintentar la solicitud.
  • OTHER: indica que se ha producido un problema general. Puedes obtener más información examinando el error code y el sub error code.

Solución de problemas

Si tienes problemas a la hora de recuperar datos de usuario, activa el registro de solicitudes HTTP añadiendo este código antes de que tu aplicación solicite los datos:

FacebookSdk.addLoggingBehavior(LoggingBehavior.REQUESTS);

De este modo, los datos sobre solicitudes y respuestas HTTP quedarán guardados en el registro de la consola.

Solicitudes por lotes

Deberías realizar solicitudes por lotes de datos si tu aplicación se enfrenta a este tipo de situaciones:

  • Accedes a volúmenes considerables de datos en una sola solicitud.
  • Realizas cambios en varios objetos a la vez.

Si deseas reducir el número de recorridos de ida y vuelta a servidores, puedes utilizar solicitudes por lotes. Por ejemplo, recuperamos los datos de un usuario y de sus amigos:

GraphRequestBatch batch = new GraphRequestBatch(
        GraphRequest.newMeRequest(
                access_token,
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(
                            JSONObject jsonObject,
                            GraphResponse response) {
                        // Application code for user
                    }
                }),
        GraphRequest.newMyFriendsRequest(
                access_token,
                new GraphRequest.GraphJSONArrayCallback() {
                    @Override
                    public void onCompleted(
                            JSONArray jsonArray, 
                            GraphResponse response) {
                        // Application code for users friends 
                    }
                })
);
batch.addCallback(new GraphRequestBatch.Callback() {
    @Override
    public void onBatchCompleted(GraphRequestBatch graphRequests) {
        // Application code for when the batch finishes
    }
});
batch.executeAsync();

En el ejemplo anterior, se muestra la solicitud por lotes como una llamada asincrónica. Si este código se encuentra en un subproceso en segundo plano y quieres bloquearlo hasta que finalice la llamada, puedes llamar a batch.executeAndWait().

Recursos relacionados