2012-10-17 115 views
1

我寫的應用程序與facebook集成。我想發佈到牆上沒有發佈對話框。我嘗試使用code from this answer,但我得到了一個錯誤錯誤OAuthException 2500同時發佈與Facebook圖表API

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

我登錄的用戶使用此代碼

public void authorize() { 
    mFacebook.authorize(mActivity, new String[] { "publish_stream" }, new DialogListener() { 
     @Override 
     public void onComplete(Bundle values) { 
      SharedPreferences.Editor editor = mPrefs.edit(); 
      editor.putString("access_token", mFacebook.getAccessToken()); 
      editor.putLong("access_expires", mFacebook.getAccessExpires()); 
      editor.commit(); 

      mLoginStateView.setImageResource(mAuthorizedDrawableRes); 
     } 

     @Override 
     public void onFacebookError(FacebookError error) {} 

     @Override 
     public void onError(DialogError e) {} 

     @Override 
     public void onCancel() {} 
    }); 
} 

請解釋我什麼我做錯了?

[加]

如果我嘗試後與mFacebook.dialog(currentActivity, "stream.publish", params, new UpdateStatusListener());它的工作原理。請幫幫我!

+0

也許我需要的任何其他權限? – ziwert

回答

1

哦,我已經完成了。但它看起來像一個bug或者魔法......之後 logcat的授權方法(Facebook的記錄被激活)

Facebook-authorize: Login Success! access_token=AAAHL4f6XMS0BAHNJKpoGAUAeGDlynRt1s5XPdBPRWGfILGOTZB4OSEGi4HBPLZBXDWqK2RIO8disDtzxHBYSvL3bZAnHkU5hAVK9oqWhAZDZD expires=1356040438476 

但後來我嘗試後與

String response = mFacebook.request("me/feed", parameters, "POST"); 

功能要求從Facebook.java:

public String request(String graphPath, Bundle params, String httpMethod) 
     throws FileNotFoundException, MalformedURLException, IOException { 
params.putString("format", "json"); 
if (isSessionValid()) { 
    params.putString(TOKEN, getAccessToken()); 
} 
String url = (graphPath != null) ? GRAPH_BASE_URL + graphPath : RESTSERVER_URL; 
return Util.openUrl(url, httpMethod, params); 
} 

我在調試程序看,Facebook的功能isSessionValid()返回falsemAccessToken = null。我不知道爲什麼會這樣,爲什麼有時候會返回true(是的,我知道這是不可能的)。請告訴我,如果你知道的話。

此代碼解決我的問題(它只是重新設置訪問令牌)

if (!mFacebook.isSessionValid()){ 
    String token = mPrefs.getString("access_token", null); 
    long expires = mPrefs.getLong("access_expires", 0); 
    mFacebook.setAccessToken(token); 
    mFacebook.setAccessExpires(expires); 
} 
Bundle parameters = new Bundle(); 
parameters.putString("message", msg); 
parameters.putString("description", "test test test"); 
String response = mFacebook.request("me/feed", parameters, "POST"); 
if (response == null || response.equals("") || response.equals("false")) { 
    Log.e(Const.LOG_TAG, "Blank response"); 
} else { 
    Log.d(Const.LOG_TAG, response); 
} 
+0

您在'if(!mFacebook.isSessionValid())'中編寫的代碼應該在您的'onCreate'方法。 –

+0

噢,你再次=),我明白了爲什麼'mAccessToken'不是'null'之後:我把它設置在其他一些我的功能...我掩蓋了我的bug非常好! =) – ziwert

1

成功的授權會將訪問令牌返回給您的應用,然後您可以使用該令牌對Facebook API執行操作。顯示的錯誤消息意味着您沒有有效的訪問令牌,這意味着您可能未正確驗證應用程序。我會對onFacebookErroronError方法進行一些記錄,以查看問題所在。

+0

感謝您的建議,我會嘗試登錄。但是,如果我沒有正確驗證應用程序,爲什麼我可以使用「標準」Facebook對話框發佈到牆上? – ziwert

+0

你說得對。但我不明白:我收到一個正確的訪問令牌,爲什麼它是空的,然後我嘗試發佈... – ziwert

1

我也有同樣的問題,而從Facebook獲取專輯。我通過facebook debugger測試了我的access_token,它是有效的。然後我發現了錯誤,在com.facebook.android.Util.openUrl(...)最後的網址是:
無效-URL1:
https://開頭graph.facebook.com//me/albums?fields=id,name,cover_photo,type,count? =的access_token {...令牌..} &格式= JSON &元= 1
凡應該是:
合法 - URL2:
https://開頭graph.facebook.com//me/albums? fields = id,name,cover_photo,type,count & access_token = {... token ..} & format = json & metadata = 1

請注意,在URL1?加兩次是無效的,所以我改變了代碼如下
代碼更改: 上一頁

com.facebook.android.Util.openUrl(...) 

    if (method.equals("GET")) { 
     url = url + "?" + encodeUrl(params); 
    } 

現在

com.facebook.android.Util.openUrl(...) 

    if (method.equals("GET")) { 
     if(url.contains ("?")==false) 
     { 
      url = url + "?" + encodeUrl(params); 
     } 
     else 
     { 
      url = url + "&" + encodeUrl(params); 
     } 
    } 
相關問題