Uso dell'API Graph - Android

L'SDK per Android supporta l'integrazione con l'API Graph di Facebook. Con le classi GraphRequest e GraphResponse, puoi fare richieste e ottenere risposte in JSON in modo asincrono. Puoi inoltre fare richieste batch con un singolo round-trip ai server di Facebook con GraphRequestBatch.

Scopri di più sull'API Graph in:

Vedi anche i riferimenti di GraphRequest, GraphResponse e GraphRequestBatch per imparare a usare l'SDK di Facebook per Android ed effettuare chiamate all'API Graph per altri casi d'uso.

Prerequisiti

Prima di iniziare, imposta:

Classe GraphRequest

La classe GraphRequest ha un metodo newMeRequest che chiama l'endpoint /user/me per acquisire i dati utenti per il token d'accesso in questione.

L'SDK per Android invia tutte le autorizzazioni di cui dispone la tua app nel token access_token che controlla l'accesso ai dati. Se la tua app non ha un token d'accesso disponibile, l'API Graph restituisce solo le informazioni disponibili pubblicamente. Per i dettagli su proprietà e autorizzazioni User, vedi Riferimento dell'API Graph, User.

Come impostazione predefinita, un metodo newMeRequest acquisisce campi predefiniti da un oggetto utente. Se hai bisogno di campi aggiuntivi o desideri ridurre il payload di risposta a causa delle prestazioni, puoi aggiungere un parametro fields e richiedere campi specifici:

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();

Nel metodo callback, i dati di risposta sono deserializzati in un JSONObject se la richiesta è corretta. I campi che non possono essere acquisiti a causa di autorizzazioni mancanti saranno omessi dal risultato.

Per l'utente che ha effettuato l'accesso, l'SDK dispone delle classi Profile e ProfileTracker, vedi Facebook Login per Android.

Acquisizione dei dati utente

I dati a cui accedi dipendono dalle autorizzazioni che qualcuno concede alla tua app e i dati che sceglie di condividere con le app. Ecco un esempio di risposta dell'API Graph non elaborata per user_location e 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
}

Gestione dei risultati

In base all'endpoint che chiami, puoi ricevere un JSONObject o un JSONArray.

Le chiamate di un singolo oggetto come newMeRequest restituiscono un JSONObject. Chiamate di più risultati come newMyFriendsRequest restituiscono un JSONArray.

Gestione degli errori

Puoi esaminare il campo di errore su un oggetto GraphResponse per vedere se una richiesta riesce o meno. Il campo di errore è di tipo FacebookRequestError. I metodi che puoi chiamare sono:

L'oggetto errore dispone di campi che spiegano i dettagli tra cui:

  • error code;
  • sub error code
  • error message
  • user facing error message
  • e altri messaggi.

Per maggiori dettagli sui possibili codici di errore, vedi Uso dell'API Graph, Gestione degli errori.

L'oggetto GraphResponse dispone anche di un enum che categorizza l'errore. Le tre categorizzazioni possibili sono:

  • LOGIN_RECOVERABLE: problema che richiede all'utente di effettuare nuovamente l'accesso. Puoi chiamare il LoginManager del resolveError con l'oggetto GraphResponse e l'attività o il frammento dalla tua app. Questo attiva l'interfaccia utente di Facebook Login, quindi devi implementare un CallbackManager tramite il frammento o l'attività che hai chiamato per fare in modo che l'accesso vada a buon fine.
  • TRANSIENT: indica che si è verificato un problema temporaneo e la tua app può riprovare la richiesta.
  • OTHER: indica che si è verificato un problema generale e puoi ottenere maggiori dettagli esaminando l'error code e il sub error code.

Risoluzione dei problemi

Se riscontri problemi nell'acquisizione dei dati degli utenti, abilita la registrazione della richiesta HTTP aggiungendo questo codice prima che l'app richieda i dati degli utenti:

FacebookSdk.addLoggingBehavior(LoggingBehavior.REQUESTS);

Verranno registrati i dettagli su richieste HTTP e risposte al registro della console.

Richieste batch

Devi eseguire richieste batch di dati se la tua app gestisce questi tipi di scenari:

  • Accesso a quantità significative di dati in una singola richiesta.
  • Modifiche a diversi oggetti contemporaneamente.

Se vuoi ridurre la quantità di round-trip dei server, puoi usare una richiesta batch. Ad esempio acquisiamo un utente e i suoi amici:

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();

L'esempio sopra riportato mostra la richiesta batch come chiamata asincrona. Se questo codice è su un thread in background e vorresti bloccarlo fino al termine della chiamata, puoi chiamare batch.executeAndWait().

Risorse correlate