Mặc dù câu trả lời của Simon Cross được chấp nhận và chính xác, tôi nghĩ rằng tôi sẽ tăng cường một chút với một ví dụ (Android) về những gì cần phải làm. Tôi sẽ giữ nó chung chung nhất có thể và chỉ tập trung vào câu hỏi. Cá nhân tôi cố gắng lưu trữ mọi thứ trong cơ sở dữ liệu để quá trình tải diễn ra suôn sẻ, nhưng điều đó đòi hỏi phải có CoderAd CHƯƠNG và ContentProvider, một thứ nằm ngoài phạm vi ở đây.
Tôi đến đây một mình và sau đó nghĩ, bây giờ thì sao?!
Vấn đề
Giống như user3594351 , tôi nhận thấy dữ liệu bạn bè trống. Tôi đã tìm thấy điều này bằng cách sử dụng FriendPickerFragment. Những gì làm việc ba tháng trước, không còn làm việc. Ngay cả các ví dụ của Facebook đã phá vỡ. Vì vậy, vấn đề của tôi là 'Làm cách nào để tạo FriendPickerFragment bằng tay?
Những gì không làm việc
Tùy chọn số 1 từ Simon Cross không đủ mạnh để mời bạn bè vào ứng dụng. Simon Cross cũng đề xuất Hộp thoại Yêu cầu, nhưng điều đó sẽ chỉ cho phép năm yêu cầu cùng một lúc. Hộp thoại yêu cầu cũng hiển thị cùng những người bạn trong bất kỳ phiên đăng nhập nào của Facebook. Không hữu ích.
Những gì đã làm việc (Tóm tắt)
Lựa chọn số 2 với một số công việc khó khăn. Bạn phải đảm bảo hoàn thành các quy tắc mới của Facebook: 1.) Bạn là một trò chơi 2.) Bạn có ứng dụng Canvas (Web Presence) 3.) Ứng dụng của bạn được đăng ký với Facebook. Tất cả được thực hiện trên trang web của nhà phát triển Facebook trong Cài đặt .
Để giả lập trình chọn bạn bè bằng tay trong ứng dụng của tôi, tôi đã làm như sau:
- Tạo một hoạt động tab cho thấy hai mảnh. Mỗi mảnh hiển thị một danh sách. Một đoạn dành cho bạn bè có sẵn ( / tôi / bạn bè ) và một đoạn khác dành cho những người bạn mời ( / tôi / invitable_friends ). Sử dụng cùng một đoạn mã để kết xuất cả hai tab.
- Tạo một AsyncTask sẽ lấy dữ liệu bạn bè từ Facebook. Khi dữ liệu đó được tải, hãy ném nó vào bộ điều hợp sẽ hiển thị các giá trị cho màn hình.
Chi tiết
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);
}
}
}
Lớp FacebookFriend tôi đã tạo
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());
}
}
}