我有一个SettingsActivity
,其中有几个选项,包括寻找Facebook好友和退出。因此,当用户选择找到她的Facebook好友时,她将被发送到另一个活动,我让她使用她的Facebook帐户登录并保存她的访问令牌。然后,当她选择退出时,她的访问令牌将被清除。问题是,我的logout
方法与我创建会话的方法没有写在同一个活动中,所以当我尝试这个时:
Session session = Session.getActiveSession();
if (!session.isClosed()) {
session.closeAndClearTokenInformation();
}
Logcat积分NullPointerException
。然后我试了一下:
Session.setActiveSession(null);
这也不起作用(之前登录的用户的朋友仍然显示,而不是要求新用户登录)。
那么我应该怎么做才能清除获得的令牌呢?提前谢谢。
- 编辑 -
我认为我用来打开会话的活动有问题。我跟着Facebook的GraphAPISample,这就是我所做的:
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;
}
}
当我尝试在Toast
中放置createSession()
来检查已创建的activeSession
的状态时,它始终显示会话已关闭。这很奇怪,因为showFriends()
方法仍然被触发,即使我再次删除并安装应用程序后,它仍会显示相同的朋友列表。我真的很困惑。
答案 0 :(得分:7)
在 Facebook SDK v4 中,我们可以使用
注销LoginManager.getInstance().logOut();
请注意,不要忘记像这样初始化sdk
FacebookSdk.sdkInitialize(getApplicationContext());
答案 1 :(得分:2)
使用Facebook SDK v4
,您可以执行以下操作:
if (AccessToken.getCurrentAccessToken() != null) {
LoginManager.getInstance().logOut();
}
您可以查看LoginManager
课程。
答案 2 :(得分:1)
这样做
try {
Session.getActiveSession().closeAndClearTokenInformation();
} catch (Throwable e) {
e.printStackTrace();
}
答案 3 :(得分:1)
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 :(得分:1)
在facebook集成android中尝试使用以下代码清除会话。
在您的活动中添加以下方法,并在登录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
}
}
对我而言,它的工作...... 希望这对你有帮助......
答案 5 :(得分:0)
您应该通过 Parcelable 界面传递会话变量并清除会话 那个会话变量。 通过这样的facebook会话:Passing a Facebook session across activities