如何使用 Android Facebook SDK 获取完整的好友列表
How to get the full friends list using the Android Facebook SDK
我正在尝试使用 Facebook Android SDK 3.23.0 获取所有好友的列表。
我只得到前 20 个结果,当试图转到下一页时,我只得到一个空结果。
代码如下:
Request.GraphUserListCallback callback = new Request.GraphUserListCallback() {
@Override
public void onCompleted(List<GraphUser> graphUsers, Response response) {
parseFriends(graphUsers);
}
};
Bundle params = new Bundle();
params.putString("fields", "id, name");
Request request = Request.newMyFriendsRequest(mSession, callback);
while (request != null) {
request.setParameters(params);
Response response = request.executeAndWait();
if (response.getError() != null) {
Log.e(TAG, "Error in request: " + response.getError().toString());
break;
} else {
request = response.getRequestForPagedResults(Response.PagingDirection.NEXT);
}
}
那不行,第二个请求(由 getRequestForPagedResults()
创建的那个)基本上是空的(图形路径是 "null")。
当我查看第一个请求的响应时,"next" 标签似乎完全没问题:
https://graph.facebook.com/v2.2/625641456/friends?fields=id,name&format=json&access_token=[TOKEN]&limit=25&offset=25&__after_id=[ID]
(我确实想知道为什么当第一个请求只返回 20 个结果时偏移量是 25。我使用的是默认限制,我认为是 25)。
我的备份计划是跟踪我处理的元素数量,并简单地将 "offset" 添加到我传入的包中。但这会导致第二个请求为空,并且它的 "next" 为空。
所以我尝试从第一个请求解析结果 "next" 字符串并将其所有内容传递到包中,即 _after_id、偏移量、限制等...但结果相同- 空结果,没有 "next".
如何正确检索完整的好友列表?
尝试将限制从 25 设置为无限制(或非常大的限制),并让其余代码保持原样。我在旧版本中使用 SDK,它有时会以特殊的方式工作(但我倾向于记得我得到的是完整的好友列表,无论其大小如何)。
此外,尝试将 request.setParams() 移到 while 之外。如果请求有任何临时状态,您只需覆盖它们即可。 Facebook 可能会拒绝一个又一个来得太快而无法缓解 DoS 攻击的相同请求。
简单回答:不可能。 Facebook 删除了检索好友数据的选项。唯一的例外是使用相同应用程序的朋友,所以在我所有的朋友中,显然有 20 个正在使用我的应用程序,而这些人是我从查询中得到的回复。
除此之外,您将无法再获得完整的好友列表,或有关这些好友的详细信息。
如果您将 "v2.2" 更改为 "v1.0" ,那么您将得到您想要的,但请注意 1.0 api 即将过期。
我正在尝试使用 Facebook Android SDK 3.23.0 获取所有好友的列表。
我只得到前 20 个结果,当试图转到下一页时,我只得到一个空结果。
代码如下:
Request.GraphUserListCallback callback = new Request.GraphUserListCallback() {
@Override
public void onCompleted(List<GraphUser> graphUsers, Response response) {
parseFriends(graphUsers);
}
};
Bundle params = new Bundle();
params.putString("fields", "id, name");
Request request = Request.newMyFriendsRequest(mSession, callback);
while (request != null) {
request.setParameters(params);
Response response = request.executeAndWait();
if (response.getError() != null) {
Log.e(TAG, "Error in request: " + response.getError().toString());
break;
} else {
request = response.getRequestForPagedResults(Response.PagingDirection.NEXT);
}
}
那不行,第二个请求(由 getRequestForPagedResults()
创建的那个)基本上是空的(图形路径是 "null")。
当我查看第一个请求的响应时,"next" 标签似乎完全没问题:
https://graph.facebook.com/v2.2/625641456/friends?fields=id,name&format=json&access_token=[TOKEN]&limit=25&offset=25&__after_id=[ID]
(我确实想知道为什么当第一个请求只返回 20 个结果时偏移量是 25。我使用的是默认限制,我认为是 25)。
我的备份计划是跟踪我处理的元素数量,并简单地将 "offset" 添加到我传入的包中。但这会导致第二个请求为空,并且它的 "next" 为空。
所以我尝试从第一个请求解析结果 "next" 字符串并将其所有内容传递到包中,即 _after_id、偏移量、限制等...但结果相同- 空结果,没有 "next".
如何正确检索完整的好友列表?
尝试将限制从 25 设置为无限制(或非常大的限制),并让其余代码保持原样。我在旧版本中使用 SDK,它有时会以特殊的方式工作(但我倾向于记得我得到的是完整的好友列表,无论其大小如何)。
此外,尝试将 request.setParams() 移到 while 之外。如果请求有任何临时状态,您只需覆盖它们即可。 Facebook 可能会拒绝一个又一个来得太快而无法缓解 DoS 攻击的相同请求。
简单回答:不可能。 Facebook 删除了检索好友数据的选项。唯一的例外是使用相同应用程序的朋友,所以在我所有的朋友中,显然有 20 个正在使用我的应用程序,而这些人是我从查询中得到的回复。
除此之外,您将无法再获得完整的好友列表,或有关这些好友的详细信息。
如果您将 "v2.2" 更改为 "v1.0" ,那么您将得到您想要的,但请注意 1.0 api 即将过期。