Verwenden der Graph API – Android

Das Android-SDK unterstützt die Integration in Facebook Graph API. Mit den Klassen GraphRequest und GraphResponse kannst du asynchron in JSON Anfragen senden und Antworten abrufen. Mit GraphRequestBatch kannst du zudem Batch-Anfragen mit einem einzelnen Round-Trip zu den Facebook-Servern tätigen.

Weitere Infos zur Graph API:

In den Referenzen zu GraphRequest, GraphResponse und GraphRequestBatch erfährst du außerdem, wie du das Facebook-SDK für Android verwendest und Graph API-Aufrufe für weitere Anwendungsfälle tätigst.

Voraussetzungen

Richte zunächst Folgendes ein:

GraphRequest-Klasse

Die GraphRequest-Klasse umfasst eine newMeRequest-Methode, die den Endpunkt /user/me aufruft, um die Nutzerdaten für den jeweiligen Zugriffsschlüssel abzurufen.

Das Android-SDK sendet alle Berechtigungen deiner App im access_token, wodurch der Datenzugriff gesteuert wird. Wenn deine App keinen verfügbaren Zugriffsschlüssel aufweist, gibt Graph API nur öffentlich verfügbare Informationen zurück. Einzelheiten zu User-Eigenschaften und -Berechtigungen findest du in der Graph API-Referenz, User.

Standardmäßig ruft eine newMeRequest-Methode Standardfelder aus einem Nutzerobjekt ab. Wenn du zusätzliche Felder benötigst oder die Payload der Antwort aus Performancegründen reduzieren möchtest, kannst du einen fields-Parameter hinzufügen und spezielle Felder anfragen:

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

In der Rückrufmethode werden die Antwortdaten in ein JSONObject deserialisiert, wenn die Anfrage erfolgreich ist. Die Felder, die aufgrund fehlender Berechtigungen nicht abgerufen werden können, werden nicht in das Ergebnis aufgenommen.

Für den angemeldeten Nutzer verfügt das SDK über Profile- und ProfileTracker-Klassen (siehe Facebook Login für Android).

Nutzerdaten abrufen

Die Daten, auf die du zugreifst, hängen von den Berechtigungen ab, die eine Person deiner App erteilt, sowie von den Daten, die sie mit Apps teilt. Hier findest du eine Beispiel-Graph API-Rohantwort für user_location und 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
}

Umgang mit Ergebnissen

Je nach aufgerufenem Endpunkt erhältst du entweder ein JSONObject oder ein JSONArray.

Einzelobjektaufrufe, wie newMeRequest, geben ein JSONObject zurück. Aufrufe für mehrere Ergebnisse, wie newMyFriendsRequest, geben ein JSONArray zurück.

Umgang mit Fehlern

Du kannst das Fehlerfeld für ein GraphResponse-Objekt untersuchen, um zu prüfen, ob eine Anfrage fehlschlägt oder nicht. Das Fehlerfeld hat den Typ FacebookRequestError. Du kannst die folgenden Methoden aufrufen:

Das Fehlerobjekt weist Felder auf, die Details zum Fehler enthalten, wie:

  • error code,
  • sub error code
  • error message
  • user facing error message
  • und weitere Meldungen

Weitere Einzelheiten zu möglichen Fehlercodes findest du unter Verwenden der Graph API, Umgang mit Fehlern.

Das GraphResponse-Objekt weist außerdem ein enum-Element auf, das den Fehler kategorisiert. Die folgenden drei Kategorisierungen sind möglich:

  • LOGIN_RECOVERABLE: Es liegt ein Problem vor, wegen dem der Nutzer sich erneut anmelden muss. Du kannst resolveError von LoginManager mit dem GraphResponse-Objekt und der Aktivität oder dem Fragment aus deiner App aufrufen. Dadurch wird die Facebook Login-UI ausgelöst und du musst einen CallbackManager vom aufrufenden Fragment oder von der aufrufenden Aktivität implementieren, damit der Login erfolgreich verläuft.
  • TRANSIENT: Gibt an, dass ein vorübergehendes Problem aufgetreten ist und deine App die Anfrage wiederholen kann.
  • OTHER: Gibt an, dass ein allgemeines Problem aufgetreten ist. Du findest weitere Details in error code und sub error code.

Problembehebung

Wenn Probleme beim Abrufen von Nutzerdaten auftreten, aktiviere die Protokollierung von HTTP-Anfragen, indem du diesen Code hinzufügst, bevor deine App Nutzerdaten anfragt:

FacebookSdk.addLoggingBehavior(LoggingBehavior.REQUESTS);

Dadurch werden Details zu HTTP-Anfragen und -Antworten im Konsolenlog protokolliert.

Batch-Anfragen

Sende Batch-Anfragen für Daten, wenn deine App:

  • auf erhebliche Datenmengen in einer einzelnen Anfrage zugreift oder
  • Änderungen an mehreren Objekten gleichzeitig vornimmt.

Wenn du Server-Round-Trips reduzieren möchtest, kannst du eine Batch-Anfrage verwenden. Beispiel: Wir rufen einen Nutzer und dessen Freunde ab:

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

Das obige Beispiel zeigt die Batch-Anfrage als asynchronen Aufruf. Wenn dieser Code in einem Hintergrundthread ausgeführt wird und du ihn blockieren möchtest, bis der Aufruf beendet ist, kannst du batch.executeAndWait() aufrufen.

Verwandte Ressourcen