1

我正在编写与 facebook 集成的应用程序。我想在没有帖子对话框的情况下发布到墙上。我尝试使用此答案中的代码,但出现错误

{"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());它发布。请帮我!

4

3 回答 3

1

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

于 2012-10-17T19:54:51.953 回答
1

从 facebook 检索专辑时,我也遇到了同样的问题。我通过facebook 调试器测试了我的 access_token ,它是有效的。然后我发现了错误,最终的 urlcom.facebook.android.Util.openUrl(...)是:
Invalid-URL1:
https://graph.facebook.com//me/albums?fields=id,name,cover_photo,type,count?access_token={...token ..}&format=json&metadata=1
应该在哪里:
有效 - URL2:
https://graph.facebook.com//me/albums?fields=id,name,cover_photo,type,count&access_token={...token. .}&格式=json&元数据=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);
        }
    }
于 2012-12-17T20:05:27.587 回答
1

哦,我已经做到了。但它看起来像一个错误或魔法......授权方法后的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);
}
于 2012-10-22T13:25:28.520 回答