Android - Clear Facebook access token

2020-03-30 04:32发布

I have a SettingsActivity where there are several options including finding Facebook friends and logging out. So when a user chooses to find her Facebook friends, she will be sent to another activity where I let her logging in with her Facebook account and save her access token. And then when she chooses to log out, her access token will be cleared. The problem is, my logout method is not written in the same activity with the one I created the session, so when I tried this:

    Session session = Session.getActiveSession();
    if (!session.isClosed()) {
        session.closeAndClearTokenInformation();
    }

Logcat points NullPointerException. Then I tried:

Session.setActiveSession(null);

And that doesn't work either (friends of the user logged in earlier are still shown, instead of asking the new user to log in).

So what should I do to clear the obtained token? Thank you in advance.

-EDIT-

I think there's something wrong with the activity which I use to open the session. I followed Facebook's GraphAPISample and this is what I have done:

public class FacebookFriendsActivity extends FragmentActivity{
    private BroadcastReceiver broadcast;
    public static Session session;
    private boolean pendingRequest;
    static final String PENDING_REQUEST_BUNDLE_KEY = "PendingRequest";

    private DatabaseHandler db;
    private FindFacebookFriends task;
    private ProgressBar progress;
    private TextView text;
    private Button retryBtn;
    private ListView userLayout;
    private ArrayList<User> userList;
    private FollowAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.facebook_friends);
        // ... set views 

        session = createSession();
        Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);

        showFriends();
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (session.onActivityResult(this, requestCode, resultCode, data) &&
                pendingRequest &&
                session.getState().isOpened()) {
            showFriends();
        }
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        pendingRequest = savedInstanceState.getBoolean(PENDING_REQUEST_BUNDLE_KEY, pendingRequest);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putBoolean(PENDING_REQUEST_BUNDLE_KEY, pendingRequest);
    }

    private void showFriends(){
        task = new FindFacebookFriends();
        task.execute(session.getAccessToken());

    }

    private Session createSession() {
        Session activeSession = Session.getActiveSession();
        if (activeSession == null || activeSession.getState().isClosed()) {
            activeSession = new Session.Builder(this).setApplicationId(getString(R.string.fb_app_id)).build();
            Session.setActiveSession(activeSession);
            new SaveFacebookId().execute(activeSession.getAccessToken());
        }

        return activeSession;
    }
}

When I try putting a Toast in createSession() to check the state of the created activeSession, it always shows that the session is closed. It's weird because the showFriends() method is still triggered and even after I delete and install the app again, it still show the same friend list. I'm really confused here.

6条回答
可以哭但决不认输i
2楼-- · 2020-03-30 04:46

Do like this

try {
Session.getActiveSession().closeAndClearTokenInformation();
} catch (Throwable e) {
e.printStackTrace();
}
查看更多
成全新的幸福
3楼-- · 2020-03-30 04:49
private Session.StatusCallback statusCallback = new SessionStatusCallback();

logout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Session.openActiveSession(this, true, statusCallback);  
}
});

private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state,
Exception exception) {
session.closeAndClearTokenInformation();    
}
}
查看更多
家丑人穷心不美
4楼-- · 2020-03-30 04:51

in Facebook SDK v4 we can log out using

LoginManager.getInstance().logOut();

note that don't forget to initialize sdk like this

FacebookSdk.sdkInitialize(getApplicationContext());
查看更多
戒情不戒烟
5楼-- · 2020-03-30 04:56

You should pass session variable through Parcelable interface and clear session through that session variable. Pass facebook session like this : Passing a Facebook session across activities

查看更多
贼婆χ
6楼-- · 2020-03-30 05:00

Using Facebook SDK v4 you can do the following:

if (AccessToken.getCurrentAccessToken() != null) {
    LoginManager.getInstance().logOut();
}

You can take a look at the LoginManager class.

查看更多
可以哭但决不认输i
7楼-- · 2020-03-30 05:00

Try this below code for session clear in facebook integration android.

Put below method in your activity and call before the login to facebook.

public static void fbClearToken(Context context) {
    Session session = Session.getActiveSession();
    if (session != null) {

        if (!session.isClosed()) {
            session.closeAndClearTokenInformation();
            //clear your preferences if saved
        }
    } else {
        session = new Session(context);
        Session.setActiveSession(session);

        session.closeAndClearTokenInformation();
            //clear your preferences if saved
    }

}

For me it's working... Hope this is helpful for you...

查看更多
登录 后发表回答