使用Facebook API获取封面照片

7
在我的安卓应用程序中,我试图从用户的Facebook账户获取封面照片。我可以使用以下代码获取个人资料照片。
profilePicUrl = new URL("http://graph.facebook.com/" + userId + "/picture?type=large");

profilePicBmp = BitmapFactory.decodeStream(profilePicUrl.openConnection().getInputStream());
文档规定如下,以检索封面照片为例:

用户的封面照片 (必须请求字段 cover)

需要 access_token

返回:字段 id、source 和 offset_y 的数组

因此,JSON 响应的结构类似于这样。
{
   "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"
}

我对Facebook Graph API相当陌生,不太清楚该如何操作。
我尝试了以下两种方法: coverPicUrl = new URL("http://graph.facebook.com/" + userId + "/cover?type=large"); coverPicUrl = new URL("http://graph.facebook.com/" + userId + "/fields=cover"); 但是我并没有成功获取到用户资料的封面照片。
在网上搜索也没有得到任何有用的结果。
如果您能提供帮助,我将不胜感激。
谢谢!
5个回答

8

"source"标签(JSONObject)嵌套在另一个JSONObject中,即“cover”标签。要解析此结果,您需要使用类似以下的内容:

JSONObject JOSource = JOCover.optJSONObject("cover");
String coverPhoto = JOSource.getString("source");

在示例中使用的JOCover假设您已经有一个要解析根的JSONOBject (JOCover)。您可以用自己的JSONObject替换它。
"source"标签无法直接访问,因为它嵌套在"cover"标签中。您将需要使用".optJSONObject("cover")"来访问它。我曾见过人们使用.getString而不是.optJSONObject,但我从未使用过。选择适合您的方法。 编辑 根据您的请求,我正在编辑先前的解决方案,并用Graph API解决方案替换它。
最好在AsyncTask中,在doInBackground中使用此代码:
String URL = "https://graph.facebook.com/" + THE_USER_ID + "?fields=cover&access_token=" + Utility.mFacebook.getAccessToken();

String finalCoverPhoto;

try {

    HttpClient hc = new DefaultHttpClient();
    HttpGet get = new HttpGet(URL);
    HttpResponse rp = hc.execute(get);

    if (rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
        String result = EntityUtils.toString(rp.getEntity());

        JSONObject JODetails = new JSONObject(result);

        if (JODetails.has("cover")) {
            String getInitialCover = JODetails.getString("cover");

            if (getInitialCover.equals("null")) {
                finalCoverPhoto = null;
        } else {
            JSONObject JOCover = JODetails.optJSONObject("cover");

            if (JOCover.has("source"))  {
                finalCoverPhoto = JOCover.getString("source");
            } else {
                finalCoverPhoto = null;
            }
        }
    } else {
        finalCoverPhoto = null;
    }
} catch (Exception e) {
    // TODO: handle exception
}

我已经测试过这个解决方案,并且完美地工作。您需要将任何额外的字段添加到基本URL中,以便满足您的活动需求。为了进行测试,我只使用了fields=cover

onPostExecute中,执行您的操作以显示封面图片。希望这能有所帮助。


请问我应该使用哪个URL来发起请求?我一直收到这个错误信息。{ "error": { "message": "未知路径组件:/field=cover", "type": "OAuthException", "code": 2500 } } - Swayam
我也遇到了这个错误。org.json.JSONException: No value for source - Swayam
@swayam:当使用/field=????时,您也必须提供访问令牌。我已经添加了更多的代码,理想情况下应该可以为您解决问题。 - Siddharth Lele
你的代码看起来不错,但实际上我正在尝试使用Graph API。你能否帮我使用API而不是制作FQL语句?你的代码是可行的,但我想学习API,并且如果你能帮忙就太好了。 - Swayam

3

注意: 从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 2.2并执行me?fields=cover指令,可以验证此内容。


这个不再工作了,@YangShun 有什么想法吗? - Sahan
2
这仍然在2016年9月14日起运作,但您需要为您的应用程序应用user_photos范围。 - Jimmy Huang

1

您已经有封面照片的URL了,只需从Json数组中读取该字符串,即可获取封面照片。 这是封面照片的URL。

"source": "http://sphotos-a.ak.fbcdn.net/hphotos-ak-ash4/s720x720/391237_10151008748223553_422785532_n.jpg",

通过这种方式,您可以从Json对象中获取图像URL。

String cover_photo = JsonObject.getString("source");

1
我应该使用什么URL?我感到困惑。我不断收到以下错误回复:{ "error": { "message": "Unknown path components: /field=cover", "type": "OAuthException", "code": 2500 } } - Swayam

1

我在我的应用程序中实现了类似的功能。这是我使用 FQL 实现它的方式:

String cover_photo = jsonObj.getJSONObject("pic_cover").getString("source");

这提供了封面照片的URL,因为source标签嵌套在pic_cover对象中,可以使用Universal Image Loader等库将其设置为ImageView

0
object.getJSONObject("cover").getString("source")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接