1

我在集成新的 Android 版 Facebook SDK 3.0 的提要对话框时遇到问题。该文档非常清楚如何做到这一点,但是省略了一个非常重要的案例,只是提到它好像它几乎永远不会发生。

Facebook 提要对话框文档

当用户想要发布一些东西,但他还没有登录并且没有会话和访问令牌时,就会出现这种情况。

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

所以流程是:

  1. 用户按下分享按钮。
  2. 他没有登录,所以没有会话访问令牌
  3. facebook.dialog()启动并显示登录对话框
  4. 用户登录并分享他的链接
  5. 他回到了应用程序,但他仍然没有会话访问令牌,并且他没有登录到 facebook,尽管他在一分钟前登录了。

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

- - 编辑 - -

我只是想澄清一下,当手机上没有安装本机 facebook 应用程序时,我猜会使用 webview 对话框。

4

1 回答 1

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);
            }
        }
    }
}

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

于 2012-11-02T03:22:50.803 回答