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 las referencias 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 token de acceso correspondiente.

El SDK para Android envía los permisos que tiene tu aplicación en access_token y esto controla el acceso a los datos. Si tu aplicación no tiene ningún token 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 Referencia de la API Graph: User.

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 de respuesta para no afectar el rendimiento, puedes agregar 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, se deserializan los datos de la respuesta en JSONObject si la solicitud se realiza correctamente. Los campos que no se puedan 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.

Recuperación de datos de usuario

Los datos a los que tengas acceso dependerán de los permisos que le concedan las personas a tu aplicación y de los datos que opten por compartir con las aplicaciones. A continuación, verás 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
}

Administrar resultados

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

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

Administrar errores

Puedes examinar el campo de error en un objeto GraphResponse para comprobar si la solicitud presenta errores 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:

  • error code
  • sub error code.
  • error message.
  • user facing error message.
  • Otros mensajes

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

El objeto GraphResponse también tiene un 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 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 CallbackManager junto al fragmento o la actividad que genera la llamada para que el inicio de sesión se realice correctamente.
  • TRANSIENT: indica que se produjo un problema temporal; tu aplicación puede reintentar la solicitud.
  • OTHER: indica que se produjo un problema general; puedes obtener más información examinando error code y sub error code.

Solución de problemas

Si tienes problemas para recuperar los datos del usuario, activa el registro de solicitudes HTTP agregando este código antes de que tu aplicación solicite los datos del usuario:

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

Realiza solicitudes por lotes de datos si tu aplicación:

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

Si quieres reducir el número de recorridos de ida y vuelta a los 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