我正在使用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,这样做似乎使人们更加幸运。

我在这里做错了什么?我需要怎么做才能确保我第一次获得个人资料信息?

最佳答案

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

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函数)就足够了

09-10 06:11
查看更多