Sebbene la risposta di Simon Cross sia stata accettata e corretta, ho pensato di rinforzarla un po 'con un esempio (Android) di ciò che deve essere fatto. Lo terrò il più generale possibile e mi concentrerò solo sulla domanda. Personalmente ho finito per archiviare le cose in un database in modo che il caricamento fosse regolare, ma ciò richiede un CursorAdapter e ContentProvider che qui è un po 'fuori portata.
Sono venuto qui da solo e poi ho pensato, e adesso ?!
Il problema
Proprio come user3594351 , notavo che i dati degli amici erano vuoti. L'ho scoperto usando FriendPickerFragment. Ciò che ha funzionato tre mesi fa, non funziona più. Persino gli esempi di Facebook si sono rotti. Quindi il mio problema era 'Come faccio a creare FriendPickerFragment a mano?
Cosa non ha funzionato
L'opzione n. 1 di Simon Cross non era abbastanza forte da invitare amici all'app. Anche Simon Cross ha raccomandato la finestra di dialogo Richieste, ma ciò consentirebbe solo cinque richieste alla volta. La finestra di dialogo delle richieste mostrava anche gli stessi amici durante una determinata sessione di accesso a Facebook. Inutile.
Cosa ha funzionato (Riepilogo)
Opzione n. 2 con un duro lavoro. Devi assicurarti di soddisfare le nuove regole di Facebook: 1.) Sei un gioco 2.) Hai un'app Canvas (Presenza Web) 3.) La tua app è registrata con Facebook. È tutto fatto sul sito Web degli sviluppatori di Facebook in Impostazioni .
Per emulare il selettore di amici a mano all'interno della mia app ho fatto quanto segue:
- Creare un'attività di tabulazione che mostra due frammenti. Ogni frammento mostra un elenco. Un frammento per amico disponibile ( / me / amici ) e un altro per amici invitabili ( / me / invitable_friends ). Utilizzare lo stesso codice frammento per eseguire il rendering di entrambe le schede.
- Crea un AsyncTask che otterrà i dati degli amici da Facebook. Una volta caricati quei dati, lanciarli sull'adattatore che renderà i valori sullo schermo.
Dettagli
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 che ho creato
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());
}
}
}