olmasına rağmen Simon Cross'un cevabı kabul edilip doğru , yapılması gerekenlere bir örnek (Android) ile biraz dayandıracağımı düşündüm. Mümkün olduğu kadar genel tutacağım ve sadece soruya odaklanacağım. Şahsen ben bir veritabanında şeyler depolamak kadar yaralandı böylece yükleme pürüzsüz, ama bu biraz kapsam dışı bir CursorAdapter ve ContentProvider gerektirir.
Buraya kendim geldim ve sonra düşündüm, şimdi ne oldu ?!
Sorun
Tıpkı user3594351 gibi , arkadaş verilerinin boş olduğunu fark ettim. FriendPickerFragment kullanarak bunu öğrendim. Üç ay önce işe yarayan, artık işe yaramıyor. Facebook'un örnekleri bile kırıldı. Yani benim sorunum 'FriendPickerFragment'ı elle nasıl oluşturabilirim?
Ne işe yaramadı
Simon Cross'un 1. Seçeneği , arkadaşlarını uygulamaya davet edecek kadar güçlü değildi. Simon Cross ayrıca İstekler İletişim Kutusunu tavsiye etti, ancak bu bir seferde yalnızca beş isteğe izin verecekti. İstekler iletişim kutusu, oturum açmış herhangi bir Facebook oturumu sırasında aynı arkadaşları da gösterdi. Yararlı değil.
Ne Çalıştı (Özet)
Seçenek # 2 bazı sıkı çalışmalarla. Facebook'un yeni kurallarını yerine getirdiğinizden emin olmalısınız: 1.) Bir oyunsunuz 2.) Bir Canvas uygulamanız var (Web Varlığı) 3.) Uygulamanız Facebook'a kayıtlı. Her şey Ayarlar altındaki Facebook geliştirici web sitesinde yapılır .
Benim app içinde elle arkadaş seçici taklit etmek için aşağıdakileri yaptım:
- İki parçayı gösteren bir sekme etkinliği oluşturun. Her parça bir liste gösterir. Bir arkadaşınız ( / ben / arkadaşım ) için bir parça ve davet edilebilir arkadaşlarınız için bir parça ( / ben / invitable_friends) ) için bir parça. Her iki sekmeyi de oluşturmak için aynı parça kodunu kullanın.
- Facebook'tan arkadaş verilerini alacak bir AsyncTask oluşturun. Bu veri yüklendikten sonra, değerleri ekrana getirecek olan adaptöre atın.
ayrıntılar
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);
}
}
}
Oluşturduğum FacebookFriend sınıfı
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());
}
}
}