Android 2.3 使用Facebook API

這幾天為了寫一個在Android 手機上調用Facebook API ,沒想到一個看起來很簡單的動作,卻整整折磨我三天的時間。在這裡大概說明一下是什麼原因。

話說我寫了一個GoogleMap搭配Facebook打卡的程式,在模擬器的環境都跑的好好的,於是我就很興奮把程式裝到我的手機上面,結果出現了一個錯誤訊息。

{
   "error": {
      "message": "An active access token must be used to query information about the current user.",
      "type": "OAuthException"
   }
}

看到這個訊息第一個想法就是,沒有授權,但是想了想,不對如果沒有授權那為什麼模擬器上面就不會,於上就在Google上面查了一整天,想當然的是沒有答案。就在我想不出為什麼的時候我突然發現我的模擬器的版本是2.1的,於是也沒什麼其他辦法了,只好試試看是不是模擬器害我的,於是就把模擬器的版本換成跟我手機(Android 2.3)一樣,結果程式一樣不能用,但是錯誤訊息卻不一樣了,但是這總是好事,畢竟可以直接在模擬器上模擬就是一個好事。

由於實體機器和模擬器 Android 3.2版的系統都沒辦法使用,首先我當然懷疑了一下是不是Facebook提供的SDK沒辦法用在Android 3.2上面,是有BUG還是怎樣,打開DDMS查了log竟然看到以下的錯誤訊息。【 Login failed: com.facebook.android.DialogError: The connection to the server was unsuccessful.】這個訊息和手機的環境回傳的訊息不太一樣,照慣例還是一找了一下Google大神,但是一樣沒有結果,這兩次的折磨告訴我一件事,我以前常說不會寫去Google一下就好了是騙人的。

這下我真的有點沒頭緒了,在不知道該怎麼辦的同時,我按了一下模擬器上面的瀏覽器,結果網路不通,哇賽,我在模擬器寫半天結果卻沒有發現網路不通,那呼叫的到Facebook的API才真的有鬼了,不過Google也在這時發揮了它的作用,原來Android 3.2版本的模擬器預設網路是沒有開啟的。如果要開啟網路必須要在模擬器環境加上 【GSM modem support】(如下圖),如果這樣網路在不通,那就要去設定模擬器的DNS資訊,
【Run -> Run Configurations -> Android Appliccation -> Project名稱 -> Target -> Additional Emulator Command Line Options】填上 -dns-server 8.8.8.8,8.8.4.4,並且關掉模擬器重新啟動就好了。





別急還沒完,不然也不會搞我這麼多天了,好不容易把模擬器上的環境都弄到跟手機一樣,錯誤訊息也一樣了,終於可以好好的Debug了,不過我並想要說我怎們找到這個BUG的,好好的運用DDMS,相信你也可找到,但是我既然找到了,那我就公佈出來好了。網路上有提供一個Facebook登入的Sample我就是用那個來開發的,我發現手機如果有登入過後,下次再開啟,由於Facebook有提供跨站單一登入(single sign-on),下面的語法在Android 3.2卻變成一個BUG,因為會取不到需要的Access_Token,但是會判斷已登入,其實偷懶的話只要學我利用它提供的Method判斷有沒有Token,如果沒有再讓它再去取一次,這個問題就會解決了。

FaceBook.java

public void authorize(Activity activity, String[] permissions,
            int activityCode, final DialogListener listener) 
{
    if (!singleSignOnStarted) 
    {
       startDialogAuth(activity, permissions);      
    }
}


FaceBook.java 調整成以下語法

public void authorize(Activity activity, String[] permissions,
            int activityCode, final DialogListener listener) 
{
    if (!singleSignOnStarted || getAccessToken() == null) 
    {
       startDialogAuth(activity, permissions);      
    }
}
還有我在這裡並不另外解釋怎麼把寫好的程式放到Facebook上面認證,有興趣的請參考本文最下方網址已經有很多人有精闢的解說。
相關連結
Android 使用 Facebook步驟 & 簡介
http://lp43.blogspot.com/2011/07/apkfacebook.html?m=1
http://gonex45.dyndns-web.com/wordpress/?p=5
http://www.cnblogs.com/wangkewei/archive/2011/01/14/1935767.html
http://blog.xuite.net/elvischwang/develop/43255421
http://changyy.pixnet.net/blog/post/29201245-android-%E9%96%8B%E7%99%BC%E6%95%99%E5%AD%B8%E7%AD%86%E8%A8%98---%E4%BD%BF%E7%94%A8-facebook-sdk

取得Access Token的方法
http://www-oliver.blogspot.com/2010/11/accesstoken.html
http://www.died.tw/2010/11/facebook-c-sdk-authentication.html


Graph API
http://developers.facebook.com/docs/reference/api/


讀取JSON數據(JSONObject和JSONArray)
http://tangshanxj.blog.163.com/blog/static/30113717201010282318941/


客製化ListView
http://ysl-paradise.blogspot.com/2011/04/listview-i.html


本文附件 :
Facebook SDK.zip

留言