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.
Antes de empezar, configura lo siguiente:
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.
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 }
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
.
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
,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
.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.
Deberías realizar solicitudes por lotes de datos si tu aplicación se enfrenta a este tipo de situaciones:
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()
.
User
: referencias de usuario para la API Graph.GraphRequestBatch
: referencias para GraphRequestBatch
. GraphRequest
: referencias para GraphRequest
.