简体   繁体   中英

Error OAuthException 2500 while posting with facebook graph api

I'm writting app integrated with facebook. I want to post to wall without post dialog. I try to use code from this answer , but I got an error

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

I login user with this code

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

Please, explain me what am I doing wrong?

[ADDED]

If I try to post with mFacebook.dialog(currentActivity, "stream.publish", params, new UpdateStatusListener()); it works. Please, help me!

A successful authorization would return an access token to your app, which you can then use to perform actions to the Facebook API. The error message displayed means you do not have a valid access token which means you probably did not authenticate the app correctly. I would put some logging on the onFacebookError and onError methods to see what the problem is.

Oh, I've done it. But it looks like a bug or magic... LogCat after authorize method (Facebook's log is enabled)

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

But then I try post with

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

Function request from 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);
}

I see in debugger, that Facebook's function isSessionValid() returns false and mAccessToken = null . I don't know why it is so, and why it returns true sometimes afterwards (yes, I understand that it is impossible). Explaine me, please, if you know.

This code solved my problem (it just re-sets access token)

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);
}

I also had the same problem while retrieving albums from facebook. I tested my access_token via facebook debugger and it was valid. Then I found the error, the final url in com.facebook.android.Util.openUrl(...) was:
Invalid-URL1:
https:// graph.facebook.com//me/albums?fields=id,name,cover_photo,type,count?access_token={...token..}&format=json&metadata=1
Where it should be:
Valid - URL2:
https:// graph.facebook.com//me/albums?fields=id,name,cover_photo,type,count&access_token={...token..}&format=json&metadata=1

Note that in URL1 ? is added two times which is not valid so I changed the code as follows
Code Changes: Previous

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

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

Now

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM