带有片段的Android FB API 3.0会话设置

时间:2012-10-24 09:28:21

标签: android facebook facebook-android-sdk

我正在使用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中执行。

1 个答案:

答案 0 :(得分:4)

所以看起来你已经解决了这个问题并且你的解决方法很好,但是我想在这里给出另一种选择,以防你或其他人更清楚地使用Fragment代替它。

如果您不能或不想从FacebookActivity派生,您可以使用Activity或Fragment来初始化Session。 Activity和Fragment都有你可以覆盖的onActivityResult,而使用的那个取决于你传递什么来初始化Session.OpenRequest。

因此,如果您希望回调来到Fragment,您可以调用:

...new Session.OpenRequest(myFragment)...

然后覆盖片段中的onActivityResult并将调用转发给您的会话。

这有点好,因为你的Fragment不再需要具备它正在运行的Activity的特殊知识。