1

我在我的 Android 应用程序中使用 Facebook 和 Parse SDK。我按照教程进行 Facebook 登录和身份验证,根据会话状态是否OPENEDSession.StatusCallback. 在与 Parse 集成之前,该应用程序可以完美运行。

现在我遇到了一个问题。在onResume()主菜单片段的方法中,我添加了以下代码。

final Session session = Session.getActiveSession();

if(session != null && session.isOpened()) {
    Request meRequest = Request.newMeRequest(session, new Request.GraphUserCallback() {
    @Override
        public void onCompleted(GraphUser graphUser, Response response) {
            if(session == Session.getActiveSession()) {
                // Check if the session is same as usual 
                ParseFacebookUtils.logIn(graphUser.getId(), session.getAccessToken(), 
                        session.getExpirationDate(), new LogInCallback() {
                    @Override
                    public void done(ParseUser user, ParseException err) {
                        if (user == null) {
                            // The user wasn't saved.
                            System.out.println("User was not saved to Parse. ");
                        } else {
                            // The user has been saved to Parse.
                            System.out.println("User has successfully been saved to Parse.");
                            if (user.isNew()) {
                                // This user was created during this session with Facebook Login.                       
                                System.out.println("ParseUser created.");
                            } else {
                                // This user existed before.
                                System.out.println("User exists in Parse. Pull their values: " + user);
                            }
                        }
                    }
                });     
            }
        }
    });
    meRequest.executeAsync();
}

因此,当片段恢复并打开 Facebook 会话时,Facebook 用户将被添加到 Parse 数据库中,以便我可以在之后使用ParseUsertoputget数据。但是在使用 时会出现问题ParseFacebookUtils.logIn(),它会创建 Facebook 会话CLOSED并调用Session.StatusCallback,从而将可见片段切换回登录片段。

我整天都在处理这个问题,但找不到解决方案。我已在应用程序中添加了以下代码,但仍然无法正常工作。

Parse.enableLocalDatastore(this);
Parse.initialize(this, Application_id, Client_key);
ParseFacebookUtils.initialize(getString(R.string.facebook_app_id));

有没有办法来解决这个问题?我已阅读内容,但没有提供非常好的解决方案。提前致谢!

4

1 回答 1

2

我今天试图做同样的事情。我正在使用 facebook sdk 的 UiLifecycleHelper 进行 facebook 登录,发出图形 api 请求并将用户添加到 Parse db。这就是您提到的示例中的完成方式-我认为这有点过时了。

ParseFacebookUtils 处理会话,我们需要做的就是在其上调用 login 方法,进行图形 api 调用,获取电子邮件等用户数据并更新用户字段。

这是一些代码:

private void parseFacebookLogin(){
        ParseFacebookUtils.logIn(this, PARSE_FB_LOGIN_CODE, new LogInCallback() {
            @Override
            public void done(ParseUser user, ParseException err) {
                if (user == null) {
                    Log.d(tag, "Uh oh. The user cancelled the Facebook login.");
                } else if (user.isNew()) {
                    Log.d(tag, "User signed up and logged in through Facebook!");
                    Request.newMeRequest(ParseFacebookUtils.getSession(), graphUserCallback).executeAsync();
                } else {
                    Log.d(tag, "User logged in through Facebook!");
                }
            }
        });
    }

GraphUserCallback graphUserCallback = new GraphUserCallback() {
        @Override
        public void onCompleted(GraphUser user, Response response) {
            if (user != null){
                getUserDataFacebook(user);
                Log.d(tag, response.toString());
            }
        }
    };

private void getUserDataFacebook(GraphUser user){
//get user data here
}

在Facebook login上查看 Parse 的文档。

让我知道这是否适合您。

于 2015-01-21T19:14:11.553 回答