gpt4 book ai didi

android - Facebook SDK : Why does Profile. getCurrentProfile() 总是第一次返回 null?

转载 作者:行者123 更新时间:2023-11-30 02:08:31 25 4
gpt4 key购买 nike

我正在使用 Facebook SDK 中提供的 LoginButton 类在我的 Android 应用程序中实现 Facebook 登录。按照说明进行操作后一切正常here .我在我的应用程序中做的唯一不同的事情是,我在 fragment 上添加了登录按钮而不是 Activity 本身,以避免用大量代码污染登录 Activity 。但这里有一个问题:我想获取用户的公开个人资料信息。我使用 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 始终为空。因此,mProfile 永远不会设置为当前配置文件。

其次,我不确定它是否有任何不同,但改变

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

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

可能有帮助。

此外,为了完成,仅在 onCurrentProfileChanged 中请求电子邮件(在这种情况下调用 requestUserEmail() 函数)就足够了

关于android - Facebook SDK : Why does Profile. getCurrentProfile() 总是第一次返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30425442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com