Obwohl die Antwort von Simon Cross akzeptiert und richtig ist, dachte ich, ich würde sie mit einem Beispiel (Android) ein wenig aufpeppen, was getan werden muss. Ich werde es so allgemein wie möglich halten und mich nur auf die Frage konzentrieren. Persönlich habe ich Dinge in einer Datenbank gespeichert, damit das Laden reibungslos verlief, aber dafür sind ein CursorAdapter und ein ContentProvider erforderlich, die hier etwas außerhalb des Geltungsbereichs liegen.
Ich bin selbst hierher gekommen und habe dann gedacht, was nun?!
Die Angelegenheit
Genau wie bei user3594351 bemerkte ich, dass die Freundesdaten leer waren. Ich habe dies mithilfe des FriendPickerFragment herausgefunden. Was vor drei Monaten funktioniert hat, funktioniert nicht mehr. Sogar Facebooks Beispiele brachen. Mein Problem war also: "Wie erstelle ich FriendPickerFragment von Hand?"
Was hat nicht funktioniert
Option 1 von Simon Cross war nicht stark genug, um Freunde zur App einzuladen. Simon Cross empfahl auch den Anforderungsdialog, der jedoch nur fünf Anfragen gleichzeitig zulässt. Der Anforderungsdialog zeigte auch die gleichen Freunde während einer bestimmten Facebook-Anmeldesitzung. Nicht nützlich.
Was hat funktioniert (Zusammenfassung)
Option 2 mit harter Arbeit. Sie müssen sicherstellen, dass Sie die neuen Regeln von Facebook erfüllen: 1.) Sie sind ein Spiel 2.) Sie haben eine Canvas-App (Webpräsenz) 3.) Ihre App ist bei Facebook registriert. Dies geschieht alles auf der Facebook-Entwickler-Website unter Einstellungen .
Um den Freund-Picker von Hand in meiner App zu emulieren, habe ich Folgendes getan:
- Erstellen Sie eine Registerkartenaktivität, die zwei Fragmente anzeigt. Jedes Fragment zeigt eine Liste. Ein Fragment für verfügbare Freunde ( / me / friends ) und ein anderes für einladbare Freunde ( / me / invitable_friends ). Verwenden Sie denselben Fragmentcode, um beide Registerkarten zu rendern.
- Erstellen Sie eine AsyncTask, die die Freundesdaten von Facebook abruft. Sobald diese Daten geladen sind, werfen Sie sie auf den Adapter, der die Werte auf dem Bildschirm rendert.
Einzelheiten
Die AsynchTask
private class DownloadFacebookFriendsTask extends AsyncTask<FacebookFriend.Type, Boolean, Boolean> {
private final String TAG = DownloadFacebookFriendsTask.class.getSimpleName();
GraphObject graphObject;
ArrayList<FacebookFriend> myList = new ArrayList<FacebookFriend>();
@Override
protected Boolean doInBackground(FacebookFriend.Type... pickType) {
//
// Determine Type
//
String facebookRequest;
if (pickType[0] == FacebookFriend.Type.AVAILABLE) {
facebookRequest = "/me/friends";
} else {
facebookRequest = "/me/invitable_friends";
}
//
// Launch Facebook request and WAIT.
//
new Request(
Session.getActiveSession(),
facebookRequest,
null,
HttpMethod.GET,
new Request.Callback() {
public void onCompleted(Response response) {
FacebookRequestError error = response.getError();
if (error != null && response != null) {
Log.e(TAG, error.toString());
} else {
graphObject = response.getGraphObject();
}
}
}
).executeAndWait();
//
// Process Facebook response
//
//
if (graphObject == null) {
return false;
}
int numberOfRecords = 0;
JSONArray dataArray = (JSONArray) graphObject.getProperty("data");
if (dataArray.length() > 0) {
// Ensure the user has at least one friend ...
for (int i = 0; i < dataArray.length(); i++) {
JSONObject jsonObject = dataArray.optJSONObject(i);
FacebookFriend facebookFriend = new FacebookFriend(jsonObject, pickType[0]);
if (facebookFriend.isValid()) {
numberOfRecords++;
myList.add(facebookFriend);
}
}
}
// Make sure there are records to process
if (numberOfRecords > 0){
return true;
} else {
return false;
}
}
@Override
protected void onProgressUpdate(Boolean... booleans) {
// No need to update this, wait until the whole thread finishes.
}
@Override
protected void onPostExecute(Boolean result) {
if (result) {
/*
User the array "myList" to create the adapter which will control showing items in the list.
*/
} else {
Log.i(TAG, "Facebook Thread unable to Get/Parse friend data. Type = " + pickType);
}
}
}
Die FacebookFriend-Klasse, die ich erstellt habe
public class FacebookFriend {
String facebookId;
String name;
String pictureUrl;
boolean invitable;
boolean available;
boolean isValid;
public enum Type {AVAILABLE, INVITABLE};
public FacebookFriend(JSONObject jsonObject, Type type) {
//
//Parse the Facebook Data from the JSON object.
//
try {
if (type == Type.INVITABLE) {
//parse /me/invitable_friend
this.facebookId = jsonObject.getString("id");
this.name = jsonObject.getString("name");
// Handle the picture data.
JSONObject pictureJsonObject = jsonObject.getJSONObject("picture").getJSONObject("data");
boolean isSilhouette = pictureJsonObject.getBoolean("is_silhouette");
if (!isSilhouette) {
this.pictureUrl = pictureJsonObject.getString("url");
} else {
this.pictureUrl = "";
}
this.invitable = true;
} else {
// Parse /me/friends
this.facebookId = jsonObject.getString("id");
this.name = jsonObject.getString("name");
this.available = true;
this.pictureUrl = "";
}
isValid = true;
} catch (JSONException e) {
Log.w("#", "Warnings - unable to process Facebook JSON: " + e.getLocalizedMessage());
}
}
}