2011年4月10日 星期日

[轉載]在 Android AP 中整合 Facebook API

Facebook Developer 的官網對 Android 的開發文件,只能說是個 rough 的 Guide,這邊把過程中會遇到的問題分享一下,順便還解一下 Facebook SDK 裡一個明顯的 bug。(Facebook 怎麼可以沒什麼測就 release!)
  首先,你一定會參考 Facebook Developer 裡的 Android Guide,就照上面的步驟做就是了。
  上面說,
  1. 裝 Android SDK, Eclipse Plugin.  (...還用說嗎...)
  2. 裝 Git (這是個 Version Control 的軟體,像 SVN, CVS, VSS, 這類的...)
  3. 用 Git 抓 Facebook SDK Source Code.  (是的,它都寫好 library 了,當然用它的...)


  但...Git看起來...好像還要學一下才會用,很浪費時間。好在,逛著逛著發現 Git 有 Web版介面去 browse project,所以第2, 3 步,就免了,你可以在 https://github.com/search,查詢 "facebook-android-sdk" 找到它,然後點 "Download" 吧。
  好啦,你抓到 Facebook SDK了,在 android-facdebook-sdk/facebook 裡的,就是它的 sample code。我本來以為會有 jar 檔之類的 library,結果並沒有,只有 java。假設你已經會 Android 了,就先在 eclipse 開個自己的 android 專案吧,然後直接把 facebook/src 與 res copy 到自己的專案裡。如果你不會 Android,那......你好。官網是把 sample code 開成一個 project,然後自己的 project 去 refence sample code 的 project,這樣是比較好啦。我太懶,只想先試通,所以把它的 source code copy 到自己的 project 裡。
  接下來,是的,跟 guide 一樣,你要在 AndroidManifest.xml 裡,加上使用 INTERNET 的 permission。
  再來,小小麻煩,Facebook 當然不能隨便開個 web services 之類的讓任何程式隨便 post,Facebook 必須知道哪個程式在存取它的資料,所以…你必須先在 Facebook Developer 裡先登記一個應用程式,然後設定為 Android。再然後,你要拿你對 Android App 的簽章登記上去,目的是讓 Facebook 知道你這個 Android App 的存在,並且確保只有你這個 Android App 能代表你在 Facebook Developer 裡登記的這個。
  步驟大概是降:
  1. 在 Facebook Developer 裡 "建個新的應用程式"。

  2. 為 Android App 製作一個 key。參考: Android Sign for Public Release

  3. 用這個 key 簽在 Android App 包裝檔上 (*.apk)。這邊我是用 eclipse 的 Export Android Application 方式做的,指到上個步驟的 keystore 即可。

  4. export 這個 key 成一個 base64 編碼的 hash key。這邊你要先抓到 openssl binary,然後把 openssl/bin 設到 path 系統變數中。用 keytool -export 或 keytool -exportcert 指令,官網是寫 -exportcert,但我的 jdk 版本沒支援 -exportcert,所以用 -export。
  5. 在 Facebook Developer 建立的應用程式中,登記這個 hash key。

  接下來,就寫 code 啦,如果你要做 "po文到塗鴉牆" 的功能,會遇到 Facebook API 的 bug,一個 ClassCastException,你必須把 Util.java 的
  
  修正為,
 
  還有,類似 Android Permission 的概念,你要讓 user 知道這個程式要去寫東西到 Facebook,你要在參數中說明要用到哪些 Facebook Permission,參考 Facebook Permission 清單。所以要 po 文,String[] 中要再加個 "publish_stream"。
  以 po 到塗鴉牆來說,你要指定到 "me/feed"。
    facebook.request("me/feed", parameters, "POST");

  

沒有留言:

張貼留言