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

lub*_*ben 1 android facebook facebook-android-sdk

我在集成新的Facebook SDK 3.0 for Android的Feed对话框时遇到问题.文档非常清楚如何做到这一点,但省略了一个非常重要的案例,只是提到它几乎从未发生过.

Facebook Feed对话文档

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

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

所以流程是:

  1. 用户按下共享按钮.
  2. 他没有登录,因此没有会​​话访问令牌
  3. facebook.dialog() 启动并显示登录对话框
  4. 用户登录并共享其链接
  5. 他回到应用程序,但他仍然没有会话访问令牌,他没有登录到Facebook,虽然他在一分钟之前登录.

我的问题是,如何在步骤5中获取访问令牌(在某处确保创建)并在我的程序中使用它来创建有效的SDK 3.0 Session对象,以便用户在使用后可以使用Access Token进行有效的Session facebook对话框?

---编辑---

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

rig*_*ren 6

如果在Facebook类上设置打开的Session,则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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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