【问题标题】:Why Facebook Session state is always close?为什么 Facebook 会话状态总是关闭?
【发布时间】:2014-12-23 01:58:11
【问题描述】:

我想将 Facebook 登录功能添加到我的应用程序中。请注意:

  1. 我不想使用 Facebook 登录按钮小部件。
  2. 我将去年正常工作的代码(从我的其他项目)复制粘贴到我的新项目中。
  3. 我检查了Session页面,我想我没有问题。

唯一的区别是 Request.executeMeRequestAsync() hss 更改为 Request.newMeRequest()。我做了这个更改,但似乎我的会话总是关闭,尽管我可以看到 Session.setActiveSession(session); 方法通过项目调试运行。所以,真的不知道为什么session 在call() 方法中总是很接近。

任何想法将不胜感激。谢谢。

我的代码:

public class FacebookLogin extends FragmentActivity
{
    private static final String TAG = "FacebookLogin";

    private static final List<String> READ_PERMISSIONS =
            Arrays.asList("email", "user_about_me", "user_photos");
    //    private static final List<String> WRITE_PERMISSIONS = Arrays.asList("");


    private final Session.StatusCallback statusCallback = new Session.StatusCallback()
    {
        @Override
        public void call(final Session session, SessionState state, Exception exception)
        {
            if (session.isOpened())
            {
                // make request to the /me API
                Request request = Request.newMeRequest(session, new Request.GraphUserCallback()
                {
                    // callback after Graph API response with user object
                    @Override
                    public void onCompleted(GraphUser user, Response response)
                    {
                        if (user != null)
                        {
                            MyLog.d(TAG, "User name: " + user.getName() + "!, Login successfully :)");
                            MyLog.d(TAG, "User id: " + user.getId());
                            MyLog.d(TAG, "Access token is: " + session.getAccessToken());
                            MyLog.d(TAG, "Application id: " + session.getApplicationId());
                            MyLog.d(TAG, "JSON Object: " + user.getInnerJSONObject());

                            SpStorage.setKeyFacebook(FacebookLogin.this, session.getAccessToken());
                            SpStorage.setFacebookUserId(FacebookLogin.this, user.getId());

                            // erson person = parseJSON(user.getInnerJSONObject().toString());
                            // registerUser();

                            // Close activity
                            FacebookLogin.this.finish();
                        }
                    }
                });
                request.executeAsync();
            }
            else if (state.isClosed()) {
                MyLog.d(TAG, "Facebook session closed");
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        // Find device hash key (should not be used in production)
//        printHashKey();

        // start Facebook Login
        openActiveSession(this, true, statusCallback, READ_PERMISSIONS);
    }

    private static Session openActiveSession(Activity activity, boolean allowLoginUI,
            Session.StatusCallback callback, List<String> permissions)
    {
        Session.OpenRequest openRequest = new Session
                .OpenRequest(activity)
                .setPermissions(permissions)
                .setCallback(callback);
        Session session = new Session.Builder(activity).build();
        if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI)
        {
            Session.setActiveSession(session);
            session.openForRead(openRequest);
            return session;
        }

        return null;
    }
}

我在 logcat 中得到的: Facebook session closed

【问题讨论】:

  • 这是你的完整片段课程吗?您似乎没有覆盖 onActivityResult 方法并将其传递给会话,这对于进行登录至关重要。
  • 谢谢@MingLi。你是对的我忘了在我的活动中添加那个方法。请写下您的评论作为答案,然后我会接受它;)

标签: android facebook session facebook-graph-api


【解决方案1】:

您需要覆盖 Fragment 类中的 onActivityResult 方法并将其传递给会话以完成会话转换。

无论您是否使用 UiLifecycleHelper,这都需要发生。

【讨论】:

    【解决方案2】:

    您需要覆盖 onActivityResult 并将值传递给 facebook SDK。 来自 Facebook 的 SDK 文档:

    为确保会话设置正确,您的片段必须 覆盖片段生命周期方法:onCreate()、onResume()、 onPause()、onDestroy()、onActivityResult() 和 onSaveInstanceState() 并调用相应的 UiLifecycleHelper 方法。例如, 在 UiLifecycleHelper 对象中调用 onCreate() 方法创建 Facebook 会话,如果缓存的令牌是,则自动打开它 可用。

    【讨论】:

      【解决方案3】:

      最近 Facebook 正在使用 API V2.2,它已经删除了一些方法。 最近在 1 周之前,我做了一些获取用户信息的工作。 这可能会对您有所帮助。

      public void getProfileData(View button){
               Session activeSession = Session.getActiveSession();
               new Request(
                          activeSession,
                          "me",
                          null,
                          HttpMethod.GET,
                          new Request.Callback() {
                              public void onCompleted(Response response) {
                                  /* handle the result */
                                                       try
                                                          {   GraphObject go  = response.getGraphObject();
                                                              JSONObject  jso = go.getInnerJSONObject();
                                                              String name23   = jso.getString("name");
                                                              Log.e("Name  response",""+name23);
                                                              name = name23;
                                                              Toast.makeText(getApplicationContext(), "Name: " + name , Toast.LENGTH_LONG).show();
                                                         }
                                                          catch ( Throwable t )
                                                          {
                                                              t.printStackTrace();
                                                          }
                                   String name = response.toString();
                                   Log.e("Name  request",""+name);
                              }
                          }
                      ).executeAsync();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-28
        • 1970-01-01
        • 1970-01-01
        • 2012-01-15
        • 2017-09-15
        • 2010-09-28
        • 1970-01-01
        相关资源
        最近更新 更多