Mimo że odpowiedź Simona Crossa została zaakceptowana i poprawna, pomyślałem, że wzmocnię ją nieco przykładem (Androida) tego, co należy zrobić. Utrzymam to tak ogólne, jak to możliwe i skupię się tylko na pytaniu. Osobiście zakończyłem przechowywanie rzeczy w bazie danych, aby ładowanie przebiegało płynnie, ale wymaga to CursorAdapter i ContentProvider, który jest nieco poza zakresem.
Sam tu przyszedłem, a potem pomyślałem, co teraz ?!
Problem
Podobnie jak user3594351 , zauważyłem, że dane znajomego są puste. Dowiedziałem się tego za pomocą FriendPickerFragment. To, co działało trzy miesiące temu, już nie działa. Zepsuły się nawet przykłady na Facebooku. Więc mój problem brzmiał: „Jak ręcznie utworzyć FriendPickerFragment?
Co nie działa
Opcja nr 1 z Simon Cross nie była wystarczająco silna, aby zaprosić znajomych do aplikacji. Simon Cross zalecił także okno dialogowe Żądania, ale pozwoliłoby to na przyjęcie tylko pięciu żądań na raz. Okno dialogowe żądań pokazywało również tych samych znajomych podczas każdej sesji zalogowania na Facebooku. Nieprzydatne.
Co działało (Podsumowanie)
Opcja nr 2 przy odrobinie ciężkiej pracy. Musisz upewnić się, że spełniasz nowe zasady Facebooka: 1.) Jesteś grą 2.) Masz aplikację Canvas (Obecność w sieci) 3.) Twoja aplikacja jest zarejestrowana na Facebooku. Wszystko to odbywa się na stronie programisty Facebooka w Ustawieniach .
Aby ręcznie emulować próbnik wyboru znajomych w mojej aplikacji, wykonałem następujące czynności:
- Utwórz działanie tab, które pokazuje dwa fragmenty. Każdy fragment pokazuje listę. Jeden fragment dla dostępnego przyjaciela ( / ja / przyjaciele ), a drugi dla zaproszonych przyjaciół ( / me / invitable_friends ). Użyj tego samego kodu fragmentu, aby wyświetlić obie karty.
- Utwórz AsyncTask, który pobierze dane znajomych z Facebooka. Po załadowaniu danych wrzuć je do adaptera, który wyświetli wartości na ekranie.
Detale
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);
}
}
}
Stworzyłem klasę FacebookFriend
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());
}
}
}