【问题标题】:Facebook SDK 3.0 for Android - how to integrate old Facebook.Dialog with new Session mechanismFacebook SDK 3.0 for Android - 如何将旧的 Facebook.Dialog 与新的 Session 机制集成
【发布时间】:2012-11-02 11:22:50
【问题描述】:

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

Facebook Feed Dialog Documentation

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

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

所以流程是:

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

我的问题是,如何在第 5 步中获取访问令牌(肯定是在某处创建的)并在我的程序中使用它来创建有效的 SDK 3.0 会话对象,以便用户可以拥有有效的带有访问权限的会话使用 facebook 对话框后的令牌?

--- 编辑 ---

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

【问题讨论】:

    标签: android facebook facebook-android-sdk


    【解决方案1】:

    如果您在 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() 调用。

    【讨论】:

    • 问题不在于 Facebook 类如何重用已经存在的 Session,恰恰相反——如果没有 Session 并且 Facebook 类(对话框)创建了一个,那么在 Session 之后如何使用它. Facebook.getSession() 不起作用,除非之前手动完成了 Facebook.setSession()。但事实并非如此。
    • 是的。如果您在登录之前调用 dialog(),则不会有任何令牌返回到手机,因此会强制用户输入名称/密码并且不会让用户保持登录状态。上面的示例旨在展示如何创建如果您在想要调用 dialog() 时还没有会话,则及时会话。用户体验与不先创建 Session 的情况相同或更好。
    猜你喜欢
    • 2023-03-18
    • 2014-08-27
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多