Facebook SDK 3.0 for Android - 如何将旧的Facebook.Dialog与新的Session机制集成

时间:2012-10-31 12:38:47

标签: android facebook facebook-android-sdk

我在整合新的Facebook SDK 3.0 for Android的Feed对话框时遇到问题。文档非常清楚如何做到这一点,但省略了一个非常重要的案例,只提到它几乎不会发生。

Facebook Feed Dialog Documentation

当用户想要发布内容时,就是这种情况,但他尚未登录,并且没有会话和访问令牌。

SDK提供了一种在旧的Facebook对象中设置访问令牌(和整个会话)的方法,但是在用户登录并通过Feed发布其Feed后,我找不到获取会话或访问令牌的方法对话框。

所以流程是:

  1. 用户按下共享按钮。
  2. 他没有登录,因此没有会​​话访问令牌
  3. 启动
  4. facebook.dialog()并显示登录对话框
  5. 用户登录并分享他的链接
  6. 他回到应用程序,但他仍然没有会话访问令牌,他没有登录到Facebook,虽然他在一分钟之前登录。
  7. 我的问题是,如何在步骤5中获取访问令牌(在某处确保创建)并在我的程序中使用它来创建有效的SDK 3.0 Session对象,以便用户可以使用Access进行有效的Session使用facebook对话框后的令牌?

    ---编辑---

    我只是想澄清一下,当手机上没有安装原生Facebook应用程序时 - 因此我想使用webview对话框。

1 个答案:

答案 0 :(得分:6)

如果在Facebook类上设置已打开的会话,则dialog()不应提示用户登录。

以下是一个例子:

public class MainActivity extends Activity {
    boolean pendingShare;
    Session session;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        if (savedInstanceState != null) {
            pendingShare = savedInstanceState.getBoolean("pendingShare");
            session = Session.restoreSession(this, null, new SessionCallback(), savedInstanceState);
        }

        ((Button) findViewById(R.id.share_button)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onClickShare();
            }
        });
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean("pendingShare", pendingShare);
        Session.saveSession(session, outState);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (session != null) {
            session.onActivityResult(this, requestCode, resultCode, data);
        }
    }

    private void onClickShare() {
        pendingShare = true;
        session = new Session(MainActivity.this);
        session.openForRead(new Session.OpenRequest(MainActivity.this).setCallback(new SessionCallback()));
    }

    private void share(Session session) {
        Facebook facebook = new Facebook(session.getApplicationId());
        facebook.setSession(session);
        facebook.dialog(this, "feed", null);
        pendingShare = false;
    }

    class SessionCallback implements Session.StatusCallback {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if (state.isOpened() && pendingShare) {
                share(session);
            }
        }
    }
}

保存/恢复“pendingShare”(和会话)在这里非常有用,因为您可以在登录期间卸载Activity,这会记住在重新加载MainActivity时触发dialog()调用。