2012-09-15 191 views
7

在我的Android應用程序中,我試圖從他的Facebook帳戶獲取用戶的封面照片。使用Facebook API獲取封面照片

我可以通過使用下面的代碼獲取個人資料圖片。

profilePicUrl = new URL("http://graph.facebook.com/" + userId + "/picture?type=large"); 

profilePicBmp = BitmapFactory.decodeStream(profilePicUrl.openConnection().getInputStream()); 

documentation指定了用於檢索的封面照片以下。

用戶的封面照片

需要(必須使用 字段=蓋參數顯式請求)的access_token

返回:字段ID,源,和 的陣列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");

但我一直沒能得到用戶配置文件的封面圖片。

在線搜索也沒有產生任何有效的結果。

任何幫助的確會被讚賞。

謝謝!

回答

8

「source」標記(JSONObject)嵌套在另一個JSONObject(「cover」標記)內。要分析這個結果,你將不得不使用這樣的事情:

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

在示例中使用的JOCover假定你已經有了一個JSONOBject (JOCover)解析根。你可以替代你自己的JSONObject

「源」標籤不能直接訪問,因爲它嵌套在「封面」標籤中。您將不得不使用「.optJSONObject("cover")」。我看到人們使用.getString而不是.optJSONObject,但我從未使用它。選擇適合你的東西。

編輯

按照您的要求使用圖形API,我編輯的早期解決方案,並與圖形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 
} 

我已經測試該溶液中,完美地工作。您必須將任何附加fields添加到您的活動所需的基本URL。爲了測試,我只用了fields=cover

並在onPostExecute,做你的事情來顯示封面圖片。希望這可以幫助。

+0

能否請你告訴我我應該用來提出請求的網址?我一直在收到這個錯誤。 '{ 「錯誤」:{ 「消息」: 「未知路徑組件:/字段=蓋」, 「類型」: 「OAuthException」, 「代碼」:2500 } }' – Swayam

+0

我得到這個錯誤太。 'org.json.JSONException:沒有來源的值' – Swayam

+0

@swayam:當使用'/ field = ????'時,你也必須提供訪問令牌。我添加了更多的代碼,它們應該是最適合您的技巧。 –

1

你已經封面照片Url剛剛從Json數組中讀取該字符串,你可以從該字符串中獲得封面照片。 這是封面照片的URL

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

這樣你可以得到圖像的URL格式的JSON對象。

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

我應該使用哪個URL?我很困惑。我一直在回覆這個錯誤。 '{ 「錯誤」:{ 「消息」: 「未知的路徑組件:/場=蓋」, 「類型」: 「OAuthException」, 「代碼」:2500 } }' – Swayam

1

我在我的應用程序中實現了類似的功能。這是我做的,使用FQL:

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

這使URL的封面照片,因爲source標籤被嵌套在pic_cover對象,然後可以使用像通用庫被設置爲ImageView內圖片裝載機

3

注意:使用Facebook的API和端點https://graph.facebook.com/me?fields=cover擷取封面照片不再工作作爲12月20日2014年

它應該給予以下回應:

{ 
    "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只是給:此使用Graph Tool explorer 2.2使用me?fields=cover

{ 
    "id": "19292868552" 
} 

驗證。

+2

它在2015年4月4日工作。 –

+0

這不再@楊順順了?有什麼想法嗎 ? – Sahan

+2

這仍然在2016年9月14日,但您需要爲您的應用程序應用user_photos範圍。 –

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

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 –

+0

好吧我會記住,我只是想幫助人 –