我有双向登录方式,一种是正常 Google登录,另一种是匿名登录。在我的谷歌登录没有问题,一切正常,即使用户的凭据也很好,包括姓名,电子邮件和firebase ID。 现在的问题是,当我使用firebase将我的匿名帐户链接到google id时,它也正常工作,但在获取凭据时,我收到的所有内容在调用 getDisplayName()时为空。
注意:我正在获取firebase ID并正确发送电子邮件,但名称无效。
这是我的日志输出:
11-15 12:58:26.712 21983-21983/in.pinelane.myhovi E/userName: null
11-15 12:58:26.712 21983-21983/in.pinelane.myhovi E/userEmail: xyz@gmail.com
由于我的代码工作正常但仍然没有运气,代码如下:
private void linkGuestWithCredential(AuthCredential credentials) {
firebaseAuth.getCurrentUser().linkWithCredential(credentials)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if( task.isSuccessful()){
mProgress.dismiss();
Log.d(TAG, "linkWithCredential:success");
FirebaseUser permanentUser = task.getResult().getUser();
callAnonymousUpdateApi(permanentUser);
Intent signIntent = new Intent(LoginActivity.this, MainActivity.class);
signIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(signIntent);
Toast.makeText(LoginActivity.this, "Welcome to MyHovi!", Toast.LENGTH_LONG)
.show();
finish();
overridePendingTransition(R.anim.right_enter, R.anim.left_exit);
}else{
mProgress.dismiss();
Log.e(TAG, "linkWithCredential:failure", task.getException());
Toast.makeText(getApplicationContext(), "Sign-in failed", Toast.LENGTH_SHORT)
.show();
}
}
});
在 callAnonymousUpdateApi(permanentUSer)中,我实际上是在获取凭据:
private void callAnonymousUpdateApi(FirebaseUser permanentUser) {
final String name = permanentUser.getDisplayName();
final String email = permanentUser.getEmail();
final String firebaseId = permanentUser.getUid();
RequestParams params = new RequestParams();
params.add("user_id", userId);
params.add("name", name);
params.add("email", email);
params.add("firebase_id", firebaseId);
params.add("user_complete", "true");
}
到目前为止我尝试的是:
将FirebseUser permanentUSer = task.getResult().getUser();
更改为FirebseUser permanentUSer = FirebaseAuth.getInstance().getCurrentUser();
在callAnonymousUpdateApi(FirebaseUser permanentUser)中以不同的方式尝试了同样的事情我所做的就是尝试将名称设为final String name = FirebaseAuth.getInstance().getCurrentUser().getDisplayName();
但仍然没有运气,任何帮助都将受到高度赞赏。感谢
答案 0 :(得分:2)
链接提供者时,提供者的displayName和photoURL不会自动复制到顶级。您可以在链接到匿名用户时简单地复制这些字段。您可以获取Google displayName:
FirebaseAuth.getInstance().getCurrentUser().getProviderData().get(0).getDisplayName()
然后你会更新档案:
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder().setDisplayName(displayName).build();
user.updateProfile(profileUpdates)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Log.d(TAG, "User profile updated.");
}
}
}
});
答案 1 :(得分:0)
我知道这是一个老问题,但只是为有相同问题的人提供答案:
Bojeil的回答:FirebaseAuth.getInstance().getCurrentUser().getProviderData().get(0).getDisplayName()
是正确的!但是,他正在使用getDisplayName()
为第一个提供程序获取get(0)
,您需要做的是检查所需的提供程序ID,并混合其显示名称,否则将抛出一个更简单的解决方案他们所有人都像这样检查getDisplayName() != null
:
String displayName = "";
for (UserInfo userInfo : firebaseAuth.getCurrentUser().getProviderData()) {
if (userInfo.getDisplayName() != null) {
displayName = userInfo.getDisplayName();
break;
}
}
有关更多详细信息,请参考此document: