Meskipun jawaban Simon Cross diterima dan benar, saya pikir saya akan menambahkannya sedikit dengan contoh (Android) tentang apa yang perlu dilakukan. Saya akan menjaganya agar tetap umum dan fokus hanya pada pertanyaan. Secara pribadi saya akhirnya menyimpan hal-hal dalam database sehingga pemuatannya lancar, tetapi itu membutuhkan CursorAdapter dan ContentProvider yang sedikit keluar dari ruang lingkup di sini.
Saya datang ke sini sendiri dan kemudian berpikir, sekarang apa ?!
Masalah
Sama seperti user3594351 , saya memperhatikan bahwa data teman itu kosong. Saya menemukan ini dengan menggunakan FriendPickerFragment. Apa yang berhasil tiga bulan lalu, tidak lagi berhasil. Bahkan contoh-contoh Facebook pecah. Jadi masalah saya adalah 'Bagaimana Saya membuat FriendPickerFragment dengan tangan?
Apa yang Tidak Berhasil
Opsi # 1 dari Simon Cross tidak cukup kuat untuk mengundang teman ke aplikasi. Simon Cross juga merekomendasikan Dialog Permintaan, tetapi itu hanya akan memungkinkan lima permintaan sekaligus. Dialog permintaan juga menunjukkan teman yang sama selama sesi login Facebook yang diberikan. Tidak berguna.
Apa yang Bekerja (Ringkasan)
Opsi # 2 dengan kerja keras. Anda harus memastikan Anda memenuhi aturan baru Facebook: 1.) Anda adalah game 2.) Anda memiliki aplikasi Canvas (Keberadaan Web) 3.) Aplikasi Anda terdaftar di Facebook. Itu semua dilakukan di situs web pengembang Facebook di bawah Pengaturan .
Untuk meniru pemetik teman dengan tangan di dalam aplikasi saya, saya melakukan hal berikut:
- Buat aktivitas tab yang menampilkan dua fragmen. Setiap fragmen menunjukkan daftar. Satu fragmen untuk teman yang tersedia ( / saya / teman ) dan lainnya untuk teman yang invitable ( / me / invitable_friends ). Gunakan kode fragmen yang sama untuk merender kedua tab.
- Buat AsyncTask yang akan mendapatkan data teman dari Facebook. Setelah data dimuat, lemparkan ke adaptor yang akan memberikan nilai ke layar.
Detail
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);
}
}
}
Kelas FacebookFriend yang saya buat
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());
}
}
}