Bien que Simon Cross réponse de soit acceptée et correcte, j'ai pensé que je la renforcerais un peu avec un exemple (Android) de ce qui doit être fait. Je vais le garder aussi général que possible et me concentrer uniquement sur la question. Personnellement, j'ai fini par stocker des choses dans une base de données, donc le chargement était fluide, mais cela nécessite un CursorAdapter et ContentProvider qui est un peu hors de portée ici.
Je suis venu ici moi-même et j'ai pensé, maintenant quoi?!
Le problème
Tout comme user3594351 , je remarquais que les données des amis étaient vides. J'ai découvert cela en utilisant le FriendPickerFragment. Ce qui a fonctionné il y a trois mois ne fonctionne plus. Même les exemples de Facebook ont éclaté. Mon problème était donc «Comment créer manuellement FriendPickerFragment?
Ce qui n'a pas fonctionné
L'option n ° 1 de Simon Cross n'était pas assez forte pour inviter des amis à l'application. Simon Cross a également recommandé la boîte de dialogue Demandes, mais cela ne permettrait que cinq demandes à la fois. La boîte de dialogue des demandes a également montré les mêmes amis lors d'une session de connexion Facebook donnée. Pas utile.
Ce qui a fonctionné (résumé)
Option # 2 avec un travail acharné. Vous devez vous assurer que vous respectez les nouvelles règles de Facebook: 1.) Vous êtes un jeu 2.) Vous avez une application Canvas (présence Web) 3.) Votre application est enregistrée sur Facebook. Tout est fait sur le site Web des développeurs Facebook sous Paramètres .
Pour émuler le sélecteur d'amis à la main dans mon application, j'ai fait ce qui suit:
- Créez une activité d'onglet qui montre deux fragments. Chaque fragment montre une liste. Un fragment pour les amis disponibles ( / me / friends ) et un autre pour les amis invitables ( / me / invitable_friends ). Utilisez le même code de fragment pour rendre les deux onglets.
- Créez une tâche AsyncTask qui obtiendra les données d'amis de Facebook. Une fois ces données chargées, jetez-les à l'adaptateur qui restituera les valeurs à l'écran.
Détails
The 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);
}
}
}
La classe FacebookFriend que j'ai créée
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());
}
}
}