我正在使用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
函数)就足够了