代码之家  ›  专栏  ›  技术社区  ›  EboMike

如何使用Android Facebook SDK获取完整的好友列表

  •  2
  • EboMike  · 技术社区  · 9 年前

    我正在尝试使用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、offset、limit等……但结果相同-结果为空,没有“next”。

    如何正确检索完整的好友列表?

    3 回复  |  直到 9 年前
        1
  •  4
  •   EboMike    9 年前

    简单的回答:这是不可能的。Facebook删除了检索好友数据的选项。唯一的例外是使用同一应用程序的朋友,所以在我所有的朋友中,有20个显然在使用我的应用程序,而这些人正是我从查询中得到的。

    除此之外,你再也无法获得完整的朋友列表,或这些朋友的详细信息。

        2
  •  1
  •   Bogdan V.    9 年前

    尝试将限制从25设置为无限制(或非常大的限制),并让其余的代码保持原样。我在旧版本中使用SDK,它有时会以特殊的方式工作(但我倾向于记住,无论大小,我都会得到完整的朋友列表)。

    此外,尝试将request.setParams()移到while之外。如果请求有任何临时状态,只需覆盖它们。Facebook可能会拒绝一个又一个来得太快的相同请求,以减轻DoS攻击。

        3
  •  0
  •   hsafarya    9 年前

    如果您将“v2.2”更改为“v1.0”,那么您将得到所需的内容,但请注意,1.0 api很快就会过期。