使用facebook图表api发布时出现OAuthException 2500错误

时间:2012-10-17 14:37:16

标签: android facebook facebook-graph-api

我正在撰写与facebook集成的应用。我想在没有帖子对话的情况下发布到墙上。我尝试使用code from this answer,但我收到了错误

{"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() {}
    });
}

请解释一下我做错了什么?

[ADDED]

如果我尝试使用mFacebook.dialog(currentActivity, "stream.publish", params, new UpdateStatusListener());发帖,那就有效了。拜托,帮助我!

3 个答案:

答案 0 :(得分:1)

成功授权会向您的应用返回访问令牌,然后您可以使用该令牌对Facebook API执行操作。显示的错误消息表示您没有有效的访问令牌,这意味着您可能没有正确验证应用程序。我会对onFacebookErroronError方法进行一些登录,以查看问题所在。

答案 1 :(得分: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);
}

答案 2 :(得分: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={...token..}&format=json&metadata=1
它应该在哪里:
有效 - 网址2:
 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);
        }
    }