Aunque la respuesta de Simon Cross es aceptada y correcta, pensé en reforzarla un poco con un ejemplo (Android) de lo que hay que hacer. Lo mantendré lo más general posible y me centraré solo en la pregunta. Personalmente terminé almacenando cosas en una base de datos para que la carga fuera fluida, pero eso requiere un Adaptador de cursor y un Proveedor de contenido que está un poco fuera de alcance aquí.
Vine aquí yo mismo y luego pensé, ¿y ahora qué?
La cuestión
Al igual que el usuario 3594351 , noté que los datos de amigos estaban en blanco. Descubrí esto usando el FriendPickerFragment. Lo que funcionó hace tres meses, ya no funciona. Incluso los ejemplos de Facebook se rompieron. Entonces mi problema fue '¿Cómo creo FriendPickerFragment a mano?
Lo que no funcionó
La opción # 1 de Simon Cross no fue lo suficientemente fuerte como para invitar a amigos a la aplicación. Simon Cross también recomendó el Diálogo de solicitudes, pero eso solo permitiría cinco solicitudes a la vez. El cuadro de diálogo de solicitudes también mostró los mismos amigos durante cualquier sesión de Facebook iniciada sesión. Inútil.
Lo que funcionó (resumen)
Opción # 2 con algo de trabajo duro. Debes asegurarte de cumplir con las nuevas reglas de Facebook: 1.) Eres un juego 2.) Tienes una aplicación Canvas (Presencia web) 3.) Tu aplicación está registrada en Facebook. Todo se hace en el sitio web para desarrolladores de Facebook en Configuración .
Para emular el selector de amigos a mano dentro de mi aplicación, hice lo siguiente:
- Cree una actividad de pestaña que muestre dos fragmentos. Cada fragmento muestra una lista. Un fragmento para un amigo disponible ( / me / friends ) y otro para amigos invitables ( / me / invitable_friends ). Use el mismo código de fragmento para representar ambas pestañas.
- Cree una AsyncTask que obtenga los datos de amigos de Facebook. Una vez que se cargan esos datos, tírelos al adaptador que representará los valores en la pantalla.
Detalles
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 clase de FacebookFriend que creé
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());
}
}
}