2

我正在尝试获取用户的封面照片并将其显示在布局的顶部。我正在使用 AsyncTask 运行对 Facebook 的 API 调用。我用来获取 Facebook 数据的代码是

JSONObject json = null;
response = Utility.facebook.request("me?fields=cover");
json = Util.parseJson(response);

停止线程的异常来自下一步的 json 错误,因为返回的 json 是空的,即使请求清除。我可以只使用“me”或“me/albums”或“me?fields=cover”以外的任何东西来获得正确的 json。当我注释掉最后一行时,“尝试”过程结束,没有异常/错误。

Facebook API 有问题还是我做错了什么?

4

3 回答 3

1

没有得到任何结果的原因可以在 request(String graphPath) 方法的 javadoc 中找到:

(...) 这个方法会阻塞等待网络响应,所以不要在 UI 线程中调用它。

在您的情况下,您可能应该执行以下同步调用:

Bundle params = new Bundle();
params.putString("fields", "cover");
String result = Utility.facebook.request("me/", params);

Siddharth Lele 的回答非常正确,但我想说明在这种情况下没有得到任何回应的实际原因。

于 2012-10-25T01:30:43.673 回答
1

在处理用户配置文件时,我个人更喜欢使用 FQL。如果您想尝试 FQL,请查看以下代码。如果您想坚持使用 Graph API,请参阅以下答案:https ://stackoverflow.com/a/12434640/450534

try {
    String query = "SELECT pic_cover FROM user where uid = " + PUT_THE_USER_ID_HERE;
    Bundle param = new Bundle();
    param.putString("method", "fql.query");
    param.putString("query", query);

    String response = Utility.mFacebook.request(param);

    JSONArray JAUser = new JSONArray(response);

    for (int i = 0; i < JAUser.length(); i++) {
        JSONObject JOUser = JAUser.getJSONObject(i);

        // COVER PHOTO
        if (JOUser.has("pic_cover"))    {

            String getCover = JOUser.getString("pic_cover");

            if (getCover.equals("null"))    {
                String finalCover = null;
            } else {
                JSONObject JOCoverSource = JOUser.optJSONObject("pic_cover");

                if (JOCoverSource.has("source"))    {
                    String finalCover = JOCoverSource.getString("source");
                } else {
                    String finalCover = null;
                }
            }

        } else {
            String finalCover = null;
        }
    }

} catch (Exception e) {
    // TODO: handle exception
}

上面的代码已经考虑了在他们的个人资料中没有设置封面照片的用户,并检查了它的可用性。使用此代码,您将拥有URL封面照片,然后可以根据需要进行处理。

注意:如果你是获取登录用户的封面照片,这段代码SELECT pic_cover FROM user where uid = " + PUT_THE_USER_ID_HERE;也可以写成:SELECT pic_cover FROM user where uid = me()";对于未登录的用户的封面照片,上面可以照原样使用。

作为旁注的几件事。

  1. 我几乎完全使用Fedor 的延迟加载技术来加载图像。
  2. 我建议在AsyncTask.
于 2012-10-24T05:04:41.743 回答
0

注意:使用 Facebook API 和端点获取封面照片https://graph.facebook.com/me?fields=cover不再适用于 2014 年 12 月 20 日。

它应该给出以下响应:

{
   "cover": {
   "cover_id": "10151008748223553",
   "source": "http://sphotos-a.ak.fbcdn.net/hphotos-ak-ash4/s720x720/391237_10151008748223553_422785532_n.jpg",
   "offset_y": 0
   },
   "id": "19292868552"
}

但现在它只给出了用户的id

{
  "id": "19292868552"
}

使用Graph Tool explorer v2.2验证了这一点me?fields=cover

于 2014-12-20T11:54:08.157 回答