我正在使用FB API 3.0 for Android,我正在尝试以正确的方式设置会话。
但是,似乎我做错了什么,或者说我错过了什么。在我的启动器活动中,我检查是否已有会话,如果它不存在,我创建一个新会话(如FB示例所示):
Settings.addLoggingBehavior(LoggingBehaviors.INCLUDE_ACCESS_TOKENS);
Session session = Session.getActiveSession();
if (session != null){
String sesija = session.toString();
Log.w ("ss", sesija);}
if (session == null) {
if (savedInstanceState != null) {
session = Session.restoreSession(this, null, MyGlobals.INSTANCE.statusCallback, savedInstanceState);
Log.w("No Session found", "Loading saved session as it exists");
}
if (session == null) {
session = new Session(this);
Log.w("No Session found", "CreatingNewSession");
String sesija2 = session.toString();
Log.w ("ss2", sesija2);
}
Session.setActiveSession(session);
if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
session.openForRead(new Session.OpenRequest(this).setCallback(MyGlobals.INSTANCE.statusCallback));
Log.w("There is an active session", "Active Session Exists");
}
}
此时我的日志说明了这一点:
10-24 09:11:52.284: W/ss(1404): {Session state:CREATED, token:{AccessToken token: permissions:[}, appId:xxxxxx}
(AppId是正确的)
然后在我的片段中,我尝试使用以下代码登录到Facebook:
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
Log.w("Session is not opend", "Session is not closed");
session.openForRead(new Session.OpenRequest(getActivity()).setCallback(MyGlobals.INSTANCE.statusCallback));
} else {
Session.openActiveSession(getActivity(), true, MyGlobals.INSTANCE.statusCallback);
Log.w("Open Active Session", "Status Callback");
}
此时,FB webview出现,我设置了用户名并通过,它有点工作,然后消失。
现在,我有点无处可去,我没有看到回复和TOKEN回复,如果我再次点击登录(在同一个按钮上)我的应用程序崩溃了。
在日志中我有这个:
10-24 09:12:31.944: W/ss(1404): {Session state:OPENING, token:{AccessToken token: permissions:[}, appId:xxxxxx}
如果我将它与FB提供的SessionLoginExample进行比较,我就到了那里:
10-24 09:08:50.004: W/ss(1356): {Session state:OPENED, token:{AccessToken token:AAAFaKtb7Pg4BALYg4B5eosa0ZAE9ZAXB0ZBMFDJdNbsDsZAkGJUfKtGs71OEJikDxT2VBfo4QMXiNASz23ZAa6D76eUxW0mZAMa013HP2kxgZDZD permissions:[}, appId:xxxxxxx}
意思是我做错了,因为我没有捕获返回的AccessToken,并且没有正确保存。
我认为这是错误的,但我不明白我应该如何以正确的方式阅读会话信息,或者说在片段中捕获和保存令牌信息的位置。
我试图放入片段:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Boolean session = Session.getActiveSession().onActivityResult(getSherlockActivity(), requestCode, resultCode, data);
}
因为这是示例中的“onActivityResult”,但似乎它什么也没做。
总结一下: 我在启动器活动后面创建会话。然后,如果没有安装FB应用程序,则在Tab4(设置)上,用户应该能够使用webview登录到FB。然后在Tab1和Tab2上,用户应该可以像在Instagram上一样将图像分享到FB。 如果安装了应用程序,我将禁用选项卡4,并让用户使用Tab1和Tab2共享FB应用程序。
TNX。
解决: 从未写过但应该众所周知的事情。执行FB身份验证时,必须执行“On Activity Result”代码以使用会话保存令牌。 但是,如果您正在处理Fragments和Tabs,就像我一样,函数“onActivityResult”永远不会在Fragment代码中执行,但必须在处理片段/标签的Activity中执行。
答案 0 :(得分:4)
所以看起来你已经解决了这个问题并且你的解决方法很好,但是我想在这里给出另一种选择,以防你或其他人更清楚地使用Fragment代替它。
如果您不能或不想从FacebookActivity派生,您可以使用Activity或Fragment来初始化Session。 Activity和Fragment都有你可以覆盖的onActivityResult,而使用的那个取决于你传递什么来初始化Session.OpenRequest。
因此,如果您希望回调来到Fragment,您可以调用:
...new Session.OpenRequest(myFragment)...
然后覆盖片段中的onActivityResult并将调用转发给您的会话。
这有点好,因为你的Fragment不再需要具备它正在运行的Activity的特殊知识。