我正在尝试使用Firebase身份验证添加用户,并将displayName返回为null,即使它在注册时通过UI请求它。任何想法为什么以及如何解决?这是我用来执行此操作的代码:
startActivityForResult( AuthUI.getInstance()
.createSignInIntentBuilder()
.setProviders(Collections.singletonList(new AuthUI.IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build()))
.build(), RC_SIGN_IN);
并在结果活动....
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
// user is signed in!
//save user
saveUser();
startMainActivity();
return;
}
保存用户代码如下:
private void saveUser(){
FirebaseUser fUser = FirebaseAuth.getInstance().getCurrentUser();
final User user = new User();
if (fUser.getDisplayName() != null) {
user.setUserName(fUser.getDisplayName());
} else {
Log.e("FB_info", "User has no display name");
}
user.setUserEmail(fUser.getEmail());
final DatabaseReference userRef = FirebaseDatabase.getInstance().getReference(FirebaseRefs.getUsersRef()).child(fUser.getUid());
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(!dataSnapshot.exists()){
userRef.updateChildren(user.toMap());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
知道为什么显示名称返回null?
答案 0 :(得分:4)
所以这似乎是Firebase本身(现在已知)的错误(不是Firebase-UI)。该错误似乎是在版本Firebase Android SDK v9.8.0
中引入的。目前,解决方法之一是强制用户在注册系统后注销并重新登录。另一个涉及将FirebaseUI降级到使用旧版Firebase SDK版本的版本。
资料来源:https://github.com/firebase/FirebaseUI-Android/issues/409
答案 1 :(得分:0)
您还可以从firebaseAuthWithGoogle方法获取名称。
private void firebaseAuthWithGoogle(final GoogleSignInAccount acct) {
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()) {
Toast.makeText(MainActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
} else {
System.out.println(acct.getDisplayName());
System.out.println(acct.getPhotoUrl());
}
}
}); }