Simon Cross의 대답은 받아 들일 수 있지만 정확해야하지만 수행해야 할 일의 예 (Android)로 조금 강화 할 것이라고 생각했습니다. 나는 그것을 가능한 한 일반적으로 유지하고 질문에만 집중할 것이다. 개인적으로 데이터베이스에 물건을 저장하여 로딩이 원활했지만 여기서는 범위를 벗어난 CursorAdapter와 ContentProvider가 필요합니다.
나는 여기에 와서 생각했다. 지금 무엇?!
문제
user3594351 과 마찬가지로 친구 데이터가 비어 있음을 알았습니다. FriendPickerFragment를 사용하여 이것을 알았습니다. 3 개월 전에 효과가 있었지만 더 이상 작동하지 않습니다. 페이스 북의 사례조차도 깨졌습니다. 그래서 내 문제는 'FriendPickerFragment를 직접 작성하는 방법은 무엇입니까?
작동하지 않는 것
Simon Cross의 옵션 # 1은 친구를 앱에 초대하기에 충분하지 않았습니다. Simon Cross 는 요청 대화 상자를 권장했지만 한 번에 5 개의 요청 만 허용합니다. 요청 대화 상자는 특정 Facebook 로그인 세션 동안 동일한 친구를 표시했습니다. 유용하지 않다.
효과가있는 것 (요약)
약간의 노력으로 옵션 # 2. Facebook의 새로운 규칙을 준수해야합니다. 1.) 게임입니다. 2.) Canvas 앱 (Web Presence)이 있습니다. 3.) 앱이 Facebook에 등록되어 있습니다. Facebook 개발자 웹 사이트의 설정 에서 모두 수행됩니다 .
내 앱에서 친구 선택기를 손으로 에뮬레이트하기 위해 다음을 수행했습니다.
- 두 개의 조각을 표시하는 탭 활동을 작성하십시오. 각 조각은 목록을 보여줍니다. 사용 가능한 친구 ( / me / friends )와 초대 할 수있는 친구 ( / me / invitable_friends )를 위한 조각 입니다. 동일한 조각 코드를 사용하여 두 탭을 모두 렌더링하십시오.
- Facebook에서 친구 데이터를 가져 오는 AsyncTask를 만듭니다. 해당 데이터가로드되면 값을 화면에 렌더링하는 어댑터로 보내십시오.
세부
비동기 작업
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());
}
}
}