我已经使用以下代码进行Facebook身份验证,它运行正常,但是当我取消身份验证并尝试再次进行身份验证时,应用程序崩溃并且日志由以下引起:java.lang.UnsupportedOperationException: Session: an attempt was made to open an already opened session.
在调试时,我得到了这样的
{Session state:CREATED, token:{AccessToken token:ACCESS_TOKEN_REMOVED permissions:[]}, appId:xxxxxxxxxxxxxxx}
我该如何解决这个问题。请帮助我。提前谢谢
private void askFacebbokAuthentication() {
Session session = Session.getActiveSession();
if (session.isOpened()) {
facebook = true;
if (!hasPublishPermission()) {
session.requestNewPublishPermissions(new NewPermissionsRequest(
MyActivity.this, PERMISSIONS));
}
} else {
Session.OpenRequest openRequest = null;
openRequest = new Session.OpenRequest(MyActivity.this);
if (openRequest != null) {
openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS);
if (!hasPublishPermission()) {
openRequest.setPermissions(PERMISSIONS);
}
session.openForPublish(openRequest);
}
}
}
答案 0 :(得分:13)
我也有同样的问题,但我解决了这些问题。据我所知,我们无法请求已经打开的新权限的会话。
Session session = new Session(this);
Session.setActiveSession(session);
session.openForRead(new Session.OpenRequest(this).setCallback(callback).setPermissions(Arrays.asList("your_permissions")));
我希望您已在onActivityResult()
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
答案 1 :(得分:3)
如果Session既未打开也未关闭,我认为Session.openActiveSession()
更好此剪辑是从Facebook SDK示例项目SessionLoginSample,LoginUsingActivityActivity#onClickLogin()
复制粘贴的private void onClickLogin() {
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
} else {
Session.openActiveSession(this, true, statusCallback);
}
}
请注意,Session#openActiveSession()也会在底层创建一个Session,这是可以的。来自https://developers.facebook.com/docs/technical-guides/iossdk/session/#lifecycle:
会话只能打开一次。会话关闭时,它不能 被重新开放。相反,应该创建一个新会话。典型应用 只需要一次活动会话。 Facebook SDK 提供静态活动会话方法,负责打开新的 会话实例。