Bien que Simon de la Croix - réponse est acceptée et correct, je pensais que je le boeuf un peu avec un exemple (android) de ce qui doit être fait. Je vais le garder comme général comme je peux et de se concentrer sur la question. Personnellement, je me suis retrouvé entreposer des objets dans une base de données de sorte que le chargement était lisse, mais qui nécessite un CursorAdapter et ContentProvider qui est un peu hors de portée ici.
Je suis venu ici moi-même pensé, maintenant ce qui?!
La Question
Tout comme user3594351, j'ai remarqué de l'ami de données est vide. J'ai trouvé ceci en utilisant le FriendPickerFragment. Ce qui a fonctionné il y a trois mois, ne fonctionne plus. Même facebook les exemples de cassé. Donc ma question était de savoir " Comment puis-je créer FriendPickerFragment à la main?
Ce Qui N'A Pas De Travail
Option #1 de Simon de la Croix n'était pas assez fort pour inviter des amis à l'application. Simon Croix a également recommandé à la Demande de Dialogue, mais qui ne permettent seulement 5 demandes à la fois. Les demandes de dialogue a également montré les mêmes amis pendant tout Facebook enregistré dans la session. Pas utile.
Ce Qui A Fonctionné (Résumé)
Option #2 avec un peu de travail acharné. Vous devez assurez-vous de remplir Facebook de nouvelles règles: 1.) Vous êtes un jeu 2.) Vous avez une Toile d'application (Présence sur le Web) 3.) Vous êtes à l'application est enregistrée avec Facebook. Tout est fait sur Facebook développeur de site web, sous paramètres.
Pour émuler l'ami sélecteur à la main à l'intérieur de mon application, j'ai fait la suivante:
- Créer un onglet activité qui montre deux fragments. Chaque fragment montre une liste. Un fragment de friend (/me/amis) et un autre pour invitable amis (/me/invitable_friends). Utiliser le même fragment de code pour rendre les deux onglets.
- Créer un AsyncTask qui sera l'ami de données de Facebook. Une fois que les données sont chargées, de le jeter à l'adaptateur qui va rendre les valeurs à l'écran.
Détails
Le 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);
}
}
}
Le FacebookFriend classe 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 FB JSON: " + e.getLocalizedMessage());
}
}
}