Незважаючи на те, що відповідь Саймона Кроса прийнята і правильна, я подумав, що я трохи доповнив це прикладом (Android) того, що потрібно зробити. Я буду тримати це якнайбільше, і можу зосередитись лише на питанні. Особисто я завершив зберігання речей у базі даних, щоб завантаження було плавним, але для цього потрібні CursorAdapter та ContentProvider, що тут трохи поза сферою.
Я сам прийшов сюди і тоді подумав, тепер що ?!
Питання
Як і user3594351 , я помітив, що дані про друзі порожні. Я дізнався це, використовуючи FriendPickerFragment. Те, що працювало три місяці тому, вже не працює. Навіть приклади Facebook зламалися. Тож моє питання було "Як створити FriendPickerFragment вручну?"
Що не працювало
Варіант №1 від Simon Cross був недостатньо сильним, щоб запросити друзів у додаток. Саймон Кросс також рекомендував діалог запитів, але це дозволило б одночасно п’ять запитів. Діалогове вікно запитів також показало тих самих друзів під час будь-якого даного Facebook, який увійшов у сесію. Не корисно.
Що працювало (резюме)
Варіант №2 з важкою працею. Ви повинні переконатися, що ви виконуєте нові правила Facebook: 1.) Ви граєте 2.) У вас є додаток Canvas (веб-присутність) 3.) Ваш додаток зареєстровано у Facebook. Все це робиться на веб-сайті розробника Facebook у розділі Налаштування .
Щоб наслідувати вибору друга вручну в моєму додатку, я зробив наступне:
- Створіть активність на вкладці, яка показує два фрагменти Кожен фрагмент показує список. Один фрагмент для доступного друга ( / мене / друзів ) та ще один для запрошених друзів ( / мене / запрошених друзів ). Використовуйте один і той же код фрагмента для відображення обох вкладок.
- Створіть AsyncTask, який отримає дані про друга з Facebook. Як тільки ці дані завантажуються, киньте їх на адаптер, який передасть значення на екран.
Деталі
Задача 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);
}
}
}
Клас 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());
}
}
}