Facebook SDK:为什么Profile.getCurrentProfile()总是第一次返回null?

时间:2015-05-24 15:54:54

标签: android facebook sdk facebook-login

我正在使用Facebook SDK中提供的LoginButton类在我的Android应用中实现Facebook登录。 按照说明here后,一切都有效。我在我的应用程序中做的唯一不同的是,我在片段上添加了登录按钮,而不是活动本身,以避免使用大量代码污染登录活动。 但这是一个问题: 我想获取用户的公开个人资料信息。我使用Profile.getCurrentProfile()调用来做到这一点。这是完整的代码:

// Called in onCreate:
    private void attemptLogin() {

            mCallbackManager = CallbackManager.Factory.create();
            FacebookCallback<LoginResult> mFacebookCallback = getFacebookCallback();
            mLoginButton.registerCallback(mCallbackManager, mFacebookCallback);
        }

mFacebookCallback代码是这样的:

private FacebookCallback<LoginResult> getFacebookCallback() {
        return new FacebookCallback<LoginResult>() {

                @Override
                public void onSuccess(LoginResult loginResult) {

                    mProfileTracker = new ProfileTracker() {

                        @Override
                        protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {

                            if (currentProfile != null && oldProfile != null) {
                                mProfile = currentProfile;
                                // Get the new email and fire the home page of the activity, when email is available
                                requestUserEmail();
                            }

                            mProfileTracker.stopTracking();

                        }
                    };

                    mProfileTracker.startTracking();

                    if (null != loginResult.getAccessToken()) {

                        String userId = loginResult.getAccessToken().getUserId();

                        Log.d(TAG, "Successfully Logged-In to Facebook");
                        Toast.makeText(getActivity(), "Logged-In to Facebook:" + userId, Toast.LENGTH_SHORT).show();


                        mProfile = Profile.getCurrentProfile();

                        // Now that login is successful, email can be requested
                        requestUserEmail();
                    }

                }

                @Override
                public void onCancel() {
                    // App code
                    Log.d(TAG, "Cancelled Log-In to Facebook");
                    Toast.makeText(getActivity(), "Cancelled Log-In to Facebook", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onError(FacebookException exception) {
                    // App code
                    Log.d(TAG, "Error while Logging-In to Facebook");
                    Toast.makeText(getActivity(), "Error while Logging-In to Facebook", Toast.LENGTH_SHORT).show();
                }

            };
    }

我获得了AccessToken甚至是电子邮件。但是对于应用程序的第一次安装,Profile.getCurrentProfile()始终返回null。

我还观察到onCurrentProfileChanged()永远不会被调用,因为我希望在第一次进行登录尝试时调用它。我不确定onCurrentProfileChanged()相关代码是否应在onSuccess()范围内。但是根据问题here,人们似乎有更多的运气。

我在这里做错了什么?我需要做些什么来确保我在第一时间获得个人资料信息?

1 个答案:

答案 0 :(得分:1)

经过几分钟的调试后,我发现了一个明显的问题。在下面的代码中:

if (currentProfile != null && oldProfile != null) {
    mProfile = currentProfile;
   // Get the new email and fire the home page of the activity, when email is available
   requestUserEmail();
}

第一次,oldProfile始终为null。因此,mProfile永远不会设置为当前配置文件。

其次,我不确定它是否有所作为,但改变了

mLoginButton.setReadPermissions(Arrays.asList("user_friends", EMAIL));

mLoginButton.setReadPermissions(Arrays.asList("public_profile", "user_friends", EMAIL));

可能有所帮助。

另外,只是为了完成,只需在requestUserEmail()中填写一次电子邮件(在这种情况下就致电onCurrentProfileChanged功能)就足够了