我正在使用Facebook登录,如“入门”文档中所述 - https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/
// start Facebook Login
Session.openActiveSession(this, true, new Session.StatusCallback() {
// callback when session changes state
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
// make request to the /me API
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
// callback after Graph API response with user object
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
TextView welcome = (TextView) findViewById(R.id.welcome);
welcome.setText("Hello " + user.getName() + "!");
}
}
});
}
}
});
使用此代码时Facebook识别用户(在Facebook应用程序中插入)并假设这是我要登录的用户。
让我们说我想让Facebook帐户用于用户的决定。 我怎么能这样做?
到目前为止我尝试过的事情:
1)执行用户登录,如下所示:
SessionTracker sessionTracker = new SessionTracker(activity, new StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
}
}, null, false);
if (sessionTracker.getSession() == null || sessionTracker.getSession().getState().isClosed()) {
sessionTracker.setSession(null);
Session session = new Session.Builder(activity).setApplicationId(activity.getString(R.string.fb_app_id)).build();
Session.setActiveSession(session);
}
final Session currentSession = sessionTracker.getSession();
if (!currentSession.isOpened()) {
Session.OpenRequest openRequest = null;
openRequest = new Session.OpenRequest(activity);
if (openRequest != null) {
openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS);
openRequest.setPermissions(Arrays.asList("email", "publish_actions"));
openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
openRequest.setCallback(new StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
Request.executeMeRequestAsync(currentSession, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
authListener.onCompleteAuthorization(user != null, user, currentSession.getAccessToken(), currentSession.getExpirationDate().getTime());
}
});
}
});
currentSession.openForPublish(openRequest);
这是第一次正常,但第二次被调用(假设用户登录我的应用程序后,想要用另一个Facebook帐户重新登录)它会记住最后一个登录用户。 !!即使卸载Facebook应用程序和我的应用程序!!!!
2)再次登录前调用相同的代码:
if (Session.getActiveSession() != null) {
Session.getActiveSession().closeAndClearTokenInformation();
}
它没有做任何事......
请帮助我了解如何清除所有以前的Facebook用户历史/缓存令牌,以实现以下行为: 每次用户执行Facebook登录 - Facebook将出现“输入电子邮件+密码”对话框...
提前感谢..
答案 0 :(得分:3)
首先,不要直接使用SessionTracker。它不是公共课,也不是直接消费的。
其次,如果您希望每次都弹出电子邮件/密码对话框,则需要禁用SSO登录。你可以看看SwitchUserSample里面有多个会话的方法,但这里有它的要点:
Session s = new Session(this);
Session.setActiveSession(s);
Session.OpenRequest request = new Session.OpenRequest(this);
request.setPermissions(...); // Note that you cannot set email AND publish_actions in the same request
request.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
request.setCallback(...);
s.openForRead(request);
一段时间之后,在回调中,您应该检查会话是否已打开,是否包含publish_actions权限,如果没有请求其他发布权限(请参阅Scrumptious示例以获取示例)。
最后,当用户注销时,像以前一样调用closeAndClearTokenInformation()方法。由于您现在正在强制执行对话框登录,因此它将按预期运行。