我正在使用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,人们似乎有更多的运气。
我在这里做错了什么?我需要做些什么来确保我在第一时间获得个人资料信息?
答案 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
功能)就足够了