Androd學習筆記——Android上利用Facebook SDK的開發——上傳圖文到塗鴉牆


  由於眾所周知的原因,國內不能上臉書,但是由於公司產品需要在M國發布,所以在Facebook的共享功能成了我最近的主要任務。寫下這篇文章,希望幫助到大家。

  一、如何登錄到的Facebook方便開發? 

  登錄FB當然是進行翻牆,在進行開發之前,我先介紹一個比較好的工具——VPN。這個東西的強大之處是無論PC,還是手機都可以十分方便地進行翻牆。國內較好的VPN是greenvpn,它的地址是:https://www.green002.com/index.php?option=com_user&task=register&affid=98670。它的優勢有免費的VPN可以使用,而且速度不錯,但是由於免費的,每20分鍾就會需要重新登錄VPN一次。注冊之后里面有詳細的教程(PC有客戶端,Android手機有設置教程),這次不再贅述,開始進入正題。

  二、Facebook API簡介

  在介紹 Facebook SDK for Android 之前,有必要了解一下 Facebook Platform 及其 API。據 Facebook 聲稱,Facebook Platform 允許任何人 “在 Facebook 和 Web 上構建社交應用程序”。為了允許您構建此類應用程序,Facebook 提供廣泛的一組核心且高級的 API 和 SDK。核心 Facebook Platform API 是 Graph API,它允許您從 Facebook 讀寫數據。Facebook 也具有 Old Rest API。新的 Graph API 將 API 范型從面向方法的。

  從 Facebook 讀寫數據的方式更改為一種新的方式,即使用對象(比如說用戶簡介、好友、帖子、照片,諸如此類)及其相互之間的關系或連接。該方法簡化了 Facebook API,使之處理對象時更加一致。注意,盡管 Graph API 是首選的 Facebook API,但是 Old REST API 仍然是活躍且受支持的。Graph 和 REST API 都適用於移動應用程序(包括原生和移動 web 應用程序),它們通過使用 WebViews 在原生應用程序中包含移動 web 內容。
  Graph API 對象被分配一個惟一的 ID,很容易使用一個 URL 訪問它,此 URL 可被進一步限定,以尋址一個特定的對象/連接。對象 URL 的一般結構類似如下: https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE,其中 OBJECT_ID 是對象的惟一 ID,CONNECTION_TYPE 是對象支持的一種連接類型。例如,一個頁面支持以下連接:feed/wall、photos、notes、posts、members,等等。
  利用 Graph API,您可以檢索對象,刪除對象和發布對象。您可以搜索、更新對象、過濾結果,甚至動態地發現對象的連接/關系。
默認情況下,應用程序對用戶的公共數據具有訪問權限。要訪問私有數據,應用程序必須首先請求用戶的權限(被稱之為擴展權限)。Facebook 定義了大量權限,您可以在 Extended Permissions 頁面了解它們。

  三、導入Facebook SDK 

  把facebook sdk所提供的工程導入到Eclipse了,所以要讓我們的工程擁有與facebook溝通的能力,就必須將該工程以library的方式參考到新建工程當中,在工程名稱上點擊右鍵,選擇"Properties",選擇第二項"Android",並於library框中利用"Add"加進com_facebook_android該工程。

  


  四、Facebook的登錄與發布文字消息

 1 //這里的APPID是你在Facebook申請的APPKEY
2 private Facebook mFacebook = new Facebook(FACEBOOK_APP_ID);
3 private static final String[] PERMISSIONS = new String[] {
4 "publish_stream", "read_stream", "offline_access","user_photos" };
5
6
7 AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(mFacebook);
8 mFacebook.authorize(AAuthTestActivity.this,
9 PERMISSIONS, new LoginDialogListener());
10
11
12 //我是在完成登錄之后馬上就發布文字消息,這點大家可以靈活修改
13 private final class LoginDialogListener implements
14 com.facebook.android.Facebook.DialogListener {
15 public void onComplete(Bundle values) {
16 Log.e("FB Sample App", "LoginDialogListener.onComplete()");
17 refreshListView();
18 postToWall(values.getString(Facebook.TOKEN));
19 }
20
21 public void onFacebookError(FacebookError error) {
22 Log.d("FB Sample App", "LoginDialogListener.onFacebookError()");
23 }
24
25 public void onError(DialogError error) {
26 Log.d("FB Sample App", "LoginDialogListener.onError()");
27 }
28
29 public void onCancel() {
30 Log.d("FB Sample App", "LoginDialogListener.onCancel()");
31 }
32
33 private void postToWall(String string) {
34 Bundle params = new Bundle();
35 params.putString(Facebook.TOKEN, accessToken);
36 try {
37 params.putString("message", "Test!!!!");
38 mFacebook.request("me/feed", params, "POST");
39 } catch (FileNotFoundException e) {
40 e.printStackTrace();
41 } catch (MalformedURLException e) {
42 e.printStackTrace();
43 } catch (IOException e) {
44 e.printStackTrace();
45 }
46 }
47 }

  這里需要注意的是:PERMISSIONS 字符串,這里是在登錄授權時把哪些權限進行了說明,其中比如publish_stream為是否可以發布消息到塗鴉牆,read_stream為讀取塗鴉牆,user_photos為圖片相關的權限。(官方文件的詳細權限列表)

  五、 發布圖片到塗鴉牆(Wall)

  這是困擾我最久的問題。傳送圖片都不是問題,主要是如何把照片發布到塗鴉牆上去,如同新浪微博一樣——發送帶圖的微博,我們需要的是如何發送帶圖的文字信息到塗鴉牆上去。這里簡述一下上傳圖片幾個方法以及我最終的解決方法,主要是參考了網上的幾個帖子。

  我想要實現的效果:

  

  效果應該是:1這兒的文字消息用來告訴朋友我的這個軟件在哪兒可以找到。

        2這兒的圖片就是展示這個軟件最后做到了怎樣一個效果,用來吸引其他的用戶。

  第一種:

1 Bundle params = new Bundle();
2 params.putString("message", "Uploaded on!!!!!!");
3 params.putByteArray("picture", bytes); //bytes contains photo bytes, no problem here
4 asyncRunner.request("me/photos", params, "POST", new PostPhotoRequestListener(), null);

  產生的效果:我只是把圖片發送到了自己的相冊,塗鴉牆上也顯示了“某某把若干圖片加入到XX相冊”。但我想分享的文字消息在塗鴉牆上看不到,這就大大削弱了分享的效果。

  第二種:

1 Bundle params = new Bundle();
2 params.putString("message", "Uploaded on " + now());
3 params.putString("link", "http://i1114.photobucket.com/albums/k538/tom_rada/bota2.jpg");
4 asyncRunner.request("me/feed", params, "POST", new PostPhotoRequestListener(), null);

  產生的效果:可以在塗鴉牆看到文字與圖片,可是由於項目希望是本地上傳顯示,而不是利用連接顯示某一圖片,所以這個方案放棄。

  第三種:

1 Bundle params = new Bundle();
2 params.putString("message", "Uploaded on " + now());
3 params.putByteArray("picture", bytes); //bytes contains photo bytes, no problem here
4 asyncRunner.request("me/feed", params, "POST", new PostPhotoRequestListener(), null);

  產生的效果:利用me/feed接口其實只能展示文字,所以圖片完全不能上傳,失敗

  解決辦法:

 

 1 String wallAlbumID = null;
2 String response = facebook.request("me/albums");
3 JSONObject json = Util.parseJson(response);
4 JSONArray albums = json.getJSONArray("data");
5 for (int i =0; i < albums.length(); i++) {
6 JSONObject album = albums.getJSONObject(i);
7 if (album.getString("type").equalsIgnoreCase("wall")) {
8 wallAlbumID = album.getString("id");
9 Log.d("JSON", wallAlbumID);
10 break;
11 }
12 }
13
14 if (wallAlbumID != null) {
15 Bundle params = new Bundle();
16 params.putString("message", "Uploaded on " + now());
17 params.putByteArray("source", bytes);
18 asyncRunner.request(wallAlbumID+"/photos", params, "POST", new PostPhotoRequestListener(), null);
19 }

  產生的效果:其實我們在facebook網頁上直接發送帶圖文字消息,FB將圖片放在了一個type屬性是wall的特定相冊中,所以我們的思路是找的這個相冊,然后上傳圖片加文字消息,這樣塗鴉牆上就可以完整地顯示我們的文字加圖片的消息。但是這里也存在一個隱患,如果用戶從來沒有發不過帶圖文字消息的話,相冊中就不會有wall這個相冊,所以接下來要做的就是新建這么一個相冊,在傳入圖片,這里就不再贅述。

  最后希望對大家有所幫助,雖然知道國內開發這個FB的不多,重在分享么。有什么問題在下面留言啊。

  P.S.本來是有一篇關於利用(新浪、騰訊、開心、空間、豆瓣……)API發送消息這么一篇文章的,但是由於本人實在懶惰,所以一直放在草稿箱,沒有完成#_#,最近盡可能發布。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM